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


相关推荐

  • jmap使用详解_jmap作用

    jmap使用详解_jmap作用1. jmap-heappid     查看Java 堆(heap)使用情况       usingthread-localobjectallocation.       ParallelGCwith4thread(s)         //GC方式        HeapConfiguration:      //堆内存初始化配置      …

    2025年7月23日
    8
  • bat批量修改文件名_bat批量修改文件夹名称不成功

    bat批量修改文件名_bat批量修改文件夹名称不成功在测试的时候,经常会遇到修改host的情况,每次都打开host手动添加,很繁琐地,怎么写个批处理文件,双击下就把host修改了呢,请看下面代码:@echooffcolor0F@attrib-r”%windir%\system32\drivers\

    2022年10月9日
    2
  • route 命令详解

    route 命令详解转自“ITPUB博客”,链接:http://blog.itpub.net/86584/viewspace-755197/因为工作中需要了解网络配置,在众多文中,找到一详解,特此分享。1.使用背景需要接入两个网络,一个是部署环境所在内网环境,这个环境是上不了外网,外网环境很可能是一个无线网络。如果两者都连接上,很可能导致有一方不能起作用,即外网或内网上不了,常常需要…

    2022年7月18日
    16
  • 用户态和内核态区别是什么_进程运行在内核态还是用户态

    用户态和内核态区别是什么_进程运行在内核态还是用户态1、linux进程有4GB地址空间,如图所示:3G-4G大部分是共享的,是内核态的地址空间。这里存放整个内核的代码和所有的内核模块以及内核所维护的数据。2、特权级的概念:对于任何操作系统来说,创建一个进程是核心功能。创建进程要做很多工作,会消耗很多物理资源。比如分配物理内存,父子进程拷贝信息,拷贝设置页目录页表等等,这些工作得由特定的进程去做,所以就有了特权级别的概念。最关键的工作必须交给特权级最高的进程去执行,这样可以做到集中管理,减少有限资源的访问和使用冲突。interx86架构的cpu一共有

    2022年9月18日
    2
  • docker部署redis哨兵集群_redis部署安装

    docker部署redis哨兵集群_redis部署安装Docker安装Docker部署redis在dockerhub上可以看到有redis的官方镜像不去网站,也可以通过如下命令查看有那些镜像可用Dockersearch命令dockersearchredis拉取redis镜像Dockerpull命令这里我们拉取官方的最新版本的镜像:dockerpullredis:latest查看本地镜像Dockerimages命令有redis和hello-world运行容器Dockerrun命令d

    2022年10月18日
    3
  • MFC第三课 多字节处理

    MFC第三课 多字节处理

    2022年3月6日
    42

发表回复

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

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