🌐

TCP 协议深度解析

Transmission Control Protocol — 互联网基石协议

三次握手 可靠传输 流量控制 拥塞控制

目录

📋
TCP 头部结构
深入解析 TCP 报文格式与各字段含义
🤝
三次握手 & 四次挥手
连接建立与终止的完整生命周期
可靠传输机制
序列号、确认应答、重传与滑动窗口
🚦
流量与拥塞控制
滑动窗口、慢启动、拥塞避免算法
01

TCP 头部结构

TCP Header Format — 协议的控制信息载体

TCP 报文头部格式

TCP 头部固定 20 字节(不含选项),最多 60 字节

0
8
16
24
31
16源端口号
16目的端口号
32序列号 (Sequence Number)
32确认号 (Acknowledgment Number)
4数据偏移
6保留
6标志位
16窗口大小
16校验和
16紧急指针
关键标志位
SYN 建立连接 | ACK 确认应答 | FIN 终止连接 | RST 重置连接 | PSH 推送数据 | URG 紧急数据
02

三次握手 & 四次挥手

Connection Lifecycle — 连接的建立与终止

三次握手 (Three-Way Handshake)

确保双方都能正常收发数据,同步序列号

💻
客户端
🖥️
服务器
SYNseq=x
SYN+ACKseq=y, ack=x+1
ACKack=y+1
第一次握手
客户端发送 SYN=1, seq=x,进入 SYN_SENT 状态
第二次握手
服务器回复 SYN+ACK, seq=y, ack=x+1,进入 SYN_RCVD
第三次握手
客户端发送 ACK, ack=y+1,双方进入 ESTABLISHED

四次挥手 (Four-Way Handshake)

双方独立关闭连接,确保数据完整传输

  • 第一次挥手
    主动方发送 FIN=1, seq=u,进入 FIN_WAIT_1 状态,表示"我没有数据要发了"
  • 第二次挥手
    被动方回复 ACK, ack=u+1,进入 CLOSE_WAIT;主动方进入 FIN_WAIT_2
  • 第三次挥手
    被动方发送 FIN=1, seq=w,进入 LAST_ACK 状态,表示"我也准备关闭了"
  • 第四次挥手
    主动方回复 ACK, ack=w+1,等待 2MSL 后关闭;被动方收到后立即关闭
为什么需要四次?
TCP 支持半关闭(half-close),每一方可以独立关闭自己的数据发送通道,因此 FIN 需要分别发送。
03

可靠传输机制

Reliable Delivery — 确保数据完整有序到达

序列号与确认应答

TCP 为每字节数据编号,通过确认应答保证可靠性

序列号 (Sequence Number)
表示本报文段发送数据的第一个字节的编号。初始序列号 (ISN) 基于时钟随机生成,防止旧报文干扰。
确认号 (ACK Number)
期望收到对方下一个报文段的第一个字节编号。若 ACK=N,则 N-1 为止的数据已正确接收。

数据传输过程示意

💻 ──seq=1,len=100──▶ 🖥️
💻 ◀──ack=101,win=1000── 🖥️
💻 ──seq=101,len=100──▶ 🖥️
累计确认机制
TCP 使用累计确认:ACK=N 表示 N-1 之前的所有数据已收到,无需逐段确认。

重传机制

当数据丢失或 ACK 丢失时,TCP 如何恢复

超时重传 (RTO)
发送数据后启动重传计时器。若超时未收到 ACK,则重传数据。RTO 基于 RTT 动态计算:

RTO = RTTs + 4 × RTTd
快速重传 (Fast Retransmit)
收到 3 个重复 ACK 后立即重传丢失报文,无需等待超时。大幅降低重传延迟。

RTT 与 RTO 关系

发送 ACK到达 RTT RTO (略大于RTT)
Jacobson/Karels 算法
通过测量 RTT 的均值和偏差,动态调整 RTO,适应网络变化。

滑动窗口 (Sliding Window)

实现流水线传输,提高信道利用率

窗口滑动过程

← 已确认在途数据可发送 →不可发送 →
已确认 在途(已发送未确认) 可发送 窗口外
发送窗口
min(rwnd, cwnd) — 取接收方窗口和拥塞窗口的最小值
窗口滑动
收到新的确认后,窗口向前滑动,允许发送新数据
04

流量控制与拥塞控制

Flow & Congestion Control — 网络资源的智能调度

流量控制 (Flow Control)

基于滑动窗口,防止发送方淹没接收方

接收窗口 (rwnd)
接收方在 ACK 报文中通告自己的接收缓冲区大小,发送方据此调整发送窗口。
零窗口问题
当接收方缓冲区满时通告窗口为 0,发送方暂停发送。接收方处理完后发送窗口更新报文恢复传输。
持续计时器
发送方收到零窗口通告后启动持续计时器,定期发送窗口探测报文,避免窗口更新报文丢失导致死锁。

流量控制示意

发送方 发送窗口 接收方 接收窗口(rwnd) 数据流 ACK + rwnd 接收缓冲区
关键公式
发送窗口上限 = min(rwnd, cwnd)
rwnd 由接收方决定,cwnd 由网络状况决定

拥塞控制 (Congestion Control)

基于拥塞窗口 (cwnd),防止过多数据注入网络

拥塞窗口 cwnd 时间 →
ssthresh
慢启动 拥塞避免 超时 快重传
慢启动
cwnd 从 1 MSS 开始,每 RTT 指数增长
拥塞避免
超过 ssthresh 后线性增长 (+1/RTT)
快重传
3 个重复 ACK 触发立即重传
快恢复
cwnd = ssthresh + 3,直接进入 CA

核心知识总结

TCP 协议四大核心机制一览

📋
TCP 头部
端口号、序列号、确认号、标志位、窗口
🤝
连接管理
三次握手建立、四次挥手终止
可靠传输
序列号、ACK、超时重传、快重传
🚦
拥塞控制
慢启动、拥塞避免、快恢复
TCP 的设计哲学
TCP 通过连接管理建立可靠通道,通过序列号与确认保证数据有序,通过滑动窗口实现高效传输,通过拥塞控制维护网络稳定 — 这些机制共同构成了互联网数据传输的基石。
🎯

Thank You

TCP 协议深度解析 — Q&A

TCP Networking Protocol