TCP三次握手和四次挥手面试题
- TCP标志位
- TCP序列号、确认号
- 三次握手
- 三次握手过程
- 为什么不是两次握手?
- 为什么不是四次握手?
- 为什么超时重传?如何处理丢包
- 为什么需要超时重传?
- 如何处理丢包?
- 四次挥手
- 四次挥手过程
- 为什么需要四次挥手
- 为什么四次挥手,客户端的TIME-WAIT状态必须等待2MSL的时间,才能返回到CLOSED状态
- 如果已经建立了连接,但是客户端出现故障了怎么办?
- 使用tcpdump抓包分析
- 操作
TCP标志位
TCP标志位代表当前请求的目的,一共有6种
1、SYN(synchronous):发送/同步标志,用来建立连接,和ACK标志位搭配使用。A请求与B建立连接时,SYN = 1, ACK = 0;B确认与A建立连接时,SYN=1,ACK=1
2、ACK(acknowledgement):确认标志,表示确认收到请求
3、PSH(push):推送操作,就是指数据包到达接收端以后,不对其进行队列处理,而是尽可能的将数据交给应用程序处理
4、FIN(finish):结束标志,表示关闭一个TCP连接
5、RST(reset):重制复位标志,用于复位对应的TCP连接
6、URG(urgent):紧急标志位,用于保证TCP连接不被中断,并且督促中间层设备尽快处理
TCP序列号、确认号
- 作用:TCP 使用序列号来记录发送数据包的顺序。TCP 传送一个数据包后,只有在指定时间里收到这个包的确认信息,才会将其从队列中删除,否则会重新发送该数据包。对接收方而言,通过数据分段中的序列号可以保证数据能够按照正常的顺序进行重组。
三次握手
三次握手过程

图片来源:https://juejin.im/post/5ddd1f30e51d4532c42c5abe
- 第一次握手(SYN):
- 客户端向服务端发送一个同步报文(SYN),表示请求建立连接,并告知自己的初始序列号(Seq)
- 第一次握手主要是为了:服务端确认“自己收、客户端发”报文功能正常
- 第二次握手(SYN + ACK):
- 服务端收到客户端的SYN报文后,回复同步确认报文(SYN + ACK),同时指定自己的初始序列号(Seq),并对客户端的序列号进行ACK确认(确认号=客户端的序列号 + 1)
- 第二次握手主要是为了:客户端确认“自己发、自己收、服务端收、服务端发”报文功能正常,因此客户端认为连接已建立
- 第三次握手(ACK):
- 客户端收到服务器的 SYN + ACK 之后,回复一个 ACK 报文,表示自己确认了服务器的 SYN,并对服务器的序列号进行 ACK 确认(确认号 = 服务器的序列号 + 1)。
- 第三次握手主要是为了:服务端确认“自己发、客户端收”报文功能正常,此时双方都认为连接已建立,TCP 连接正式建立
三次握手可以解决的问题:
1、防止历史连接误触发: 旧的 SYN 可能会因网络问题延迟到达服务器,导致服务器误以为是新的连接,三次握手确保客户端仍在等待通信。
2、确保双方的收发能力都正常: 三次握手能确保双方的 发送能力 和 接收能力 都正常,不会出现服务器单方面认为连接成功的情况。
为什么不是两次握手?
两次握手无法确保客户端和服务器的发送、接收能力都正常,可能会导致旧连接被误认为是新的连接,进而影响数据的可靠性。
假设采用两次握手:
1、客户端发送 SYN(请求建立连接)。
2、服务器收到后,直接返回 SYN + ACK,认为连接建立成功。
3、服务器直接开始发送数据。
4、问题:如果客户端因网络延迟或其他原因没有收到服务器的 SYN + ACK,或者客户端已经关闭,服务器仍然认为连接有效,会导致无效连接或错误数据传输。
为什么不是四次握手?
如果使用四次握手,就会多出一步额外的 ACK 确认报文,但这在建立连接时是不必要的,因为:
- 在第三次握手中,客户端发送的 ACK 已经明确表示它收到了服务器的 SYN + ACK,并准备好通信。
- 服务器只需要确认这个 ACK 是否到达即可,而不需要再发送一个额外的确认报文。
但是,在 TCP 断开连接时,为什么是四次挥手?
断开连接涉及双方数据传输的结束,需要确保双方都不再发送数据,因此需要四次挥手来确保数据彻底传输完毕。
为什么超时重传?如何处理丢包
为什么需要超时重传?
在TCP传输过程中,网络环境肯能会导致数据包丢失或ACK(确认)丢失。为了确保数据能够可靠地传输,TCP采用超时重传机制
1、发送方发送数据后,会开启一个定时器,等待接收方的ACK确认。
2、如果在超时时间内没有收到ACK,发送方会重新发送该数据包。
3、如果仍然没有收到确认,TCP可能会指数退避地延长超时时间,并继续重传(如:RTO值递增)。
4、当达到一定的重传上限后,TCP会认为连接中断,并向应用层报告失败。
超时重传机制保证了即使网络环境不稳定,TCP仍然能够提供可靠的数据传输。
如何处理丢包?
TCP采用超时重传和快速重传两种机制来处理丢包。
1、超时重传
应用场景:适用于网络不稳定、长时间丢包
触发条件:在RTO内未收到ACK
处理方式:重新发送数据包
- 发送方在发送数据时,启动一个定时器(RTO)
- 如果在RTO时间内没有收到ACK,TCP认为数据包丢失,重新发送该数据包
- TCP会指数退避地调整RTO,比如1s、2s、4s…直到达到最大重传次数。
缺点:
- 如果RTO设置过长,丢包恢复慢,影响性能。
- 如果RTO设置过短,可能导致不必要的重传,加重网络负担。
2、快速重传
应用场景:适用于部分丢包、轻微网络抖动
触发条件:收到3个相同的ACK
处理方式:立即重传丢失的数据包
当TCP发送方收到连续3个相同的ACK(即3次确认同一个数据包)时,认为该数据包可能已经丢失,会立即重传,而不等待超时。
示例:
1、发送方发送 Seq=1, 2, 3, 4。
2、Seq=2 丢失,但 Seq=3、4 仍然到达 接收方。
3、接收方发现 Seq=2 缺失,于是对 Seq=1 发送 3 次 ACK(ACK=2)。
4、发送方收到 3 次相同的 ACK=2,认为 Seq=2 丢失,立即重传 Seq=2。
优点:
- 比超时重传更快恢复丢包,提高 TCP 传输效率。
四次挥手
四次挥手过程

