HTTP详解 (2)

了解了TCP包头信息之后,我们就可以正式看看TCP建立连接的三次握手了。

在这里插入图片描述


三次握手讲解:

客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:我要连接你)

服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:好的,你来连吧)

客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则连接建立成功。(客户端:好的,我来了)

面试官:为什么http建立连接需要三次握手,不是两次或四次
答:三次是最少的安全次数,两次不安全,四次浪费资源

四、客户端请求

客户端与服务器连接上了之后,客户端就可以开始向服务器请求资源,就可以开始发送HTTP请求了。

1.HTTP请求报文结构

我们之前说过TCP报文包=TCP头信息+TCP数据体,TCP头信息我们已经讲了,现在来讲TCP数据体,也就是我们的HTTP请求报文

在这里插入图片描述

2.HTTP请求实例

来看看实际的HTTP请求例子:

在这里插入图片描述

①是请求方法,HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT

②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL

③是协议名称及版本号

④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息

⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。

请求头参数非常多,猪哥就不一一说明,只说明两个低级的反扒参数:

User-Agent:客户端使用的操作系统和浏览器的名称和版本,有些网站会限制请求浏览器

Referer:先前网页的地址,表示此请求来自哪里,有些网站会限制请求来源

五、服务端响应

服务器在收到客户端请求处理完需要响应并返回给客户端,而HTTP响应报文结构与请求结构体一致。

1.HTTP响应报文结构

在这里插入图片描述

2.HTTP响应实例

在这里插入图片描述

3.响应状态码

响应报文中我们重点关注下:服务器的响应状态码,面试也很容易问到,下面猪哥只列出分类,详细状态码自行上网查找了解。

在这里插入图片描述

六、断开连接

在服务器响应完毕后,一次会话就结束了,请问这时候连接会断开吗?

1.长短连接

是否断开我们需要区分HTTP版本:

在HTTP/1.0版本的时候,客户端与服务器完成一个请求/响应之后,会将之前建立的TCP连接断开,下次请求的时候又要重新建立TCP连接,这也被称为短连接

在HTTP1.0发布仅半年后(1997年1月) ,HTTP/1.1版本发布并带来一个新的功能:在客户端与服务器完成一次请求/响应之后,允许不断开TCP连接,这意味着下次请求就直接使用这个TCP连接而不再需要重新握手建立新连接,这也被称为长连接

注意:长连接是指一次TCP连接允许多次HTTP会话,HTTP永远都是一次请求/响应,会话结束,HTTP本身不存在长连接之说。

早在1999年HTTP1.1就推广普及,所以现在浏览器在请求时请求头中都会携带一个参数:Connection:keep-alive,这表示浏览器要求与服务器建立长连接,而服务器也可以设置是否愿意建立长连接。

2.长连接优缺点

对于服务器来说建立长连接有优点也有缺点:

优点:当网站中有大量静态资源(图片、css、js等)就可以开启长连接,这也几张图片就可以通过一次TCP连接发送。

缺点:当客户端请求一次时候不在请求,而服务器却开着长连接资源被占用着,这是严重浪费资源。

所以是否开启长连接,长连接时间都需要根据网站自身来合理设置。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfjjw.html