HTTP协议(2)----->连接管理
1. TCP连接
1.1 TCP为HTTP提供了一条可靠的比特传输管道。
TCP(Transmission Control Protocol)----传输控制协议,是主机对主机层的传输控制协议,提供可靠的连接服务。 TCP的数据是通过名为IP分组(或IP数据报)的小数据块来发送的。HTTP/HTTPS网络协议栈如下所示:
- HTTP收到一条报文时,报文数据内容转化为流的形式;
- 数据流通过一条打开的TCP连接按顺序传输;
- TCP收到数据流,将数据流砍成为被称作为段的小数据块;
- 将小数据块封装的IP之中;
- 通过英特网完成传输;
TCP段都是由IP分组承载(下图表示为TCP某段的参数),从一个IP地址发到另外一个IP地址。每一个IP分组中都包括:
- 一个IP分组首部(通常20字节)--->包含源和目的的IP地址、长度、其他的标记;
- 一个TCP段首部(通常20字节)--->包含TCP端口号、TCP控制标记、数据排序和完整性检查的数字值;
- 一个TCP数据块(0个或者多个字节)--->要传送的报文数据流;
TCP段#x
TCP的连接通过四个值来识别:
<源IP地址 、 源端口号 、 目的IP地址 、 目的端口号>
TCP分段传输示意如下:
1.2 TCP套接字编程
伪代码说明通过套接字API,客户端和服务器实现HTTP事务时执行的步骤:
1.3 TCP三次握手四次挥手(划重点!!!)
要知道!!! 什么是三次握手,为什么不是两次?什么是四次挥手?第二三次挥手为什么不合并呢?
先说说TCP的标志位,有6种标示:
- SYN(synchronous建立联机)
- ACK(acknowledgement 确认)
- PSH(push传送)
- FIN(finish结束)
- RST(reset重置)
- URG(urgent紧急)
三次握手,数据传输,四次挥手图:
那为什么需要三次握手呢?基于上图所示,如下的过程:
- 客户端C向服务器S发起建立连接请求:C——>S;
- 客户端C收到服务器S的发送信号,并且向客户端C发送确认信息:S——>C;
- 客户端C收到服务器S的确认信号,并向S发送确认信号:C——>S。
三次握手大概就是这么个过程:
- 通过第一次握手,服务器S知道客户端C能发送数据。
- 通过第二次握手,客户端C知道服务器S能收、能发送数据。
- 结合第三次握手,服务器S知道客户端C能够接收数据。
至此,完成了握手过程,客户端C知道能服务器S能收能发,服务器S知道客户端C能收能发,通信连接至此建立。
两个要点:(要知道!!!)
- 三次握手的完成,只是一个客户端C和服务器S是否能够相互建立连接的确认过程,还没有进行真正数据块儿的传输,数据块的传输是在三次握手完成之后的事情;
- 采用两次握手可能会出现失效情况,客户端发出的连接请求没有收到服务器的确认(没有第二次握手),于是经过一段时间后,客户端又重新向服务器发送新的连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,客户端第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到服务器,服务器以为是客户端又发起的新连接,于是服务器同意连接,并向客户端发回确认,但是此时客户端根本不会理会,服务器就一直在等待客户端发送数据,导致服务器的资源浪费。三次握手是保证可靠的最小握手次数,再多次握手也不能提高通信成功的概率,反而浪费资源。
四次挥手,结合上图,请看如下过程:
- 客户端C向服务器S发起请求,表示客户端C没有数据要发送了:C——>S;
- 服务器S向客户端C发送信号,确认客户端C的断开请求:S——>C;
- 服务器S向客户端C发送信号,请求断开连接,表示服务器S没有数据要发送了:S——>C;
- 客户端C向服务器S发送确认信号,同意断开:C——>S。
服务器S收到确认信号,断开连接,而客户端在一段时间内没收到服务器的信号,表明服务器S已经断开了,于是客户端C也断开了连接。至此,完成挥手过程。
为什么需要四次挥手,第二第三次挥手能合并哇???
当然不可以!挥手和握手相似,确认断开过程,但是,挥手要多一个确认数据的断开,不仅仅是确认连接的断开,所以要比握手多一次。握手---->连接的建立;挥手---->连接的断开+数据的断开(多一次)。
努力成为一个有情怀的程序员~