图片来源:https://juejin.im/post/5ddd1f30e51d4532c42c5abe
- 第一次挥手:客户端向服务端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待服务端的确认
- 序列号 seq = u,即客户端上次发送的报文的最后一个字节的序号 + 1
- 确认号 ack = k, 即服务端上次发送的报文的最后一个字节的序号 + 1
- 第二次挥手:服务端收到连接释放报文后,立即发出确认报文(ACK=1),序列号 seq = k,确认号 ack = u + 1
这时 TCP 连接处于半关闭状态,即客户端到服务端的连接已经释放了,但是服务端到客户端的连接还未释放。这表示客户端已经没有数据发送了,但是服务端可能还要给客户端发送数据。
- 第三次挥手:服务端向客户端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待 ACK 的确认
- 序列号 seq = w,即服务端上次发送的报文的最后一个字节的序号 + 1。如果半关闭状态,服务端没有发送数据,那么 w == k
- 确认号 ack = u + 1,与第二次挥手相同,因为这段时间客户端没有发送数据
- 第四次挥手:客户端收到服务端的连接释放报文后,立即发出确认报文(ACK=1),序列号 seq = u + 1,确认号为 ack = w + 1
此时,客户端就进入了 TIME-WAIT 状态。注意此时客户端到 TCP 连接还没有释放,必须经过 2*MSL(最长报文段寿命)的时间后,才进入 CLOSED 状态。而服务端只要收到客户端发出的确认,就立即进入 CLOSED 状态。可以看到,服务端结束 TCP 连接的时间要比客户端早一些。
TCP 规定,[FIN/ACK] 包即使没有传送数据,也会消耗掉一个序列号。[FIN/ACK] 包是第一、三次挥手:
- 第一次挥手时,客户端的序列号 seq = u,消耗一个序列号。因此:
- 第二次挥手时,服务端的确认号 ack = u + 1
- 第四次挥手时,客户端的序列号 seq = u + 1
- 第三次挥手时,服务端的序列号 seq = w,消耗一个序列号。因此:
- 第四次挥手时,客户端的确认号 ack = w + 1
为什么需要四次挥手
因为 TCP 是全双工的,一方关闭连接后,另一方还可以继续发送数据。所以四次挥手,将断开连接分成两个独立的过程
为什么四次挥手,客户端的TIME-WAIT状态必须等待2MSL的时间,才能返回到CLOSED状态
主要有两个原因:
(1) 确保 ACK 报文能够到达服务端,从而使服务端正常关闭连接。
第四次挥手时,客户端第四次挥手的 ACK 报文不一定会到达服务端。服务端会超时重传 FIN/ACK 报文,此时如果客户端已经断开了连接,那么就无法响应服务端的二次请求,这样服务端迟迟收不到 FIN/ACK 报文的确认,就无法正常断开连接。
MSL 是报文段在网络上存活的最长时间。客户端等待 2MSL 时间,即「客户端 ACK 报文 1MSL 超时 + 服务端 FIN 报文 1MSL 传输」,就能够收到服务端重传的 FIN/ACK 报文,然后客户端重传一次 ACK 报文,并重新启动 2MSL 计时器。如此保证服务端能够正常关闭。
那如果服务端重发的 FIN 没有成功地在 2MSL 时间里传给客户端,会怎样?服务端会继续超时重试直到断开连接,见下文。
(2) 防止已失效的连接请求报文段出现在之后的连接中。
TCP 要求在 2MSL 内不使用相同的序列号。客户端在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以保证本连接持续的时间内产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。或者即使收到这些过时的报文,也可以不处理它。
如果已经建立了连接,但是客户端出现故障了怎么办?
或者说,如果三次握手阶段、四次挥手阶段的包丢失了怎么办?比如上面描述的“服务端重发 FIN”的问题。
简而言之,通过定时器 + 超时重试机制,尝试获取确认,直到最后会自动断开连接。
具体而言,TCP 设有一个保活计时器。服务器每收到一次客户端的数据,都会重新复位这个计时器,时间通常是设置为 2 小时。若 2 小时还没有收到客户端的任何数据,服务器就开始重试:每隔 75 秒发送一个探测报文段,若一连发送 10 个探测报文后客户端依然没有回应,那么服务器就认为连接已经断开了。
使用tcpdump抓包分析
操作
tcpdump是一个命令行工具,可以打印网络接口上传输的 TCP 报文。
在一个终端窗口执行以下命令,监听与www.baidu.com传输的数据包
tcpdump -n host www.baidu.com # 可能需要 sudo 权限
参数说明:
- -n:不要将 host.port 转成域名
- host:监听发到特定主机与端口的流量
如图,开始成功监听:

