TCP四次挥手

之前分析了TCP的在客户端和服务端建立连接时的三次握手,那么顺便也学习下TCP的四次挥手吧!

图是从百度百科上拿来的,感觉很详细。

我们就直接开始分析通信过程吧!

第一次挥手:当客户端已经不需要向服务端发送数据时(即请求断开连接),客户端先发送一个FIN(FIN=1,seq=u)给服务端,来告诉服务端它已经完成了想要的通信,并请求断开连接,此时客户端处于FIN-WAIT状态。

第二次挥手:客户端收到了服务端的FIN包,然后它给客户端返回一个ACK(FIN=1,ACK=1,Seq=w,ack=u+1)包,来告诉客户端它已经收到了断开连接的请求,此时服务端处于CLOSE-WAIT,客户端收到服务端的ACK包后处于FIN-WAIT-2的状态。

第三次挥手:由于此时服务端还是处于CLOSE-WAIT(等待关闭)的状态,所以服务端发送一个FIN+ACK(FIN=1,ACK=1,Seq=w,ack=u+1)包给客户端,服务器要关闭和客户端的连接,然后服务端置于LAST-ACK状态。

第四次挥手:客户端收到服务端的FIN包,确认无误后,给服务端发送一个ACK(ACK=1,Seq=u+1,ack=w+1)包来告知服务端,客户端已经收到了服务端的关闭连接的请求,然后把客户端置于TIME-WAIT状态,服务端收到客户端的ACK包后,关闭连接。客户端在等待2MSL之后未收到服务端的请求后,会认为服务端收到了客户端的确认关闭的ACK包,并关闭连接。

 

以下列举几个有用的知识点:

 什么是2MSL?

MSL即Maximum Segment Lifetime,也就是报文最大生存时间,引用《TCP/IP详解》中的话:“它(MSL)是任何报文段被丢弃前在网络内的最长时间。”那么,2MSL也就是这个时间的2倍。其实我觉得没必要把这个MSL的确切含义搞明白,你所需要明白的是,当TCP连接完成四个报文段的交换时,主动关闭的一方将继续等待一定时间(2-4分钟),即使两端的应用程序结束

 为什么需要2MSL?

1、为了保证客户端发送的最后一个ACK报文段能够到达服务端。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的服务端收不到对已发送的FIN +ACK报文段的确认。服务端会超时重传这个FIN+ACK报文段,而客户端就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着客户端重传一次确认包。

2、就是防止之前已失效的连接请求报文段出现在本连接中,客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值