Http协议的交互流程

HTTP协议的交互过程

在这里插入图片描述
其中在客户端与服务器之间建立连接是经历了三次握手的过程,而在服务器与客户端之间关闭连接是建立了四次分手的过程

建立连接过程中的三次握手

在这里插入图片描述
第一次握手
当客户端想与服务器建立连接的时候,会发送一个请求连接的报文,此报文首部中的SYN=1(PS:TCP规定,SYN = 1的报文段不能携带数据,并且需要消耗一个序号),同时随机生成初始序列号seq=x,客户端进入了SYN-SENT(同步以发送状态)。

第二次握手
服务器接收到客户端发送的连接请求报文后,如果同意连接,则发出确认报文,其中确认报文段中SYN=1,ACK=1,同时随机初始化一个序列号seq=y,确认号ack=x+1,而且服务器也进入SYN_RCVD(同步接收状态);

第三次握手
客户端接收到确认报文后,还需要向服务器发出确认报文。确认报文的ACK=1,ack=y+1,此时,TCP连接建立成功,客户端进入ESTABLISHED(已建立连接)状态。


三次握手的重要性:
当客户端发送第一个请求连接的报文的时候,由于网络阻塞原因,导致服务端不能及时收到,直到某个时间刻才收到请求连接的报文,此时此刻服务器收到的已经是一个失效的报文了,服务器给客户端发送确认报文,等待客户端的连接,假设采用的是两次握手,客户端不理睬服务器发送的确认报文,而服务器一直等待接收客户端的请求,这样导致服务器很多资源浪费,而如果采用三次握手,服务器接收不到客户端的确认报文,就会断开与客户端的连接,因此采用三次握手更为合适。


关闭连接时的四次分手

在这里插入图片描述
第一次分手:
客户端向服务器发出连接释放报文(PS:释放报文的首部为FIN=1,序列号为seq=u,不携带数据,也要消耗一个序号),并且停止发送数据,此时,客户端进入FIN-WAIT-1(终止等待1)状态

第二次分手:
服务器接收到释放报文后,发出确认报文(ACK=1,ack=u+1,序列号为seq=v),服务器就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器会通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

第三次分手:
服务器向客户端发出连接释放报文(PS:释放报文的首部为FIN=1,ack=u+1,序列号为seq=w),服务器就进入了LAST-ACK(最后确认)状态,等待客户端发送确认报文。

第四次分手:
客户端收到服务器的连接释放报文后,发出确认报文(PS:ACK=1,ack=w+1,序列号为seq=u+1),此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。

四次握手的重要性
TCP是全双工的,每个方向都需要单独断开,而且每次的断开都需要确认一次,所以为4次,为了确保数据能够完成传输。在客户端发送FIN报文通知时,只能说明客户端没有数据发送给服务器了,可能还存在着服务器的数据还没完全发送给客户端,所以也未必马上关闭连接,此时服务器可以发送ACK报文告诉客户端成功接收到FIN报文,等所有数据都发送给客户端后,才发送FIN给客户端。

为什么客户端最后还要等待2MSL?
1、保证客户端发送的最后一个ACK报文能够到达服务器,因为存在ACK报文丢失的情况,服务器已经发送了FIN+ACK报文请求断开了,客户端没有回应,服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

2、客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,防止新的连接中出现旧连接的请求报文。

客户端突然挂掉了怎么办?
在服务器端设置保活计时器,每当服务器收到客户端的消息,就将计时器复位。根据服务器的业务需求,设置一个超时时间。若服务器超过特定时间没收到客户的信息,服务器就会发送探测报文段。若还是没有接收到客户端的响应,就终止该连接。

发布了16 篇原创文章 · 获赞 0 · 访问量 48

猜你喜欢

转载自blog.csdn.net/weixin_44943485/article/details/105023522
今日推荐