随后再开启一个终端窗口,执行以下命令,访问www.baidu.com
curl www.baidu.com:
可以看到 tcpdump 打印了信息
其中一定包含三次握手建立连接、发送数据包、四次挥手断开连接这几个过程。接下来一一分析。约定:客户端就是本机,服务端就是百度的服务器。
相关文章:
TCP三次握手和四次挥手面试题
TCP标志位TCP序列号、确认号三次握手 三次握手过程为什么不是两次握手?为什么不是四次握手? 为什么超时重传?如何处理丢包 为什么需要超时重传?如何处理丢包? 四次挥手 四次挥手过程为什么需要四次挥手为什么四次挥手,…...
使用openAI与Deepseek的感受
今天简单介绍下使用OpenAI和DeepSeek的感觉,有些地方可能存在不准确的地方,望指正: 从2023年的秋冬到现在2025年的1月间,OpenAI和DeepSeek我都用它们来帮我,当然更多的是OpenAI,但整体感受如下:…...
FFmpeg(7.1版本)在Ubuntu18.04上的编译
一、从官网上下载FFmpeg源码 官网地址:Download FFmpeg 点击Download Source Code 下载源码到本地电脑上 二、解压包 tar -xvf ffmpeg-7.1.tar.xz 三、配置configure 1.准备工作 安装编译支持的软件 ① sudo apt-get install nasm //常用的汇编器,…...
为AI聊天工具添加一个知识系统 之80 详细设计之21 符号逻辑 之1
本文要点 要点 前面我们讨论了本项目中的正则表达式。现在我们将前面讨论的正则表达式视为狭义的符号文本及其符号规则rule(认识的原则--认识上认识对象的约束),进而在更广泛的视角下将其视为符号逻辑及其符号原则principle(知识…...
【C++】类和对象(5)
目录 一、构造函数补充1、初始化列表 二、类型转换三、static成员四、友元1、友元函数2、友元类 五、内部类六、匿名对象 一、构造函数补充 对于之前讲解的构造函数,还有一些更深层次的内容要进行补充,接下来进行补充内容的讲解。 1、初始化列表 在我…...
FPGA|使用quartus II通过AS下载POF固件
1、将开发板设置到AS下载挡位,或者把下载线插入到AS端口 2、打开quartus II,选择Tools→Programmer→ Mode选择Active Serial Programming 3、点击左侧Add file…,选择 .pof 文件 →start 4、勾选program和verify(可选࿰…...
H. Mad City
题目链接:Problem - H - Codeforces 题目大意:给定一个带环的图, 以及a, b两点 判断再图上不断的移动, b想不与a相遇, a想捉到b, 并且二者只能移动一步。 若b跑不掉 NO 否则YES. 具体题目看链接 输入: …...
Nginx前端后端共用一个域名如何配置
在 Nginx 中配置前端和后端共用一个域名的情况,通常是通过路径或子路径将请求转发到不同的服务。以下是一个示例配置,假设: 前端静态文件在 /var/www/frontend/。 后端 API 服务运行在 http://127.0.0.1:5000。 域名是 example.comÿ…...
27.Word:财务软件应用的书稿【10】
目录 NO1.2 NO3 NO5.6 NO7.8 NO9 存在页码链接关系,只是页码格式不同 NO1.2 另存为/F12:考生文件夹布局→页面设置对话框→页边距:上下内外/装订线→纸张大小→布局:页眉页脚 NO3 样式的应用:超快速❗ 开…...
AI编程:如何编写提示词
这是小卷对AI编程工具学习的第2篇文章,今天讲讲如何编写AI编程的提示词,并结合实际功能需求案例来进行开发 1.编写提示词的技巧 好的提示词应该是:目标清晰明确,具有针对性,能引导模型理解问题 下面是两条提示词的对…...
记一次STM32编译生成BIN文件过大的问题(基于STM32CubeIDE)
文章目录 问题描述解决方法更多拓展 问题描述 最近在一个项目中使用了 STM32H743 单片机(基于 STM32CubeIDE GCC 开发),它的内存分为了 DTCMRAM RAM_D1 RAM_D2 …等很多部分。其中 DTCM 的速度是比通常的内存要快的,缺点是不支持…...
【OpenGL】OpenGL游戏案例(二)
文章目录 特殊效果数据结构生成逻辑更新逻辑 文本渲染类结构构造函数加载函数渲染函数 特殊效果 为提高游戏的趣味性,在游戏中提供了六种特殊效果。 数据结构 PowerUp 类只存储存活数据,实际逻辑在游戏代码中通过Type字段来区分执行 class PowerUp …...
DeepSeek大模型技术深度解析:揭开Transformer架构的神秘面纱
摘要 DeepSeek大模型由北京深度求索人工智能基础技术研究有限公司开发,基于Transformer架构,具备卓越的自然语言理解和生成能力。该模型能够高效处理智能对话、文本生成和语义理解等复杂任务,标志着人工智能在自然语言处理领域的重大进展。 关…...
DeepSeek本地版安装简易教程(windows)
第一步:下载 第二步:安装 先安装ollama,安装完毕保持ollama运行,设置ollama通过防火墙,再安装deepseek,7b代表下载的r1版本,版本越高消耗资源越大 第三步:开放windows防火墙 第四步…...
RK3568使用QT搭建TCP服务器和客户端
文章目录 一、让RK3568开发板先连接上wifi二、客户端代码1. `widget.h` 文件2. `widget.cpp` 文件**详细讲解**1. **`Widget` 类构造函数 (`Widget::Widget`)**2. **UI 布局 (`setupUI`)**3. **连接按钮的槽函数 (`onConnectClicked`)**4. **发送消息按钮的槽函数 (`onSendMess…...
Python爬虫之——Cookie存储器
目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 &…...
理解动手学深度学习的自编包d2l
跟着李沐的《动手学深度学习-PyTorch版》入门Python编程和Pytorch框架,以前是重度Matlab用户,对于Python里的各种包很不习惯。特别是,本书还自己做了一个名为d2l包,有几个问题很是困惑。今天终于弄明白了,写在这里&…...
大语言模型(LLM)模拟金融市场参与者行为
大语言模型(LLM)模拟金融市场参与者行为 研究背景 传统深度学习模型通过识别市场数据历史模式预测市场,但未捕捉个体决策过程。LLM 虽能学习人类对不同提示的反应,但在模拟金融市场参与者时面临挑战:个体投资者不总是理性决策,LLM 可能无法捕捉;LLM 数值和金融知识可靠…...
蓝桥杯刷题DAY1:前缀和
所谓刷题,讲究的就是细心 帕鲁服务器崩坏【算法赛】 “那个帕鲁我已经观察你很久了,我对你是有些失望的,进了这个营地,不是把事情做好就可以的,你需要有体系化思考的能力。” 《幻兽帕鲁》火遍全网,成为…...
Hive:窗口函数(1)
窗口函数 窗口函数OVER()用于定义一个窗口,该窗口指定了函数应用的数据范围 对窗口数据进行分区 partition by 必须和over () 一起使用, distribute by经常和sort by 一起使用,可以不和over() 一起使用.DISTRIBUTE BY决定了数据如何分布到不同的Reducer上…...
OpenCV:SIFT关键点检测与描述子计算
目录 1. 什么是 SIFT? 2. SIFT 的核心步骤 2.1 尺度空间构建 2.2 关键点检测与精细化 2.3 方向分配 2.4 计算特征描述子 3. OpenCV SIFT API 介绍 3.1 cv2.SIFT_create() 3.2 sift.detect() 3.3 sift.compute() 3.4 sift.detectAndCompute() 4. SIFT 关…...
爬虫基础(一)HTTP协议 :请求与响应
前言 爬虫需要基础知识,HTTP协议只是个开始,除此之外还有很多,我们慢慢来记录。 今天的HTTP协议,会有助于我们更好的了解网络。 一、什么是HTTP协议 (1)定义 HTTP(超文本传输协议ÿ…...
视频拼接,拼接时长版本
目录 视频较长,分辨率较大,这个效果很好,不耗用内存 ffmpeg imageio,适合视频较短 视频较长,分辨率较大,这个效果很好,不耗用内存 ffmpeg import subprocess import glob import os from nats…...
【字符串两大注意事项】
表达字符串的方式 1.双引号:"hello world" 2.字符指针:char* ptr "hello world" 3.字符数组:char arr[] "hello world"辨析 项目表示方式代表含义内存分布1“hello world”字符串字面量字符串常量就是数据…...
【4Day创客实践入门教程】Day1 工具箱构建——开发环境的构建
Day1 工具箱构建——开发环境的构建 目录 Day1 工具箱构建——开发环境的构建1.元件选型2.准备工具3. 开发板准备焊接排针具体步骤注意事项与技巧 4. 软件环境配置与固件烧录Thonny IDE软件环境配置配置Micropython环境与烧录固件**问题:**买的是4M/16M,…...
如何让一个用户具备创建审批流程的权限
最近碰到一个问题,两个sandbox,照理用户的权限应该是一样的,结果开发环境里面我可以左右的做各种管理工作,但是使用change set上传后,另一个环境的同一个用户,没有相对于的权限,权限不足。 当时…...
Docker Hello World
Docker Hello World 引言 Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及应用的依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。本文将带领您从零开始,学习如何使用 Docker 运行一个简单的 "Hello World"…...
本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操
本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操 Janus-Pro-7B介绍 Janus-Pro-7B 是由 DeepSeek 开发的多模态 AI 模型,它在理解和生成方面取得了显著的进步。这意味着它不仅可以处理文本,还可以处理图像等其他模态的信息。 模型主要特点:Permalink…...
ITS290F Human Computer Interaction
ITS290F Human Computer Interaction & User Experience Design Lab 1. Introduction to CodePen What you’ll learn in this lab: • Understanding CodePen • Creating a front-end page • Using Google form to submit your lab work CodePen is a cloud-based in…...
【详细教程】如何在Mac部署Deepseek R1?
DeepSeek是目前最火的国产大模型,官方App用户太多服务经常出现卡顿,部署一个本地DeepSeek R1可以方便使用。 1.系统最低要求 macOS 11 Big Sur 或更新 2.下载ollama https://ollama.com/ 3.安装DeepSeek R1 打开终端 运行命令 ollama run deepseek-…...
