tcp四次挥手,为什么是四次?「建议收藏」

tcp四次挥手,为什么是四次?「建议收藏」四次挥手的原因;为什么要有TIME_WAIT状态?2MSL的的意义;四次挥手中如果有一次挥手失败怎么处理?

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

  上一篇博客说了三次握手为什么是是三次(点这里),那么现在就介绍一下四次挥手。大家都知道TCP是全双工的,再建立连接时的三次握手中的SYN和ACK一起发送,这里就会有疑问,为什么在四次挥手的时候没有将SYN和ACK一起发送呢?带着这个问题继续向下看,答案就在其中。
  说到四次挥手,顾名思义,就是在关闭连接的时候双方一共要操作四次,来看一下这四次都是怎么操作的:
在这里插入图片描述
  从图中可以看出来,在四次挥手的时候双方一共进入了六种状态,这六种状态就是理解四次挥手的关键所在,我们来看一下

四次挥手的状态

  1. FIN_WAIT_1:这个状态和FIN_WAIT_2状态都在再等待对方的回复,但是这两种状态是有区别的,FIN_WAIT_1就是主动方在ESTABLISHED状态的时候,想要主动关闭连接,向对方发送FIN报文,这时候就进入了FIN_WAIT_1状态。当他收到对方回复的ACK报文后,就进入了FIN_WAIT_2状态。 但是在实际操作中是很难遇到FIN_WAIT_1状态的,因为无论对方是什么情况都应该立刻回应ACK报文,但是FIN_WAIT_2状态还是可以在主动方中用netstat看到的。

  2. FIN_WAIT_2:上面已经对FIN_WAIT_2讲解过了,当主动方进入FIN_WAIT_2时,就表示着半连接状态,也就是主动方还有数据要发给对方,这个数据就是之后的ACK,所有他要等一会儿才关闭连接。

  3. CLOSE_WAIT:这个状态从表面也可以看出它的作用,就是等待关闭。当被动方接收到FIN时,会立刻回复一个ACK给对方,接下来就是进入CLOSE_WAIT状态。在这个状态中,被动方需要考虑自己还有没有数据要发送给对方,如果有可以继续发送,如果没有了就可以关闭连接了,发送一个FIN给对方。 这个状态其实也就是给自己一个缓冲的时间,让自己处理完需要处理的事,然后去关闭连接。

  4. TIME_WAIT:这个状态就是一段时间后进行一些操作。当主动方收到了对方发来的FIN报文,并发出ACK报文,接下来就等2MSL就可以进入CLOSED状态了。其实,如果主动方在FIN_WAIT_1状态下,收到了对方的FIN+ACK标志的报文,就可以跳过FIN_WAIT_2状态直接进入TIME_WAIT状态了。

  5. LAST_ACK:这个状态从表面不难不理解他的意思,这个状态就是被动方发送了FIN报文后,最后等待对方的ACK报文,收到ACK报文后就可以进入CLOSED状态了。

  6. CLOSED:上面提到了几次这个状态,相比也猜出来了,这个状态表示的就是连接中断,已经关闭。

  在上面的TIME_WAIT状态中有提到过2MSL,那么什么是2MSL呢?那么来详细说一下TIME_WAIT状态和里面的2MSL。

为什么需要TIME_WAIT?

  TIME_WAIT在四次挥手中有着不可替代的位置,如果没有TIME-WAIT,主动方就会直接进入CLOSED状态,(假设主动方时客户端,被动方时服务端)这时候如果立即重启客户端使用相同的端口,如果因为网络中种种原因最后一次ACK丢失了,服务端就会重复FIN请求,这时这个FIN就会被重新启动的客户端接收到,或者新启动的客户端向服务端发起请求的时候,因为服务端正在等待最后一次ACK,因此新连接请求发送的SYN就会被服务端认为时请求码错误,服务端就会回复RET重置连接。所以就需要主动方发送最后一次ACK之后进入TIME_WAIT状态,等待2MSL(两个报文最大生命周期),等待这段时间就是为了如果接收到了重发的FIN请求能够进行最后一次ACK回复,让在网络中延迟的FIN/ACK数据都消失在网络中,不会对后续连接造成影响

那么为什么TIME_WAIT的时间是2MSL呢?

  MSL是TCP报文的最大生命周期,因为TIME_WAIT持续在2MSL就可以保证在两个传输方向上的尚未接收到或者迟到的报文段已经消失,否则服务器立即重启,可能会收到来自上一个进程迟到的数据,但是这种数据很可能是错误的,同时也是在理论上保证最后一个报文可靠到达,假设最后一个ACK丢失,那么服务器会再重发一个FIN,这是虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK。

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

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

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


相关推荐

  • Java HotSpot VM Options 参数设置

    Java HotSpot VM Options 参数设置

    2021年6月18日
    107
  • idea在mac版怎么配置svn_IntelliJ Idea 集成svn 和使用

    idea在mac版怎么配置svn_IntelliJ Idea 集成svn 和使用最近公司的很多同事开始使用IntelliJIdea,便尝试了一下,虽然快捷键与eclipse有些不同,但是强大的搜索功能与“漂亮的界面”(个人认为没有eclipse好看),还是值得我们去使用的。刚开始使用的idea要去集成svn,下载公司的项目。我是用的是TortoiseSVN(小乌龟),下载后安装,然后记住安装路径,我安装的是64位的。TortoiseSVN的下载地址:htt…

    2022年10月17日
    3
  • java缓存数据并配置有效时间[通俗易懂]

    java缓存数据并配置有效时间[通俗易懂]没有用到redis只是单纯的使用内存存储数据实现的功能:缓存数据并配置有效时间,可设置默认时间自动清除缓存,也可以自己设置。直接上代码:importjava.util.LinkedList;importjava.util.List;importjava.util.Map.Entry;importjava.util.Timer;importjava.util.TimerTask;importjava.util.concurrent.ConcurrentHashMap;publ

    2022年10月4日
    2
  • Mac上VSCode删除整行快捷键

    Mac上VSCode删除整行快捷键command+x

    2022年6月23日
    61
  • vue 强制清除浏览器缓存

    vue 强制清除浏览器缓存(1)最基本的方法就是,在打包的时候给每个打包文件加上hash值,一般是在文件后面加上时间戳//在vue.config.js文件中,找到output:constTimestamp=newDate().getTime()output:{//输出重构打包编译后的文件名称【模块名称.版本号.时间戳】filename:`[name].${process.env.VUE_APP_Version}.${Timestamp}.js`,chunkFilen

    2022年7月18日
    155
  • 反向传播(BPTT)与循环神经网络(RNN)文本预测

    反向传播(BPTT)与循环神经网络(RNN)文本预测反向传播(BPTT)与RNN文本预测实战本文介绍简单RecurrentNeuralNetworks(RNN)的基本训练算法BACKPROPAGATIONTHROUGHTIME(BPTT),并用python2.7实现RNN的文本预测。

    2022年6月23日
    25

发表回复

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

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