在之前的博客中,我叙述了3次握手为什么是3次。 那么,我现在介绍一下挥手4次。 众所周知,TCP是全双工的,但在建立连接的三次握手中,SYN与ACK一起发送。 这里产生疑问。 为什么挥手4次时没有一起发送SYN和ACK呢? 如果你拿着这个问题往下看,答案就在其中。
说到挥手4次,正如名字所示,关闭连接时双方一共操作4次。 看看这四次是怎么操作的。
从图中可以看出,挥手4次时双方共进入6种状态。 这六种状态是理解挥手四次的关键。 看看吧
4挥手的状态FIN_WAIT_1:这一状态和FIN_WAIT_2这一状态正在等待对方的答复,但这两种状态有区别。FIN_WAIT_1就是主动方在ESTABLISHED状态的时候,想要主动关闭连接,向对方发送FIN报文,这时候就进入了FIN_WAIT_1状态。当他收到对方回复的ACK报文后,就进入了FIN_WAIT_2状态。但是因为在实际操作中,对方很难遇到FIN_WAIT_1这一状态
FIN_WAIT_2:已经对FIN_WAIT_2进行了说明,如果主动侧进入FIN_WAIT_2,则表示半连接状态,即主动侧还有数据。 此数据是随后的ACK,所有稍后关闭连接。
CLOSE_WAIT :这种状态从表面也可以看出其作用。 就是等待关机。当被动方接收到FIN时,会立刻回复一个ACK给对方,接下来就是进入CLOSE_WAIT状态。在这个状态中,被动方需要考虑自己还有没有数据要发送给对方,如果有可以继续发送,如果没有了就可以关闭连接了,发送一个FIN给对方。此状态实际上是给定缓冲时间,处理需要处理的事情,然后关闭连接。
TIME_WAIT :这种状态是过一段时间再执行一些操作。 主动方接收到对方的FIN消息,发送ACK消息后,剩下的等待2MSL进入关闭状态。 实际上,如果活动端处于FIN_WAIT_1状态,并从对方的FIN ACK标志收到消息,则可以跳过FIN_WAIT_2状态,直接进入TIME_WAIT状态。
LAST_ACK :这种状态表面上不是不能理解他的意思。 这种状态是指受话方发送FIN信息后,最后等待对方的ACK信息,收到ACK信息后进入CLOSED状态。
CLOSED :这种状态被提到了几次,但比较起来也是推测出来的。 这种状态表示连接已断开,已关闭。
在上面的TIME_WAIT状态中提到过2MSL,2MSL是什么? 现在,让我们详细说明TIME_WAIT状态和中的2MSL。
为什么需要TIME_WAIT? TIME_WAIT在4次挥手中有无可替代的位置,如果没有TIME-WAIT,活动端将直接进入关闭状态。 (主动端为客户端,被动端为服务器)此时,如果立即重新启动客户端并使用同一端口,则如果由于网络上的各种原因导致最后一个ACK丢失,服务端会重复FIN请求。 当此FIN被重新启动的客户端接收到,或者新启动的客户端向服务端发出请求时,服务端正在等待最后一次ACK,因此发送新连接请求的SYN被服务端识别,服务端返回RET以重置连接因此,活动端必须在发送最后一个ACK后进入TIME_WAIT状态,等待2msl(2 (两个消息的最大生命周期)。 等待此时间是为了防止在接收到重新发送的FIN请求时,网络上所有延迟的FIN/ACK数据都消失在网络中,从而不影响后续的连接
那么为什么TIME_WAIT的时间是2MSL呢? MSL是TCP消息的最大生命周期。 TIME_WAIT保持2MSL,从而确保在两个传输方向上未接收或延迟的消息段都消失。 否则,服务器可能会立即重新启动并接收来自上一进程的延迟数据。 但是,这个数据很可能是错误的,理论上可以确保最后的消息确实到达。 如果最后一次ACK丢失,服务器将再次发送