三次挥手?说好的四次挥手呢?(顺带解释三次握手和四次挥手)

Posted milaiko

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三次挥手?说好的四次挥手呢?(顺带解释三次握手和四次挥手)相关的知识,希望对你有一定的参考价值。

问题来源

某日摸鱼的时候,用wireshark抓包。诶嘿,发现只有三次挥手过程,但教科书上都说是三次握手和四次挥手的。那么这就来解释一下这种现象。

在解释这个现象之前,大致简述三次握手和四次挥手,有基础的同学直接跳过。

三次握手和四次挥手基础

1、三次握手

注:SYN是同步序列编号(Synchronize Sequence Numbers)

这里先关注发起方的状态

  • 主动发起连接方会发送syn给接收方,其中500是主动方的syn编号。发送后发起方的状态从close变为syn_send。

  • 接收方收到syn后,发送ack和syn。其中 ack是针对发起方的syn编号变的,因此为500+1。而700是接受方的syn编号

  • 发起方接收到对方的ack后,立即发送ack表示确认,在发送ack之前,发起方的状态为syn_send;发送后,发起方的状态变为establish。表示建立其可靠的数据通信。

    这里是接受方(被动发起连接方)的状态变化

  • 程序启动后,接受方的状态从close变为listen(监听状态)

  • 当接受到发送方的syn后,接受方的状态从listen变为了syn_rcvd,就是接受到了syn信号的意思

  • 当接受到发送方的ack时,从syn_rcvd变为了establish,这表示已经建立好了可靠的数据通信。

2、四次挥手

主动关闭方

  • 在关闭之前,主动关闭方的状态处于已经建立可靠数据通信的状态——establish
  • 主动关闭方发出来FIN报文给被动关闭方(接收方), 进入finish_wait1状态,并等待接收方发送ack报文。
  • 当主动关闭方收到了ack报文后从finish_wait1进入finish_wait2。并等待被动关闭方发送FIN报文
  • 当接收到被动关闭方的FIN报文后,主动关闭方进入了time_wait状态,注意这里并没直接进入close状态。
  • 只有当主动关闭方过了2MSL时长后,才进入close状态。

被动关闭方

  • 在接收到主动关闭方的FIN报文之前,被动关闭方处于establish状态
  • 接受到FIN报文后,被动关闭方发送ack报文,在发送了ack报文后进入了close_wait状态。
  • 被动关闭方发送FIN报文后,从close_wait状态进入last_ack状态,等待主动关闭方发送ack报文
  • 接收到ack报文后,进入close状态, 终于关闭。

为什么wireshark观测的只有三次挥手(直接跳这里)

四次挥手中,两个方向的断开是独立的,每个方向发送一个FIN,对方回复一个ACK。同时TCP规定ACK可以捎带在其他数据包中。

所以主动关闭方本应该收到的四个数据报,其中ACK被FIN数据报捎带了,这样就从4个变成了3个。但其实这种情况很少见,典型的是被动关闭方还有数据要发送,于是乎ack就从被那个数据报给捎带了,然后继续处理数据(主动关闭方仍然会处理这些数据,直到被动关闭方发送完,并发送ack报文,主动方收到了ack为止)。

以上是关于三次挥手?说好的四次挥手呢?(顺带解释三次握手和四次挥手)的主要内容,如果未能解决你的问题,请参考以下文章

三次握手和四次挥手

TCP协议的三次握手和四次挥手

TCP三次握手和四次挥手

tcp协议的三次握手和四次挥手

揭秘——TCP的三次握手和四次挥手

TCP三次握手和四次挥手过程