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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python单例模式

    python单例模式

    2021年11月19日
    57
  • db browser连接数据库_dbbrowserforsqlite使用教程

    db browser连接数据库_dbbrowserforsqlite使用教程这几天在写一个程序,需要用到SQLITE,但是对于SQLITE不熟悉,在网上找了一个SQLITE查看器这个查看器叫做:www./database/118822.html这个查看器可以新建SQLITE文件数据库,可以建立表索引,写SQL语句,编辑表数据不过这个查看器支持的SQLITE数据库引擎版本低了一点,先介绍一下SQLiteDatabaseBrowser2.0是怎么用的?主界面将SQLIT…

    2022年9月9日
    4
  • 离线安装gcc步骤「建议收藏」

    离线安装gcc步骤「建议收藏」公司给了测试服务器,很多东西都没有,又没有联网,不能通过yum去下载,只能离线安装,本文是离线安装gcc的步骤1.下载安装包可以通过以下博客的内容去下载包出处:1.https://blog.csdn.net/yuan_ren_sheng/article/details/810215632.https://blog.csdn.net/u012373815/article/deta…

    2022年5月9日
    860
  • 记一次压测问题定位:connection reset by peer,TCP三次握手后服务端发送RST

    记一次压测问题定位:connection reset by peer,TCP三次握手后服务端发送RST问题描述这两天用Go做一个比较简单的task:后端有HTTPServer和TCPServer。客户端通过http接入到HTTPServer,HTTPServer通过RPC将请求发送到TCPServer,所有的业务逻辑都由TCPServer处理。压测:自己的mac电脑(CPU:Inteli7,4核,2.7GHz。内存:16G),硬件够用。客户端用Go编写,1个goruntine启…

    2022年10月1日
    3
  • php代码检测工具_php代码在线运行

    php代码检测工具_php代码在线运行https://segmentfault.com/q/1010000000119048

    2022年9月28日
    3
  • pycharm的scrapy框架-断点调试「建议收藏」

    pycharm的scrapy框架-断点调试「建议收藏」在文件根目录,也就是settings.py的上级目录,scrapy.cfg的同级目录,创建main.py:fromscrapy.cmdlineimportexecuteimportosimportsysif__name__==’__main__’:sys.path.append(os.path.dirname(os.path.abspath(__file__)))execute([‘scrapy’,’crawl’,’你的spider的name’])点

    2022年5月11日
    41

发表回复

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

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