计算机网络——TCP四次挥手过程详解

2023-11-09

上次写了TCP的三次握手,这次总结一下TCP的四次挥手的过程,理清楚为什么握手是三次,挥手需要四次。


TCP是面向连接的,连接的建立过程被称为“三次握手”,天下没有不散的宴席,有了连接的建立,就会有连接的断开,TCP断开的过程通常被称为“四次挥手”。

首先要明确一点,断开TCP请求既可以由客户端发起也可以由服务端发起。这里讨论客户端发起断开连接请求的情况。

过程如下:(可以先看文末的通俗对话模拟)
在这里插入图片描述
(1) 客户端A发出一个关闭连接的命令,这会使得客户端的TCP发送一个特殊的TCP报文段给服务器B,这个报文段的FIN标记位(finish的缩写,表示结束)被置为1。此时A由ESTABLISHED状态转为FIN_WAIT_1状态,等待来自B的ACK报文。

(2) B收到这个报文段,检测到这是请求关闭连接的报文,发送一个确认报文段(ACK字段为1)给A,表示收到,通知A可以释放连接了。A收到这个ACK报文时,单方面释放了与B的连接,此时他不能再向B发送应用层数据了,但由于B可能还有数据没有发送完,所以此时A还可以接收来自B的报文段。此时A进入FIN_WAIT_2状态,等待来自B的FIN报文。B由ESTABLISHED状态进入CLOSE_WAIT状态。

(3) 当B向A发送完所有数据之后,也向A发送一个关闭连接的报文段,FIN和ACK都为1的报文段(还没有搞清楚为什么ACK也是1,但估计是为了与第一次的请求关闭报文段区分开),并等待来自A的确认报文段。此时B进入LAST_ACK状态。

(4) A接收到B的关闭连接请求后,给B发一个确认报文段,通知B可以释放连接了。B收到之后,释放所有连接资源,进入CLOSED状态。而A并没有马上释放资源,而是进入TIME_WAIT状态,等待一段时间(自定义,通常为30sec、1min或2min),使得可以在ACK报文段丢失的情况下进行重传。在等待时间结束之后,连接正式关闭,客户端的所有资源也被释放,进入CLOSED状态。

以下分别为客户端和服务端的TCP连接状态转换(结合TCP的三次握手):
在这里插入图片描述
在这里插入图片描述
由上述的讨论可知,之所以需要进行四次挥手,在于某一方发起关闭连接的请求时,可以保证自己不再需要发送数据,但并不能猜测到对方是否已经发送完数据了,所以只是先通知对方我要断开连接了,你也差不多可以断开了,对方可以断开的时候则又会发一个断开连接的报文段。而额外的两个的ACK报文是确保两个FIN报文都被接收到。
模拟成一段对话就是:

  • A:“我发完数据了,不发了,要断开连接啦!”(FIN报文)
  • B:“好啊,你不发就不发,但先收完我发给你的数据好吗,很快就发完了。”(ACK报文)

(A继续接收来自B的数据)

  • B(发完数据):“好了,我也发完数据了,可以断开连接了!”(FIN/ACK报文)
  • A:“好,断开吧!”(ACK报文)
    (B收到后马上断开并释放资源,而A还要再等一会,万一这条消息丢失了,B还会再催促。等够一段时间,A就默认B已经收到确认消息了,于是也断开连接,释放资源)

