1. TCP协议的三次握手与四次挥手核心原理
TCP协议作为互联网通信的基石,其连接建立与终止机制是每位网络工程师必须掌握的硬核知识。我将用15年网络运维实践中积累的案例,带你看透三次握手和四次挥手背后的设计哲学。
1.1 为什么需要握手过程
想象你要给国外客户打重要电话,会直接开口说业务吗?正常流程一定是:
- "喂,听得到吗?"
- "听得到,您说"
- "好的,那我们开始..."
TCP采用类似的确认机制,核心解决三个关键问题:
- 端点确认:确保通信双方真实存在且愿意通信
- 序列号同步:协商初始序列号(ISN)防止历史报文干扰
- 参数协商:窗口大小、MSS等关键参数需要双方确认
关键细节:初始序列号并非从0开始,而是基于时钟的随机值,这是为了防止历史报文被误认为当前有效数据。
1.2 三次握手的报文交互
通过Wireshark抓包可以看到完整流程:
code复制# 第一次握手 (SYN=1, seq=x)
客户端 -> 服务器: [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256
# 第二次握手 (SYN=1, ACK=1, seq=y, ack=x+1)
服务器 -> 客户端: [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1380
# 第三次握手 (ACK=1, seq=x+1, ack=y+1)
客户端 -> 服务器: [ACK] Seq=1 Ack=1 Win=64240 Len=0
每个字段都有其特殊使命:
- SYN:同步序列号标志
- ACK:确认标志
- Win:通告窗口大小
- MSS:最大报文段长度
1.3 为什么不是两次或四次
这是面试中最常被问到的灵魂问题:
- 两次握手的风险:网络延迟可能导致旧的SYN报文突然到达,服务器误认为新连接
- 四次握手的冗余:服务器的SYN和ACK完全可以合并发送,没必要拆分成两个报文
实际工程中,我们通过TCP的32位序列号机制解决重传和乱序问题。初始序列号(ISN)每4微秒加1,即使连接关闭后也不会立即复用,这被称为TIME_WAIT状态的设计初衷。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
