1.四次挥手
第一次挥手:A的应用进程先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。报文段的内容为:首部终止控制位FIN=1,序号seq=u(前面传输的数据最后一个字节的序号+1),A进入FIN-WAIT-1状态,等待B的确认。FIN不携带数据也会消耗一个序号。
第二次挥手:B在收到连接释放报文段后立即发送确认报文段,内容为:ACK=1,ack=u+1,seq=v(前面传输的数据最后一个字节的序号+1)。然后B就进入CLOSE-WAIT状态。此时A到B这个方向的连接就释放了,这时TCP处于半关闭状态,即A没有数据要发送了,但B到A的连接还没断开,一段时间内,B还可能有数据发送给A。A收到B的ACK后进入FIN-WAIT-2状态,等待B发送连接释放报文。
第三次挥手:若B已无数据要向A发送,则其应用程序就通知TCP释放连接。这时,B发送连接释放报文段,内容为:FIN=1,ACK=1,seq=w(前面传输的数据最后一个字节的序号+1),ack=u+1。此时,B进入最终状态LAST-ACK,等待A的确认。
第四次挥手:A收到B的FIN之后,发送确认报文段,内容为:ACK=1,seq=u+1,ack=w+1。并进入TIME-WAIT状态,此时TCP连接还未释放,必须经过时间等待器设置的时间2MSL(最长报文段寿命)后,A才能进入CLOSED状态,然后撤销TCB,释放连接。
2.为什么TIME-WAIT必须等待2MSL的时间
- 为了保证A发送的最后一个ACK报文段可以到达B。这个ACK报文段可能会丢失,使得B无法收到确认。B会进行超时重传FIN+ACK报文段。A就能在2MSL(超时+2MSL传输)收到这个重传的ACK,然后A重传一次确认,并重启计时器。最后A和B都进入CLOSED状态。否则可能导致B无法收到确认,从而无法正常进入CLOSED状态。
- 防止已经失效的请求连接出现在本连接中。A在发送完最后一个ACK报文段之后,再经过2MSL就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。
3.为什么第二次跟第三次不能合并,第二次和第三次的等待是什么
当服务器在进行第二次挥手的时候,客户端不会再向服务器发送数据,但是服务器可能还在向客户端发送数据,所有服务端会等待一段时间把未传输完的数据传输完毕再发送关闭请求。
4. 保活计时器的作用
除了等待计时器外,TCP还有一个保活计时器。设想:客户已主动与服务器建立TCP连接。后来客户端发生故障,这时就需要有保活计时器来使得服务器不需要白白的等待。 服务器每收到一次客户端的数据就重置保护计时器,时间设置通常是2个小时。若两个小时都没有收到客户端的数据,服务端就发送一个探测报文段,以后每隔75秒发送一次。若连续发送10个后任无客户端响应,就关闭连接。
|