TCP四次挥手原因

TCP四次挥手原因客户端发了一个FIN501(0)ACK701,然后服务端回了一个ACK502。。此时客户端就处于半关闭状态。至于半关闭的话,还得详细解释一下:刚开始(左边)客户端和服务端(右边)都可以互相进行通信,都能进行发送数据和接收数据,但当客户端处于半关闭时,就变成了下面这样(此图只是举个例子,没必要纠结图)这图想表达的就是,客户端(左边)只能进行接收数据,而不能发送数据,服务端(右边)能进行发送数据和接收数据这种是通过什么机制实现的呢?因为一个套接字(左右方框均可看成.

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

当 客户端发了一个FIN 501(0)
客户端发了一个FIN 501(0) ACK 701 ,然后服务端回了一个ACK502 。。此时客户端就处于半关闭状态。

至于半关闭的话,还得详细解释一下:

在这里插入图片描述
刚开始(左边)客户端和服务端(右边)都可以互相进行通信,都能进行 发送数据和接收数据,但当 客户端处于半关闭时,就变成了下面这样

在这里插入图片描述

(此图只是举个例子,没必要纠结图)这图想表达的就是,客户端(左边)只能进行接收数据,而不能发送数据, 服务端(右边)能进行发送数据和接收数据

这个半关闭状态是什么时候有的呢?在代码层面来理解:
当我们服务端的read函数返回0,说明客户端的数据已经到结尾了,然后客户端半关闭事件喽

当服务端close返回的时候,说明4次挥手成功,连接关闭喽。

这种是通过什么机制实现的呢?
因为一个 套接字(左右方框均可看成一个套接字) 中有两个缓冲区,一个读缓冲区,一个写缓冲区

在这里插入图片描述
当一个套接字处于半关闭状态时,也就代表,关闭了写缓冲区,读缓冲区依然开启。所以利用这个套接字依然能进行读数据,但是不能写数据,这就是半关闭状态。。相同概念,所以客户端和服务端各自都来关一次,就4次挥手

接下来两次挥手
在这里插入图片描述

综合起来就是:
在这里插入图片描述
这里大家是不是还会有一个小疑问?半关闭后的客户端为什么还能发送ACK呢?
在这里插入图片描述

半关闭并非关 套接字,而是关缓冲区!!!也就是关掉内核的写缓冲区,也就是客户端不会再向服务端写数据了,但是客户端与服务端之间的连接还在的呀,仔细看这图,所以可以返回ACK应答的

总结如下:

三次握手:
主动放松连接请求端,发送SYN标志位,请求建立连接。携带序号,数据字节数(0),滑动窗口大小
被动接受连接请求端,发送ACK标志位,同时携带SYN请求标志位。携带序号,确认序号,数据字节数(0),滑动窗口大小
主动发起连接请求端,发送 ACK标志位,应答服务器连接请求。携带确认序号。

四次挥手:
主动关闭连接请求端,发送FIN标志位。
被动关闭连接请求端,应答ACK标志位。 ————–半关闭完成

被动关闭连接请求端,发送FIN标志位。
主动关闭连接请求端,应答ACK标志位。 —————-连接全部关闭

滑动窗口:
发送给连接对端,本端的缓冲区大小(实时),保证数据不会丢失。

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

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

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


相关推荐

  • MATLAB画图颜色渐变「建议收藏」

    MATLAB画图颜色渐变「建议收藏」原文(https://wenku.baidu.com/view/bf87a9d5804d2b160a4ec03f.html)1渐变1.1t=[linspace(0,2*pi)nan];x=sin(t);y=cos(2*t);z=sqrt(t);%所要绘制的曲线方程patch(x,y,z,z,’edgecolor’,’flat’,’facecolor’,’none’)vi…

    2022年5月31日
    273
  • BigDecimal类的简单使用方法

    BigDecimal类的简单使用方法

    2021年12月14日
    47
  • ts文件怎么合并转换成mp4?

    ts文件怎么合并转换成mp4?ts文件怎么合并转换成mp4?现在小编就来教大家一个方法吧,直接将多个ts视频文件直接合并成mp4格式,大家想不想学会这个技能呢?跟我一起往下看吧。

    2022年10月29日
    0
  • 算法的时间复杂度和空间复杂度-总结[通俗易懂]

    算法的时间复杂度和空间复杂度-总结[通俗易懂]算法的时间复杂度和空间复杂度1、时间复杂度(1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(

    2022年5月14日
    54
  • JMeter性能测试之相关术语及性能测试通过标准

    JMeter性能测试之相关术语及性能测试通过标准

    2021年7月13日
    98
  • 在java中println什么意思_java printf与println

    在java中println什么意思_java printf与println在java中,System.out.println()是我们经常会用到的一个语法,它的作用是将值输出显示在console窗口中,这样程序员就可以在console窗口中看到代码运行的结果。而除了System.out.println()之外,还有其他的打印结果的方法。比如说System.out.print(),这个方法与System.out.println()很像,区别就在于,System.out….

    2022年10月2日
    0

发表回复

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

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