如何理解TCP三次握手的过程

TCP三次握手是什么?

三次握手是TCP(传输控制协议)在建立连接时必须经历的一个过程,其核心目的是 确保通信双方都具有发送和接收数据的能力,并同步双方的初始序列号,为后续可靠的数据传输打下基础。

繁琐的语言文字真的是很难记住这些交互,我们可以从生活中的小故事进行加深理解

我们可以想象下我们打电话的场景,打电话前的确认流程会是这样:

复制代码
你说:"喂,听得到吗?" (发起连接)

对方回答:"听得到,你能听到我吗?" (确认收到,并回问)

你说:"我能听到,我们开始说吧。" (确认收到对方的回答)

至此,双方都确认了通信链路畅通,可以正式开始通话。

三次握手流程(核心)

握手阶段 发起方 核心报文(标志位) 作用/验证内容
第一次握手 客户端 → 服务器 SYN(同步序列编号) 客户端向服务器发起连接请求,携带初始序列号(seq=x); 验证:服务器确认"自己能接收客户端的报文"。
第二次握手 服务器 → 客户端 SYN + ACK(确认应答) 服务器响应连接请求,携带确认号(ack=x+1)和自己的初始序列号(seq=y); 验证:客户端确认"自己能发/收,服务器能收/发"。
第三次握手 客户端 → 服务器 ACK 客户端确认服务器的响应,携带确认号(ack=y+1); 验证:服务器确认"客户端能收,自己能发"。

验证阶段(核心目标:双向验证收发能力)

  1. 第一次握手验证:服务器仅能确认"客户端的发送能力正常,自己的接收能力正常",但客户端无法确认服务器的任何能力。
  2. 第二次握手验证 :
    • 客户端收到SYN+ACK后,确认"自己的发送/接收能力正常,服务器的接收/发送能力正常";
    • 服务器仅确认"客户端的发送能力正常,自己的接收能力正常",但无法确认客户端是否收到自己的响应。
  3. 第三次握手验证 :
    • 服务器收到ACK后,确认"客户端的接收能力正常,自己的发送能力正常";
    • 至此,双方确认彼此的收发能力均正常,TCP连接建立完成。

为什么需要三次握手?

  • 防止"失效的连接请求报文"被服务器接收,导致资源浪费(如客户端发送的连接请求延迟到达,服务器建立无效连接);
  • 三次握手是"双向验证"的最小次数(两次无法完成双向验证,四次冗余)。

核心目的总结

确认双方的发送和接收能力:通过"一发一收"的确认机制。

同步初始序列号:交换并确认彼此的初始序列号,这是实现TCP可靠传输(如数据排序、去重、流量控制)的基石。

防止旧连接初始化造成混乱:如上所述,避免网络中的延迟报文导致服务器错误地创建连接。


相关推荐
福兮说8 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
凤城老人9 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)9 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan10 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_10 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
yivifu11 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
weixin_4482902512 小时前
书庐开发实战教学
javascript·css·html
默_笙12 小时前
🛴 从散件到整机:DeepAgents 与 Agent 身上预留的那些"插槽"(前置介绍)
前端·javascript
一木 之林13 小时前
DeepSeek Agent 开发(一)
开发语言·前端·javascript
樱花落木兰14 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存