四次挥手

本文大致上是对三次握手和四次挥手详细这篇文章的复述,文中出现的图片如未特殊说明,也均出自于该文章,本文仅用于个人学习记录,侵删。

四次挥手过程

  • 第一次挥手
    客户端向服务端发出连接释放报文段(FIN=1),并停止再发送数据,设置其序列号为seq=u,它等于前面已传过的数据的最后一个字节的序号加1。这时客户端进入FIN-WAIT-1(终止等待1)状态,等待服务端的确认。
  • 第二次挥手
    服务端收到连接释放报文段后,发送确认报文,确认号ack=u+1,ACK=1,其序列号seq=v,同样的,它等于服务端前面已经传过数据的最后一个字节的序号加1。然后服务端进入CLOSE-WAIT(关闭等待)状态。这时候TCP连接处于半关闭状态(即此时客户端已经没有数据要发送了,但服务端可能还有数据要传送,客户端仍要接受)。
    客户端收到来自于服务端的确认后,就进入了FIN_WAIT-2(终止等待2)状态。
  • 第三次挥手
    如果服务端已经没有数据传输了,就发送连接释放报文段,FIN=1,ACK=1,其序列号seq=w(服务端前面已经传过数据的最后一个字节的序号加1),确认号仍为ack=u+1。服务器进入LAST-ACK(最后确认)状态。
  • 第四次挥手
    客户端收到连接释放报文段后,发送确认报文段。在确认报文段中,ACK=1,确认好ack=w+1,序列号seq=u+1。客户端进入TIME-WAIT(时间等待)状态。这时TCP连接还没有释放掉,客户端再等待2MSL(报文最大生存时间),之后进入CLOSED状态。
    在这里插入图片描述
为什么客户端要在TIME-WAIT状态必须等待2MSL的状态

1.为了保证客户端发送的最后一个ACK报文段能够到达服务器。在这个报文丢失的情况下,服务器收不到该报文,会超时重传(重新进行第三次挥手),接着客户端重新进行第四次挥手,重启时间等待计时器。如果不等待2MSL的话,一旦最后一个ACK报文丢失,服务器就无法正常关闭。
2.他还可以防止已失效的报文段。客户端在发送最后一个ACK之后,再经过经过2MSL(报文段最大存货时间的两倍),就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。

为什么连接的时候需要三次,而断开的时候需要四次?

这是由于TCP的半关闭造成的,因为TCP连接是全双工的(数据可在两个方向上同时传递)。所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭。关闭的方法是一方完成它的数据传输后,就发送一个FIN来向另一方通告将要终止这个方向的连接,收到这个FIN表示这个方向上再没有数据流动,但是收到FIN的那一端仍然可以发送数据。但在发生这个过程以后,服务端可能需要继续发送数据(这个阶段是close_wait),在服务端也确保需要关闭的时候,服务端再发送FIN,尝试去关闭。

参考文章

三次握手和四次挥手详细
一文读懂一个URL请求的过程是怎样的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值