首页 > 编程知识 正文

tcp的四次挥手,tcp为什么需要四次挥手

时间:2023-05-05 00:22:19 阅读:32769 作者:2846

在之前的博客中,我叙述了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丢失,服务器将再次发送

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。