相关阅读:
计算机网络——TCP三次握手详解为什么两次不行
TCP连接的三次握手四次挥手——类比异地恋情侣开始交往和分手(通俗易懂)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机网络——TCP四次挥手过程详解 的相关文章

  • 为什么 TCP 段中的 SYN 或 FIN 位会占用序列号空间中​​的一个字节?

    我试图理解这种设计背后的基本原理 我浏览了一些 RFC 但没有发现任何明显的东西 这并不是特别微妙 这样 SYN 和 FIN 位本身就可以被确认 因此如果丢失则可以重新发送 例如 如果连接关闭而没有发送更多数据 那么如果 FIN 没有发送任
  • iOS 上的多个 HTTP 请求与单个 TCP 连接

    我正在开发一个 iPhone 应用程序 它使用我控制的基于 Web 的 API 连接到持续打开的 TCP 端口并通过 TCP API 发出请求 或者为我想要获取的所有数据发出新的 HTTP 请求 会更快或更高效吗 我认为差异可以忽略不计 但
  • 如何强制关闭 TcpListener

    我有一个通过 tcpListener 进行通信的服务 问题是当用户重新启动服务时 抛出 地址已在使用 异常 并且服务在几分钟左右无法启动 有没有办法告诉系统终止旧连接 以便我可以打开一个新连接 我不能只使用随机端口 因为服务无法通知客户端端
  • 当使用环回地址使用 TCP/IP 套接字进行 IPC 时,常见的网络堆栈是否会跳过将消息帧封装在较低级别的 PDU 中?

    在某些环境 例如 Java 中 很自然地使用 TCP IP 套接字通过 localhost 地址 IPv4 中的 127 0 0 1 或 IPv6 中的 1 在同一主机上的进程之间传递消息 因为Java倾向于不在其API中公开其他IPC机制
  • 如何抑制Windows防火墙的Windows安全警报?

    当我从这里找到的 ZeroMQ 指南中用 C 创建 Hello World 示例时 http zguide zeromq org page all Ask and Ye Shall Receive http zguide zeromq or
  • 当 TCP 序列号到达而不是预期时会发生什么情况?

    我正在编写一个程序 使用 libpcap 捕获数据包并重新组装 TCP 流 我的程序只是监视流量 因此我无法控制数据包的接收和发送 我的程序忽略所有非 TCP IP 流量 我根据 ISN 计算下一个预期序列号 然后计算连续的 SEQ 号 我
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • 使用 InputStream 通过 TCP 套接字接收多个图像

    每次我从相机捕获图像时 我试图将多个图像自动从我的 Android 手机一张一张地发送到服务器 PC 问题是read 函数仅在第一次时阻塞 因此 从技术上讲 只有一张图像被接收并完美显示 但在那之后当is read 回报 1 该功能不阻塞
  • 使用 TCP 时是否需要使用校验和来保护我的消息?

    使用 TCP 作为网络协议 在通过线路发送消息之前 我会为每条消息的大小 以及可能的校验和 添加前缀 我想知道 计算和传输消息的校验和是否有意义 以确保消息将被不变地传递 如果以及何时传递 例如因为一些网络错误 目前 我在发送消息本身之前发
  • Java Servlet 中限制 HTTP 请求

    在 java servlet 中 如何根据客户端的 IP 地址限制来自用户的 http 请求 我不想每秒处理来自特定源 IP 地址的超过 X 个请求 其中 X 是可配置的并且具有 0 1 中的实际值 10 范围 从 10 秒内 1 个请求到
  • iPhone 上的 TCP 打洞

    我已经阅读了一些内容 虽然我是 iPhone 网络的新手 但我想知道 TCP 打孔是否可以通过 NAT 连接两台 iPhone 我还阅读了一些有关 uPnP 和发夹的有用内容 但我根本不熟悉这些内容 所以如果有人对这是否可能有任何想法 我的
  • StreamWriter的正确使用

    经过几次尝试后 我无法让 StreamWriter 正确构建 工作 所以我做了一些根本错误的事情 C Visual Studio 我有一个现有的 TCP 客户端 它连接并充当读取器 它工作正常 private System Net Sock
  • 用 C 语言进行非阻塞 udp 套接字编程:我能得到什么?

    我在理解从非阻塞 UDP 套接字返回什么recv recvfrom 时遇到问题 与 TCP 相比更具体一点 如果我错了 请纠正我 阻塞套接字 TCP 或 UDP 在缓冲区中有一些数据之前不会从 recv 返回 这可以是一定数量的字节 TCP
  • 创建 ip 网络数据包 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须使用任何协议手动创建自己的网络
  • 10G 链路的 netcat 和 iperf 结果存在巨大差异

    我很困惑看到 netcat 和 iperf 结果之间的巨大差异 我有 10 G 链路连接我的服务器和客户端 iperf 的速度约为 10Gb s 但 netcat 的速度仅为约 280 MB s 可能是什么错误 对于 Iperf Serve
  • 使用套接字和 AsyncTask 强制关闭

    堆栈的人们大家好 请参阅下面我的班级代码和我的 LogCat 尝试连接时我受到强力关闭 如果有人能帮助我找出原因 我将不胜感激 基本上代码的作用是 从意图中获取 IP 地址 连接到端口 32 的 IP 然后发送一个命令 等待响应并发送另一个
  • 多个客户端如何同时连接到服务器上的一个端口(例如 80)? [复制]

    这个问题在这里已经有答案了 我了解端口工作原理的基础知识 但是 我不明白的是多个客户端如何同时连接到端口 80 我知道每个客户端都有一个唯一的 对于他们的机器 端口 服务器是否从可用端口回复客户端 并简单地声明回复来自 80 这是如何运作的
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • Golang SSL TCP套接字证书配置

    我正在创建一个 Go TCP 服务器 不是 http s 并且尝试将其配置为使用 SSL 我有一个 StartCom 免费 SSL 证书 我正在尝试使用它来完成此任务 我的服务器代码如下所示 cert err tls LoadX509Key
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h

