三次挥手?说好的四次挥手呢?(顺带解释三次握手和四次挥手)
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为止)。
以上是关于三次挥手?说好的四次挥手呢?(顺带解释三次握手和四次挥手)的主要内容,如果未能解决你的问题,请参考以下文章