三次握手建立连接,四次挥手释放连接——TCP协议的核心机制
TCP协议的三次握手(Three-way Handshake)和四次挥手(Four-way Handshake)是建立和终止可靠网络连接的核心机制,它们确保了通信双方能够同步状态并安全地交换数据;
TCP连接的常用术语
术语 | 全称 | 含义说明 |
---|---|---|
SYN | Synchronous | 建立连接标志位。用于发起连接请求,携带初始序列号(ISN)。在三次握手中前两次出现。 |
ACK | Acknowledgement | 确认标志位。表示已收到数据,携带确认号(Acknowledge number)。建立连接后所有报文必须设置ACK=1。 |
PSH | Push | 推送标志位。要求接收方立即将数据提交给应用层(而非等待缓冲区满)。常见于HTTP请求/响应报文。 |
FIN | Finish | 终止连接标志位。表示发送方数据已发送完毕,请求关闭连接。在四次挥手中由双方各发送一次。 |
RST | Reset | 复位标志位。强制中断异常连接(如端口未监听、处理超时),接收方会立即释放资源。 |
URG | Urgent | 紧急标志位。表示报文包含紧急数据,需优先处理(配合紧急指针使用)。实际应用较少。 |
Seq | Sequence Number | 32位序列号。标识数据字节流的起始位置(首字节编号)。建立连接时随机生成,后续按数据长度递增。 |
Ack | Acknowledge Number | 32位确认号。期望收到的下一字节序列号(值为收到的Seq+数据长度)。若携带数据,则下次Seq=本次Ack。 |
Window Size | Advertised Window | 16位窗口大小。接收方告知发送方可接收的数据量(流量控制)。动态调整防止缓冲区溢出。 |
Checksum | Header Checksum | 16位校验和。验证TCP头部和数据完整性,防止传输错误。 |
Data Offset | Header Length | 4位头部长度。标识TCP头部长度(单位:4字节),用于定位数据起始位置。 |
Flags | Control Bits | 9位控制位集合。包含SYN/ACK/PSH/FIN/RST/URG等标志位(各占1位)。 |
MSS | Maximum Segment Size | 最大报文长度。在SYN报文中协商,表示本方可接收的最大TCP数据段(不含头部)。典型值1460字节(以太网)。 |
ISN | Initial Sequence Number | 初始序列号。连接建立时随机生成的Seq起始值,防止历史报文混淆(旧连接报文ISN不同)。 |
TIME_WAIT | Time Wait State | 主动关闭方最终状态。等待2MSL(60-120秒)确保被动方收到ACK,同时让网络中旧报文失效。 |
MSL | Maximum Segment Lifetime | 报文最大生存时间。IP报文在网络中的最长存在时间(通常30秒-2分钟),TIME_WAIT=2MSL。 |
关键补充说明:
-
Seq与Ack的协作
-
发送数据:
Seq
标识数据起始位置(如Seq=100,数据长度50 → 下一包Seq=150) -
确认数据:
Ack=101
表示已正确接收Seq=100的数据,期望接收Seq=101的数据
-
-
标志位组合示例
场景
典型标志位组合
建立连接
SYN=1, ACK=0
确认连接
SYN=1, ACK=1
数据传输
ACK=1, PSH=1(可选)
关闭连接
FIN=1, ACK=1
强制中断
RST=1, ACK=1
-
为什么需要随机ISN?
防止历史连接干扰:若ISN固定,延迟的旧报文可能被误认为新连接数据,随机ISN大幅降低冲突概率(32位空间约42亿组合)
✅ TCP 三次握手过程详解
确保客户端(Client)和服务端(Server)双向通信能力正常,并同步初始序列号(ISN),防止历史连接混淆。
整个连接过程分为三个部分:1、连接建立 2、数据传输 3、连接关闭
📌 第一次握手:
- 客户端(主机A) 向 服务器(主机B) 发送一个 TCP 报文段。
- 标志位
SYN = 1
,表示请求建立连接。 - 随机生成一个初始序列号
seq = x
。
- 标志位
- 此时客户端进入 SYN_SENT 状态,等待服务器确认。
🔹 报文内容:
SYN=1
,seq=x
📌 第二次握手:
- 服务器(主机B) 收到请求后,回应一个 TCP 报文段。
- 设置标志位
SYN = 1
和ACK = 1
,表示同意建立连接并确认收到客户端的 SYN。 - 确认号
ack = x + 1
,即对客户端的seq=x
进行确认。 - 随机生成自己的初始序列号
seq = y
。
- 设置标志位
🔹 报文内容:
SYN=1
,ACK=1
,ack=x+1
,seq=y
📌 第三次握手:
- 客户端(主机A) 接收到服务器的响应后,进行验证:
- 检查确认号
ack
是否为x + 1
。 - 检查
ACK
标志是否为 1。
- 检查确认号
- 若验证通过,则发送最后一个确认报文:
- 标志位
ACK = 1
。 - 确认号
ack = y + 1
,即对服务器的seq=y
进行确认。
- 标志位
🔹 报文内容:
ACK=1
,ack=y+1
✅ 握手完成:
- 服务器收到第三次握手的确认报文后,双方连接正式建立,可以开始传输数据。
- 客户端和服务器都进入 ESTABLISHED(已建立连接) 状态。
为什么是三次?
-
两次握手的风险: 若失效的
SYN
报文延迟到达服务端,服务端会误认为新连接已建立(浪费资源)。 -
三次握手解决: 客户端在第三步能判断是否是历史连接(通过
ACK
的合理性),决定是否终止。
✅ TCP 四次挥手过程详解
TCP 是全双工通信,因此连接的关闭需要双方都确认不再发送数据。四次挥手是为了确保数据完整传输后,安全地关闭连接。
📌 参与角色:
- 主机A(客户端 或 主动关闭方)
- 主机B(服务器 或 被动关闭方)
📌 第一次挥手:
- 主机A 发送一个 FIN 报文段,表示自己不再发送数据,但仍可以接收数据。
- 标志位
FIN = 1
- 序列号
seq = u
(前面已传输数据的最后一个字节序号 + 1)
- 标志位
🔹 报文内容:
FIN=1
,seq=u
- 此时主机 A 进入 FIN-WAIT-1 状态。
📌 第二次挥手:
- 主机B 收到 FIN 后,发送一个 ACK 报文段进行确认。
- 标志位
ACK = 1
- 确认号
ack = u + 1
(对主机 A 的 FIN 进行确认)
- 标志位
🔹 报文内容:
ACK=1
,ack=u+1
- 主机 B 进入 CLOSE-WAIT 状态;主机 A 收到后进入 FIN-WAIT-2 状态。
📌 第三次挥手:
- 主机B 处理完自己的数据后,发送 FIN 报文段给主机 A,表示它也要关闭连接。
- 标志位
FIN = 1
- 序列号
seq = v
(根据前面的数据序号继续)
- 标志位
🔹 报文内容:
FIN=1
,seq=v
- 主机 B 进入 LAST-ACK 状态;主机 A 收到后进入 CLOSE-WAIT 并发送最后的 ACK。
📌 第四次挥手:
- 主机A 收到主机 B 的 FIN 后,回复一个 ACK 报文段进行确认。
- 标志位
ACK = 1
- 确认号
ack = v + 1
- 标志位
🔹 报文内容:
ACK=1
,ack=v+1
- 主机 A 进入 TIME-WAIT 状态,并等待 2MSL(Maximum Segment Lifetime)时间后正式关闭连接;
- 主机 B 收到 ACK 后进入 CLOSED 状态。
✅ 挥手完成:
- 双方连接完全关闭,资源释放。
- TIME-WAIT 状态的存在是为了确保最后一个 ACK 能被对方收到,防止“网络中残留报文”干扰新连接。
🧠 小贴士:
-
关闭双向通道: 收到对方的
FIN
只表示对方不再发送数据,己方可能仍需发送剩余数据。 -
步骤拆分: 被动方的
ACK
(第二步)和FIN
(第三步)无法合并(因应用层关闭时间不确定)。
问题 | 解释 |
---|---|
为什么是四次? | 因为 TCP 是全双工通信,每一端都需要单独关闭发送方向 |
为什么要有 TIME-WAIT? | 确保最后一个 ACK 被对方收到;避免旧报文干扰新连接 |
如果第三次挥手丢失怎么办? | 主机 B 会重传 FIN,直到收到 ACK |
关键问题解析
1. TIME_WAIT
状态的作用(等待2MSL)
-
确保被动方收到
ACK
: 若ACK
丢失,被动方会重发FIN
,主动方能响应。 -
消除历史报文干扰: 等待足够时间(
2MSL
,通常1-4分钟),确保网络中所有此连接的报文消失。
2. 半关闭状态(Half-Close)
-
第二次挥手后,连接处于半关闭状态:被动方仍可发送数据(如传输剩余文件)。
3. 异常情况处理
-
握手失败: 若
SYN
未收到响应,客户端会超时重试(指数退避)。 -
挥手
ACK
丢失: 被动方重发FIN
,主动方在TIME_WAIT
期间可响应。
TCP报文格式
- 源端口号(Source Port,16位):发送方的端口号。
- 目的端口号(Destination Port,16位):接收方的端口号。
- 序列号(Sequence Number,32位):用于对发出的数据包进行编号,以保证数据传输的顺序和准确性。
- 确认号(Acknowledgment Number,32位):期望从对方接收到的下一个字节的序列号,实现可靠传输。
- 头部长度(Data Offset,4位):指示TCP头的长度,以32位字为单位。通常最小值是5,表示没有选项的情况。
- 保留字段(Reserved,6位):保留供将来使用的字段,目前必须设置为0。
- 标志位(Flags,6位):
- CWR (Congestion Window Reduced): 拥塞窗口减少标志。
- ECE (ECN-Echo): 显示网络拥塞或支持显式拥塞通知。
- URG (Urgent Pointer field significant): 紧急指针字段有效。
- ACK (Acknowledgment field significant): 确认号字段有效。
- PSH (Push function): 推送功能。
- RST (Reset the connection): 重置连接。
- SYN (Synchronize sequence numbers): 同步序号用于发起连接。
- FIN (No more data from sender): 发送方已无数据发送。
- 窗口大小(Window Size,16位):表示发送本报文段的一方的接收窗口还有多少空间,用于流量控制。
- 校验和(Checksum,16位):用于确保TCP报文段在传输过程中的完整性。
- 紧急指针(Urgent Pointer,16位):只有当URG标志被设置时才有效,它指出本报文段中紧急数据的位置。
- 选项(Options,长度可变):可选参数,如最大报文段长度(MSS)、窗口扩大因子等。
- 填充(Padding):使整个TCP头部的长度为32位的整数倍,一般用0填充。