作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

目前几乎所有的应用都会跟网络打交道,所以我们了解和熟悉网络对我们后续的排错是很有必要的,我这里讲解的部分主要是我个人理解来进行讲解。
前面介绍各种协议:TCP,UDP,ICMP,这里最重要或者使用最广泛的协议就是TCP协议,所以我们会重点来介绍他:今天我们就来讲解3次握手。
TCP(传输控制协议)是一种面向连接、可靠、全双工的传输层协议,其连接建立必须通过三次握手(Three-way Handshake)完成。核心目的是确认客户端与服务端双方的发送、接收能力均正常,并同步双方初始序列号(ISN),为后续可靠数据传输奠定基础。类似于我们打电话,需要说喂,你好!,对方也会回应你,然后才开始通话内容。
以下图片来自于网络

一、前置基础:核心标志位与状态
1. 关键 TCP 标志位
SYN(Synchronize):同步标志位,值为 1 时表示请求建立连接,用于发起握手。
ACK(Acknowledgment):确认标志位,值为 1 时表示确认收到对方报文。
Seq(Sequence Number):序列号,随机生成的初始值,标记发送数据的字节序号,保证数据有序。
Ack(Acknowledgment Number):确认号,值为对方 Seq + 1,表示 “已收到对方数据,期望下一个字节序号”。
2. 初始状态
客户端、服务端初始均为 CLOSED(关闭) 状态,或者说没有建立链接也就是看不到对应的链接的状态。
服务端先创建套接字、绑定端口并监听,进入 LISTEN(监听) 状态,等待客户端连接。
如下图,必须正常监听以后,客户端才能链接进来。

二、三次握手完整流程(图文拆解)
以下图片来自于网络

第一次握手:客户端 → 服务端(SYN 报文)
报文内容:SYN=1,Seq=x(x 为客户端随机初始序列号,无应用数据)。
客户端动作:主动发送连接请求,状态从 CLOSED → SYN-SENT(同步已发送),等待服务端响应,正常这个状态很短暂,我们无法查看到,除非服务器无响应或者网络不可达。比如下图我向一个不可达的地址发送一个请求,也就是如果我们请求地址不能访问就可以这个方式来判断。

服务端动作:处于 LISTEN 状态,收到 SYN 报文后,确认客户端发送能力正常。
通俗理解:客户端说 “我想和你通信,我能发消息,你能收到吗?”
第二次握手:服务端 → 客户端(SYN+ACK 报文)
报文内容:SYN=1,ACK=1,Seq=y,Ack=x+1(y 为服务端随机初始序列号)。
服务端动作:回应连接请求,同时发起自己的同步请求,状态从 LISTEN → SYN-RCVD(同步已接收),时间很短无法通过命令看到。
客户端动作:收到报文后,确认服务端发送、接收能力均正常。
通俗理解:服务端说 “我收到你的请求了,我也能发消息,你能收到吗?”
第三次握手:客户端 → 服务端(ACK 报文)
报文内容:ACK=1,Seq=x+1,Ack=y+1(无应用数据,可携带数据)。
客户端动作:发送最终确认,状态从 SYN-SENT → ESTABLISHED(连接已建立)。
服务端动作:收到 ACK 报文后,确认客户端接收能力正常,状态从 SYN-RCVD → ESTABLISHED。
通俗理解:客户端说 “我收到你的回应了,我们正式开始通信!”
客户端截图,这里就包含网络通信的5元组。

服务端截图,这里一样有5元组。

当然如果链接中断或者关闭这个状态也会改变,比如上图出现了TIME_WAIT,后续还会讲解他。
三、状态转换总览
阶段 | 客户端状态 | 服务端状态 |
|---|---|---|
初始 | CLOSED | CLOSED → LISTEN |
第一次握手后 | SYN-SENT | LISTEN |
第二次握手后 | SYN-SENT | SYN-RCVD |
第三次握手后 | ESTABLISHED | ESTABLISHED |
四、为什么必须是三次?(核心原理)
确保双向通信能力
1 次:仅能确认客户端能发,无法验证接收与服务端能力。
2 次:服务端确认客户端能发,但无法确认客户端能收,可能建立无效连接。
3 次:双方发送、接收能力均被双向验证,满足全双工要求。
防止历史连接干扰
网络延迟可能导致 “旧 SYN 报文” 重复到达。若 2 次握手,服务端收到旧 SYN 就建立连接,会造成资源浪费与错误。
3 次握手中,客户端收到服务端 SYN-ACK 后会校验序列号,拒绝历史连接,保证连接有效性。
同步初始序列号(ISN)
双方随机生成 Seq(x、y),避免数据乱序、重复。通过 Ack 确认,让双方知晓对方起始序号,为数据有序传输做准备。
五、总结
TCP 三次握手是可靠连接建立的核心机制,通过 “请求 - 应答 - 确认” 三步,完成双向能力验证与序列号同步。只有完成三次握手,双方进入 ESTABLISHED 状态,才能开始稳定、有序、可靠地传输 HTTP、FTP 等应用层数据。它是 TCP 可靠性的基础,也是计算机网络与面试中的核心考点。