TCP 四次挥手的过程

TCP 四次挥手的过程1、四次挥手的过程1、刚开始双方处于ESTABLISHED状态。2、客户端要断开了,向服务器发送FIN报文,在TCP报文中的位置如下图:发送后客户端变成了FIN-WAIT-1状态。注意,这时候客户端同时也变成了half-close(半关闭)状态,即无法向服务端发送报文,只能接收。3、服务端接收后向客户端确认,变成了CLOSED-WAIT状态。4、客户端接收到了服务端的确认,变成了FIN-WAIT2状态。5、随后,服务端向客户端发送FIN,自己进入LAST-AC…

大家好,又见面了,我是你们的朋友全栈君。

 

1、四次挥手的过程

TCP 四次挥手的过程

1、刚开始双方处于ESTABLISHED状态。

2、客户端要断开了,向服务器发送 FIN 报文,在 TCP 报文中的位置如下图:

TCP 四次挥手的过程

发送后客户端变成了FIN-WAIT-1状态。注意, 这时候客户端同时也变成了half-close(半关闭)状态,即无法向服务端发送报文,只能接收。

3、服务端接收后向客户端确认,变成了CLOSED-WAIT状态。

4、客户端接收到了服务端的确认,变成了FIN-WAIT2状态。

5、随后,服务端向客户端发送FIN,自己进入LAST-ACK状态,

6、客户端收到服务端发来的FIN后,自己变成了TIME-WAIT状态,然后发送 ACK 给服务端。

注意了,这个时候,客户端需要等待足够长的时间,具体来说,是 2 个 MSL(Maximum Segment Lifetime,报文最大生存时间), 在这段时间内如果客户端没有收到服务端的重发请求,那么表示 ACK 成功到达,挥手结束,否则客户端重发 ACK。

2、等待2MSL的意义

如果不等待会怎样?

如果不等待,客户端直接跑路,当服务端还有很多数据包要给客户端发,且还在路上的时候,若客户端的端口此时刚好被新的应用占用,那么就接收到了无用数据包,造成数据包混乱。所以,最保险的做法是等服务器发来的数据包都死翘翘再启动新的应用。

那,照这样说一个 MSL 不就不够了吗,为什么要等待 2 MSL?

  • 1 个 MSL 确保四次挥手中主动关闭方最后的 ACK 报文最终能达到对端
  • 1 个 MSL 确保对端没有收到 ACK 重传的 FIN 报文可以到达

这就是等待 2MSL 的意义。

3、为什么是四次挥手而不是三次?

因为服务端在接收到FIN, 往往不会立即返回FIN, 必须等到服务端所有的报文都发送完毕了,才能发FIN。因此先发一个ACK表示已经收到客户端的FIN,延迟一段时间才发FIN。这就造成了四次挥手。

如果是三次挥手会有什么问题?

等于说服务端将ACKFIN的发送合并为一次挥手,这个时候长时间的延迟可能会导致客户端误以为FIN没有到达客户端,从而让客户端不断的重发FIN

4、同时关闭会怎样?

如果客户端和服务端同时发送 FIN ,状态会如何变化?如图所示:

TCP 四次挥手的过程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140519.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 图解Java 垃圾回收机制

    图解Java 垃圾回收机制Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。垃圾回收机制的引入有效地解决了内存的回收问题使得他们在编写程序的时候不再需要考虑内存管理。本文首先着重介绍了判断一个对象是否可以被回收的两种经典算法,并详述了四种典型的垃圾回收算法的基本思想及其直接应用——垃圾收集器,最后结合内存回收策略介绍了内存分配规则。

    2022年6月11日
    32
  • 现代数字图像处理作业———对lena图像进行简单处理[通俗易懂]

    现代数字图像处理作业———对lena图像进行简单处理[通俗易懂]对lena图像加入椒盐噪声,强度为30%,分别采用均值滤波,中值滤波进行处理。并讨论不同尺度的模板对结果的影响。

    2022年6月19日
    45
  • map通过jsonobject转成实体类

    map通过jsonobject转成实体类新手

    2022年9月1日
    7
  • idea查看接口的实现类快捷键_idea查看方法在哪里被调用快捷键

    idea查看接口的实现类快捷键_idea查看方法在哪里被调用快捷键Ctrl+B快速打开光标处的类或方法Ctrl+Alt+B查看接口的实现类Ctrl+Shift+B跳转到类型声明处

    2022年8月15日
    9
  • linux连接Redis客户端

    linux连接Redis客户端linux命令下载redis-stable#官网下载,这里使用wget直接下载的[linux]$wgethttp://download.redis.io/redis-stable.tar.gz#解压[linux]$tar-xzvfredis-stable.tar.gz#进入解压目录[linux]$cdredis-stable#编译[linux]$make#拷贝入bin目录[linux]$cpsrc/redis-cli/usr/local/bin/验证redi

    2022年5月5日
    56
  • 产生随机数算法[通俗易懂]

    产生随机数算法[通俗易懂]两个办法帮你解决如何在Java中产生随机数http://cd.qq.com     随机数在日常的应用和开发中经常会见到,比如说某些系统会为用户生成一个最初的初始化密码,这就是一个随机数。如何生成这个随机数,不同的开发工具的方法也不一样。在应用中,Java是应用最为广泛的开发工具之一,如何在Java中产生随机数,也是很多开发者在初学随机数时的一个必修课,在此为读者贡献两个办法帮你

    2022年7月26日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号