1. HTTP基本介绍
HTTP协议:是种超文本传输协议(请求/响应协议)。它是建立在TCP上无状态单向链接协议(属于TCP/IP协议族中一员)。它规定客户端发送什么样的数据给服务器端(HTTP请求),并且服务器端需要返回什么样的数据(HTTP响应);注意一个完整的HTTP请求/响应,并不只是通过HTTP协议来实现的。而是由多个协议相互协作实现的;
- HTTP请求/响应
- HTTP握手和挥手
- 网络TCP/IP分层模型
- HTTP版本发展史
1. HTTP请求和响应
HTTP请求是由客户端发起的动作,告诉服务器需要什么数据。这一过程称之为HTTP请求。服务器接收到HTTP请求后,作出相应的处理,返回HTTP请求所需要的数据。这一过程称之为响应;如图所示:
不管是HTTP请求/响应,它们的结构一般分为3层。请求行/响应行、请求头/响应头、请求主体/响应主体。这3层结构组成统称为请求/响应报文;
HTTP请求结构:
1. 请求行:主要由请求方式GET/POST/PUT等、对应的URL地址,HTTP协议和协议版本组成;
2. 请求头:主要由若干属性组成,包含用户代理、cookie等用户信息;
3. 请求主体:主要是给服务器端发送的数据。
HTTP响应结构:
1. 响应行:HTTP协议、协议版本、状态码和状态描述组成;
2. 响应头:主要由若干属性组成,包含数据类型(content-type)、数据长度(content-length)等信息;
3. 响应主体:主要反馈给客户端的数据信息(JSON数据、图片、音频等数据);
2. HTTP的握手和挥手
每个完整的HTTP请求,客户端都会发起3次握手和4次挥手动作。3次握手是发生在HTTP连接建立阶段;4次挥手发生在HTTP连接断开阶段;如图所示:
1. 3次握手:
第一次握手:客户端在TCP中准备SYN标志位1,并初始化序号为X发送给服务器端;
第二次握手:服务器端接收到客户端的报文,就准备确认包(ACK)应答。ACK和SYN标志位都为1,同时初始化序号Y,将客户端的发送序号置于X+1。响应给客户端;
第三次握手:客户端接收到服务器响应,将服务器序号Y+1,准备确认包(ACK)应答(ACK标志位1,SYN标志位0),同时发送序号Z给服务器端做最后的确认,并建立链接;
2. 4次挥手:
第一次挥手:客户端发送一个FIN,用来关闭服务端到Server的数据传送,客户端进入FIN_WAIT_1状态。
第二次挥手:服务端 收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态
第三次挥手:服务端发送一个FIN,用来关闭Server到Client的数据传送,服务端进入LAST_ACK状态。
第四次挥手:客服端收到FIN后,服务端进入TIME_WAIT状态,接着发送一个ACK给服务端,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
总结过程:客户端发送HTTP请求时,会经过3次握手阶段确认连接的建立,连接建立成功后,就开始传递数据并获取服务器的响应。接收响应结束后,又会经过4次挥手阶段,确认连接的断开;
好比我们需要去朋友那拿点东西,先打电话过去确认朋友在不在家,如果朋友在家,我们再过去拿东西(这样就可以避免朋友不在家,白跑一趟)。拿到东西后,就告诉朋友不需要再拿东西。朋友知道后就会做其他事情了。不用等着我们了;
通过该过程可知HTTP请求对于服务器端属于被动的,它不能主动发送任何数据给客户端,它必须等待客户端请求才能做出相应的反馈。同时HTTP又是无状态的,服务器端不知道客户端是不是第N次访问。
3. 网络TCP/IP分层模型
网络模型中有OSI七层模型和TCP/IP四层模型。由于OSI模型过于复杂,在网络中只做理论参考,实际应用场景中,TCP/IP模型应用广泛,已经成为互联网的实施标准。所以这里直接上TCP/IP模型;如下图所示:
|
|
|
|
| |
| |
|
|
|
|
|
|
|
(来自:https://blog.csdn.net/xuedan1992/article/details/80958522)
- 应用层:该层更加协议不同决定提供用户不同的应用服务。例如FTP文件传输协议提供文件上传/下载功能;HTTP超文本协议,提供对多种不同类型网络数据的访问;
- 传输层:为应用层提供端到端的通信,保证了数据包的顺序性和完整性的传输;
- 网络层:将用户传输的数据进行整理成数据包,以数据包的形式在网络中传输;
- 数据链路层:将物理层的数据比特流封装成帧,控制帧在物理信道上的传输,包括纠错,调节发送速率等。另外还提供了两个主机之间数据链路的建立,维持和释放的管理工作;
4. HTTP版本发展史
1. HTTP 0.9版本:这一阶段的HTTP提供的功能及其有限。在这一版本只能使用GET方式请求,然后请求完毕之后立即关闭连接。
2. HTTP 1.0版本:该版本新增HEAD和POST请求方式,还支持多种不同的数据类型,不再局限于文本;同时新增了状态码概念,用来标记报错原因;但是该版本只能串行发送请求,不能多个请求同时发送,并且不支持keepalive;
3. HTTP 1.1版本:这一版本利用管道技术实现多请求同时发送(支持并行请求),同时还支持keepAlive,减少了握手/挥手次数,提高了服务器性能;该版本也是目前主流版本;
4. HTTP 2.0版本:该版本支持真正意义上的并行请求,同时支持双全工通信。也就是服务器端也可以主动发送数据给客户端。不再是被动发送了。
5.补充说明
-
管道技术:可以将多个HTTP请求统一放置一个TCP中发送,不用等待前一个HTTP响应之后再发送。但是对于单进程I/O模型来说,这种方式并没有优化HTTP请求。虽然管道技术实现了并行HTTP请求,但是响应结果还是按照发送HTTP请求的顺序来接收的;
-
keepAlive介绍:在这分为TCP keepAlive和HTTP keepAlive这两种。
- TCP keepAlive是为了检测链接的可用性;主要参数如下:
tcp_keepalive_time // 距离上次传送数据多少时间未收到判断为开始检测
tcp_keepalive_intvl // 检测开始每多少时间发送心跳包
tcp_keepalive_probes // 发送几次心跳包对方未响应则close连接
当经过3次握手建立链接之后,如果客户端关闭,服务器未收到反馈,就会发送空心跳包去检查链接是否可用。如果不可用就关闭连接;
- HTTP keepAlive是为了告诉服务器HTTP请求完之后不要关闭连接,因为在4次挥手之后服务器会首先关闭连接。,以减少3次握手和4次挥手次数,提高HTTP请求效率。