TCP

提供 面向连接 的,可靠 的数据传输服务

#status / growing #type / concept

[!info] related notes

TCP

TCP(Transmission Control Protocol,传输控制协议):传输层协议,提供面向连接可靠字节流传输服务。通过序列号、确认应答、重传机制、流量控制和拥塞控制来保证数据完整有序地送达。

TCP 报文头关键字段

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |       |C|E|U|A|P|R|S|F|                               |
| Offset| Rsrvd |W|C|R|C|S|S|Y|I|            Window             |
|       |       |R|E|G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明
Sequence Number本报文段数据的第一个字节的序号
Acknowledgment Number期望收到对方下一个报文段的第一个字节的序号
SYN同步位,连接建立时置 1
ACK确认位,置 1 时 Acknowledgment Number 有效
FIN终止位,表示发送方数据发送完毕
RST重置位,强制关闭连接
Window接收窗口大小,用于流量控制

三次握手(建立连接)

客户端                        服务器
  |                              |
  |--- SYN (seq=x) -----------> |  ① 客户端发起连接
  |                              |
  |<-- SYN+ACK (seq=y, ack=x+1) |  ② 服务器确认并同步
  |                              |
  |--- ACK (ack=y+1) ---------->|  ③ 客户端确认
  |                              |
  === 连接建立,双方进入 ESTABLISHED 状态 ===

为什么是三次而非两次? 防止已失效的连接请求到达服务器,导致资源浪费(两次握手无法确认客户端的接收能力)。

四次挥手(断开连接)

客户端                        服务器
  |                              |
  |--- FIN (seq=u) ------------>|  ① 客户端请求关闭
  |                              |
  |<-- ACK (ack=u+1) ---------- |  ② 服务器确认(半关闭)
  |                              |     客户端不再发送,但仍可接收
  |<-- FIN (seq=w) ------------ |  ③ 服务器也请求关闭
  |                              |
  |--- ACK (ack=w+1) ---------->|  ④ 客户端确认
  |                              |
  === 客户端进入 TIME_WAIT(2MSL)后完全关闭 ===

为什么是四次? TCP 是全双工的,每个方向需要单独关闭。服务器收到 FIN 后可能还有数据要发送,不能立即关闭。

流量控制 — 滑动窗口

接收方通过 TCP 报文头中的 Window 字段告知发送方:“我还能接收多少字节”。

发送方窗口:
|--- 已发送已确认 ---|--- 已发送未确认 ---|--- 可发送 ---|--- 不可发送 ---|
                     |<------- 发送窗口 ------->|
  • 窗口大小动态调整:接收方处理能力变弱时缩小窗口,变强时扩大
  • 窗口为 0 时发送方暂停发送,定期探测窗口是否恢复

拥塞控制

防止网络拥塞导致大量丢包,TCP 维护一个拥塞窗口(cwnd)

阶段策略说明
慢启动cwnd 指数增长(1→2→4→8…)从 1 MSS 开始,试探可用带宽
拥塞避免cwnd 线性增长(+1 MSS/RTT)达到阈值后减速增长
快重传收到 3 个重复 ACK 立即重传不等超时,快速恢复
快恢复cwnd 减半(而非归 1)配合快重传,避免重新慢启动

实际发送窗口 = min(接收窗口, 拥塞窗口)。

TCP vs UDP 对比

特性TCPUDP
连接面向连接(三次握手)无连接
可靠性可靠(确认+重传)不可靠(尽力而为)
有序性保证有序(序列号)不保证
流量控制滑动窗口
拥塞控制慢启动/AIMD
头部大小20~60 字节8 字节
速度较慢(控制开销大)较快
适用场景HTTP/FTP/邮件/文件传输DNS/视频流/游戏/VoIP

边界与常见误解

  • TCP 不是”绝对可靠”:它保证数据有序完整送达,但不保证延迟和吞吐量
  • 三次握手不只是”确认双方能收发”:更重要的是同步初始序列号(ISN)
  • TIME_WAIT 不是 bug:2MSL 等待是为了确保最后的 ACK 到达以及让旧报文在网络中消亡
  • TCP 和 UDP 不是对立的:很多协议在 UDP 之上自己实现可靠性(如 QUIC)

相关笔记

创建于 2026/3/12 更新于 2026/5/27