#TCP协议
文章目录
-
- 先看下TCP协议头
- TCP如何建立和断开连接
- TCP如何可靠传输
- TCP如何高效传输
-
- 滑动窗口 (Sliding Window)
- [延迟确认 (Delayed ACK) 与 Nagle 算法](#延迟确认 (Delayed ACK) 与 Nagle 算法)
- 拥塞控制 (Congestion Control)
- 总结
先看下TCP协议头

- TCP 头部通常为 20 字节(不含选项),核心字段包括:
| 字段 | 长度 | 作用 |
|---|---|---|
| 端口号 (源端口和目标端口) | 32 bit | 标识发送方和接收方的应用程序。 |
| 序列号 (Seq) | 32 bit | 解决乱序问题,标识本报文段发送的数据组第一个字节的序号。 |
| 确认号 (Ack) | 32 bit | 期望收到的下一个字节序号(ACK = seq + len) |
| 头部长度(Data Offset) | 4 bit | TCP 头部长度(单位:4 字节),最小值为 5(20 字节) |
| 标记控制位(Flags) | 6 bit | SYN:同步序号,用于建立连接。 ACK:确认序号有效。 FIN:发送方完成发送任务,用于释放连接。 RST:强制重置异常连接。 |
| 窗口大小 (Window Size) | 16 bit | 用于流量控制,告知对方本地目前允许接收的数据量。 |
| 校验和 (Checksum) | 16 bit | 检测数据在传输中是否有差错。 |
| 紧急指针(Urgent Pointer) | 16 bit | 指示紧急数据末尾位置(配合 URG 使用,现代系统基本弃用) |
| 可选性Options | 可变 | 支持 MSS、窗口缩放、时间戳、SACK 等扩展 |
TCP如何建立和断开连接

-
建立连接:三次握手
- 第一次握手:客户端发送 SYN,进入 SYN_SENT 状态。(确认客户端发送能力)
- 第二次握手:服务端返回 SYN + ACK,进入 SYN_RCVD 状态。(确认服务端接收和发送能力,进入SYN_RECV半连接队列)
- 第三次握手:客户端发送 ACK,双方进入 ESTABLISHED 状态。(确认客户端接收能力,进入ACCEPT全队列)
- 知识点1:服务端监听时指定的backlog半连接、全连接的总和:SYN_RECV连接队列,ACCEPT连接队列,调用accept()方法取走连接
- 知识点2:为什么不是两次?为了防止已失效(迷路)的连接SYN请求突然又传送到了服务端,导致产生脏连接消耗服务端资源。
-
端口连接:四次挥手
- 第一次挥手:客户端发送 FIN。(我不发数据了)
- 第二次挥手:服务端返回 ACK。(收到,但我可能还没发完,你等会)
- 第三次挥手:服务端发完剩余数据,发送 FIN。(我也发完了,断开吧)
- 第四次挥手 :客户端返回 ACK,进入 TIME_WAIT 状态,等待 2MSL 后彻底关闭。
- 知识点1:拔网线连接是否会断开?不会立即断开,连接仍处于
ESTABLISHED状态("假连接") - 知识点2:为什么需要 TIME_WAIT?防止相同的四元组立断开后立即建立新连接,导致数据错乱
TCP如何可靠传输

- 序列号与确认应答 (Seq & Ack):给每个字节编号。接收方收到后必须回传 ACK,否则发送方认为丢失。
- 超时重传 (Retransmission):发送方在规定时间内没收到 ACK,就重新发送该数据。
- 丢弃重复与乱序重排:利用序列号,接收端会自动剔除重复数据,并按顺序组装被拆分的报文。
- 流量控制 (Flow Control) :利用滑动窗口。接收方根据自己的处理能力告知发送方:"我还能收多少",防止发送方发太快导致接收方缓冲区溢出。
- 校验和 (Checksum):通过数学算法校验数据块,如果校验失败,直接丢弃。
TCP如何高效传输

滑动窗口 (Sliding Window)
- 如果不使用窗口,发一个包等一个 ACK,效率极低。
- 窗口允许发送方在不等待 ACK 的情况下连续发送多个包,极大提高了吞吐量。
延迟确认 (Delayed ACK) 与 Nagle 算法
- 延迟确认:接收方不立即回 ACK,而是等一会(通常<200ms),看有没有数据要回传给发送方,顺便把 ACK 带回去(捎带应答),减少包数量。
- Nagle 算法:将多个细小的包合并成一个大包再发送,减少网络包头的开销。
拥塞控制 (Congestion Control)
这是针对整个网络状况的"宏观调控",防止网络拥堵导致崩溃:
- 慢启动 (Slow Start):初始发送量小,按指数级倍增(1, 2, 4, 8...)。
- 拥塞避免 (Congestion Avoidance):达到阈值后,改为线性增长,小步快跑。
- 快重传 (Fast Retransmit):如果接收方收到乱序包,连续发 3 个冗余 ACK,发送方立刻重传,无需等待超时。
- 快恢复 (Fast Recovery):网络波动后不直接回到慢启动,而是减半窗口快速恢复。
总结
- "在不可靠的网络上构建可靠的传输" ------ 通过确认应答、超时重传、滑动窗口、拥塞控制等机制,在尽力而为的 IP 网络之上,提供应用所需的稳定数据通道。