随机推荐

  • 设置熄屏_手机摁下这个开关,熄屏也能显示时间!很多人没用过,太可惜了

    其实在手机的使用过程中 很多实用功能都被大家忽略掉了 如手机熄屏显示时间这个功能 在日常生活中就十分的实用 但是很多人都没用过 这就很可惜了 下面我们就一起来看一下吧 1 华为手机 华为手机也是支持手机熄屏显示时间的 下面我们就一起来看一下
  • d3.js 小结

    D3 数据可视化库 D3 4 0 D3是目前最流行的JavaScript可视化图表库之一 D3的图表类型非常丰富 并且支持SVG格式 因此应用十分广泛 也有很多图表插件基于D3开发 比如MetricsGraphics js 在D3上构建的数
  • 自下而上的炫酷进度条 --- Android自定义组件进阶版

    效果展示 自下而上的炫酷进度条效果展示 源码分析 第一步 创建自定义组件类 第二步 自定义属性文件编写
  • face_recognition库使用教程

    Jupyter Notebook文件及图片数据见 百度网盘 import cv2 import dlib import math import pprint import numpy as np import face recognitio
  • WordPress系列教程(一)----WordPress环境准备与安装

    一 前言 前段时间自己搭建了个WordPress的博客 用来做资源分享 主要包括视频教程 电子书 源码等一些学习资源网站地址是 http www 98share cn 当时考虑的是练练手 所以在淘宝上 随便买了个虚拟主机 200多快挺便宜的
  • 数据结构:树(基本概念)

    树 集合中的元素关系呈现出一对多的情况 非线性结构 1 n 1 树的定义 树 Tree 是n n 0 个节点的有限集合T 它满足两个条件 有且仅有一个特定的称为根 Root 的节点 其余的节点可以分为m m 0 个互不相交的有限集合T1 T
  • Python爬虫—手机销量

    介绍 最近在学习Python的一些相关知识 爬虫是其中有趣的一项 现在把学习的过程整理出来 给自己留个印记 Selenium爬取天猫手机数据 淘宝的反爬虫有点厉害 光是登陆就研究了小一天 先是尝试模拟输入用户名和密码 但是会出现让拖动滑块
  • Python 模块的概念和基本使用

    视频版教程 Python3零基础7天入门实战视频教程 模块和包 在Python的标准安装中 包含了一组自带的模块 这些模块被成为 标准库 比如常用的math random datetime os json等等 此外 还有很多的第三方模块 比
  • MIPI_DSI协议简要介绍

    MIPI DSI是一种应用于显示技术的串行接口 兼容DPI 显示像素接口 Display Pixel Interface DBI 显示总线接口 Display Bus Interface 和DCS 显示命令集 Display Command
  • tomcat配置400404500类型的错误页面,修改项目默认路径,修改默认项目

    修改项目默认路径 修改默认项目 http xxx xxxxxx xxx 直接访问 找到tomcat路径中conf文件夹下server xml文件找到 修改成 说明 xxx xxx xxx xxx webapps修改的项目默认路径 xxx x
  • 云服务器子系统,Linux子系统使用云服务器

    Linux子系统使用云服务器 内容精选 换一换 用户使用创建弹性云服务器时使用的密钥文件登录Linux弹性云服务器时 登录失败 根据Linux弹性云服务器使用的镜像不同 可能会存在如下原因 原因一 Linux弹性云服务器的镜像为用户自己制作
  • MATLAB生成M序列和Gold序列

    M序列 最长线性移位寄存器序列又称为m序列 他是一种伪随机序列 在硬件电路中 m序列可以通过反馈移位寄存器产生 寄存器的反馈连接有生成m序列的本源多项式确定 m序列的 0 0 0映射成 1 1
  • CentOS 7.9 安装Docker

    Docker简单介绍 Docker的应用场景 Web 应用的自动化打包和发布 自动化测试和持续集成 发布 在服务型环境中部署和调整数据库或其他的后台应用 Docker 的优点 Docker 是一个用于开发 交付和运行应用程序的开放平台 Do
  • 《oracle大型数据库系统在AIX/unix上的实战详解》讨论十二:关于读书

    感谢大家对这本书的热情和踊跃来信 这段日子有几位朋友都提出了类似于下面问题的问题 我在找这方面的工作 想学习您这本书进这一行 您看看怎么看合适 太厚了 我想开始阅读 oracle大型数据库系统在AIX unix上的实战详解 这本书 请问您有
  • Merge into的使用详解-你Merge了没有

    Merge是一个非常有用的功能 类似于Mysql里的insert into on duplicate key Oracle在9i引入了merge命令 通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操
  • Mysql忘记root密码的解决方法(亲测有效)

    首先搜索找到mysql exe的目录 一般是在你安装mysql的bin目录下 右键打开cmd 以管理员权限进入命令行窗口 打开任务管理器 结束掉mysqld exe进程 确保sql没有在运行中 在cmd下 cd切换目录到mysql exe所
  • c++ fbxsdk安装配置_Linux上安装软件 - coydone

    安装JDK 1 下载JDK http www oracle com technetwork java javase downloads jdk8 downloads 2133151 html 2 使用XFTP工具导入linux 3 解压到
  • C++中如何调用C里面的函数

    经验证 下机制可行 Here is a setup that allows C to call C Maybe this method is appropriate for your need 1 use the not using pre
  • OpenLDAP配置TLS加密传输

    原文发表于cu 2016 07 04 参考文档 基于OpenSSL自建CA与颁发SSL证书 http seanlook com 2015 01 18 openssl self sign ca OpenLDAP with TLS http m
  • 计算机网络——TCP四次挥手过程详解

    上次写了TCP的三次握手 这次总结一下TCP的四次挥手的过程 理清楚为什么握手是三次 挥手需要四次 TCP是面向连接的 连接的建立过程被称为 三次握手 天下没有不散的宴席 有了连接的建立 就会有连接的断开 TCP断开的过程通常被称为 四次挥