标签:传输 初始 实现 长度 限制 释放 告诉 被占用 com
第一次握手:客户端A向服务端B发送一个SYN=1链接请求,以及一个初始序列号seq=x,并进入SYN_SEND状态,等待服务器B确认。
第二次握手:服务端B接收到客户端A发来的SYN=1链接请求,并进行确认ack=x+1,即告诉客户端A我可以接收你接下来发送序列号为x+1的消息。同时服务器B也会向客户端A发送一个syn链接请求,以及一个初始化序列号seq=y,此时服务器B进入SYN_RECV状态。
第三次握手:客户端A接收到服务器发送的syn+ack确认包,向服务器B发送一个ack=y+1的确认包,即告诉服务器B我已经准备好接收你发送的序列号为y+1的数据。此时连接建立。
TCP协议是全双工通信,双方均可进行关闭操作。
第一次挥手:客户端A主动发起关闭请求,给服务端B发送一个Fin=1关闭请求,以及一个初始序列号seq=u,此时客户端A进入FIN-WAIT-1状态。注:seq=u-1的消息是客户端A发送出的最后一个字节的序列号。
第二次挥手:服务端B收到客户端A发来的Fin关闭请求后,给客户端A回复一个ACK=1,ack=u+1的确认报文,并携带上自己的序列号seq=v,服务端B就进入了CLOSE-WAIT(关闭等待)状态。ACK是确认好是否有效的标识,一般设置为1。
客户端A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。(在这之前可能还需要接受服务器发送的最后的数据)。
第三次挥手:服务器很可能又发送了一些数据,假定此时的序列号为seq=w,服务端B数据发送完毕后,服务器B向客户端A发送连接释放报文,内容包括:FIN=1,ACK=1,ack=u+1,seq=w,此时服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
第四次挥手:客户端A接收到服务器发送的连接释放报文后,给服务端B回复ACK=1,ack=w+1的确认报文,而自己的序列号是u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。此时,TCP连接还没有释放,需要等待2*MSL(最大报文段生存时间)时间后,若该时间段内没有服务器B的重发请求的话,客户端A就进入CLOSED状态,并撤销TCB。当服务器B收到确认应答后,也便进入CLOSED状态,撤销TCB。
TCB 是传输控制模块的缩写,是某个TCP连接中保存通讯双方特征信息的一个结构体。
MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值,即最大报文段生存时间。
第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
因为当服务器确认客户端断开请求之后,服务端可能还有数据需要发送,所以要等数据发送完毕之后,服务端再发送断开连接请求。需要等待消息完全发送完毕,所以挥手多了一次。
标签:传输 初始 实现 长度 限制 释放 告诉 被占用 com
原文地址:https://www.cnblogs.com/liuweida/p/11788062.html