TCP(传输控制协议)是互联网的基石协议之一。它提供了面向连接、可靠、基于字节流的传输服务。与UDP的简单封装不同,TCP通过复杂的机制保证了数据在网络中传输的可靠性
# 硬核图解 | TCP协议:从三次握手到拥塞控制,一篇看懂
> 网络编程面试必考,也是理解互联网数据可靠传输的关键
TCP(传输控制协议)是互联网的基石协议之一。它提供了**面向连接、可靠、基于字节流**的传输服务。与UDP的简单封装不同,TCP通过复杂的机制保证了数据在网络中传输的可靠性。
本文将从TCP的核心特性出发,深入讲解**连接状态机、三次握手与四次挥手、TIME_WAIT状态的意义,以及拥塞控制算法**等高级主题。
---
## 01 第一部分:TCP协议核心特性
### 一、协议特点
| 特性 | 说明 |
|------|------|
| 面向连接 | 通信前必须建立连接(三次握手),结束后断开连接(四次挥手) |
| 可靠传输 | 通过确认应答、超时重传、去重、乱序重排保证可靠性 |
| 流式服务 | 数据以字节流形式传输,无固定边界 |
| 全双工通信 | 双方可同时发送和接收数据 |
### 二、可靠性实现机制
**确认应答(ACK)**:接收方收到数据后发送确认信息,告知发送方数据已到达。
**超时重传**:发送方发送数据后启动定时器,若未收到确认则重发数据包。
```java
// 超时重传示意
发送端: 发送 seq=1 → 启动定时器
接收端: 收到数据 → 发送 ACK=2
发送端: 收到 ACK → 取消定时器
// 如果 ACK 丢失
发送端: 发送 seq=1 → 启动定时器
接收端: 收到数据 → 发送 ACK=2 (丢失)
发送端: 定时器超时 → 重传 seq=1
去重处理:通过报文序号识别并丢弃重复数据包。
乱序重排:根据序号重新排列到达顺序错乱的数据包。
三、滑动窗口机制
滑动窗口是TCP的流量控制机制,用于调节发送速率,防止接收方缓冲区溢出。
工作原理:
四、TCP 与 UDP 协议对比
选择依据:
02 第二部分:TCP 连接状态机
一、状态总览
TCP连接从创建到关闭会经历多个状态变化,监控连接状态对排查网络问题至关重要。
二、状态观察方法
# 查看TCP连接状态
netstat -natp
# 输出示例
# Proto Recv-Q Send-Q Local Address Foreign Address State
# tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
# tcp 0 0 192.168.1.146:6000 192.168.1.100:54321 ESTABLISHED
# tcp 0 0 192.168.1.146:6000 192.168.1.100:54322 TIME_WAIT
03 第三部分:TCP 三次握手
一、握手流程
| | | |
|---|
| | | |
| | SYN=1, ACK=1, seq=y, ack=x+1 | |
| | | |
二、为什么不能是两次握手?
两次握手的缺陷:无法确认客户端存活状态。
// 攻击场景
客户端发送SYN → 立即退出
服务端回复SYN+ACK → 等待客户端ACK(永远不会到来)
服务端资源被占用,造成资源浪费
三次握手的必要性:第三次ACK确认双方状态同步,防止半开连接。
三、SYN Flood 攻击
攻击原理:攻击者发送大量伪造SYN包,占满服务器的未完成握手队列。
防御措施:
04 第四部分:TCP 四次挥手
一、挥手流程
二、为什么是四次挥手?
TCP是全双工通信,双方需要独立关闭自己的发送通道。
能否简化为三次?
- 当被动方收到FIN后立即关闭连接时,可将FIN与ACK合并发送
- 协议设计为四次是因为无法预知程序员何时调用close(),需要保持ACK的即时性
三、TIME_WAIT 状态详解
持续时间:2MSL(Maximum Segment Lifetime),通常约2分钟。
出现场景:仅出现在主动关闭连接的一端。
存在原因:
| |
|---|
| 确保最后一次ACK丢失时能处理重传的FIN报文。若直接关闭,对方重发FIN将收到RST响应导致错误 |
| 等待2MSL时间确保所有报文在网络中消失,防止旧连接的延迟报文被新连接误接收 |
实际影响:
- 可通过设置
SO_REUSEADDR套接字选项重用端口
// 解决 TIME_WAIT 导致的端口占用问题
int opt = 1;
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
05 第五部分:TCP 头部结构
TCP报文头部可同时携带序号和确认号字段,这是实现可靠传输的关键技术基础。
0123
01234567890123456789012345678901
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源端口(16位) | 目的端口(16位) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 序列号(32位) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 确认号(32位) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据偏移 | 保留 | 标志位 | 窗口大小(16位) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 校验和(16位) | 紧急指针(16位) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 选项(最多40字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
关键标志位:
06 第六部分:拥塞控制
一、核心目标
提高网络利用率,降低丢包率,保证网络资源对每条数据流的公平性。
二、四个核心机制
三、慢启动机制
工作原理:初始cwnd=2-4 SMSS,每RTT时间窗口大小翻倍。
类比说明:如同高速公路车流控制,逐步增加避免瞬间拥堵。
四、拥塞避免
达到慢启动阈值(ssthresh)后,采用加法增大策略:
五、快速重传与快速恢复
触发条件:收到3个重复ACK(表明有报文段丢失)。
快速重传:立即重传丢失报文段,不必等待超时计时器。
快速恢复:
- cwnd设置为新的ssthresh(或ssthresh+3)
检测到丢包
│
▼
ssthresh = cwnd ÷ 2
│
▼
cwnd = ssthresh + 3(快速恢复)
│
▼
进入拥塞避免阶段(线性增长)
六、AIMD 原则
07 第七部分:HTTP 协议基础
一、HTTP 请求方法
二、HTTP 状态码分类
| | |
|---|
| | |
| | |
| | 301 Moved, 302 Found, 304 Not Modified |
| | 400 Bad, 401 Unauthorized, 403 Forbidden, 404 Not Found |
| | 500 Internal, 503 Unavailable |
三、HTTP 通信流程
浏览器访问网页的过程:
1. DNS解析:将域名解析为IP地址
2. TCP三次握手:与服务器建立连接(默认端口80)
3. 发送HTTP请求:GET /index.html HTTP/1.1
4. 服务器响应:HTTP/1.1200 OK
5. 浏览器渲染:呈现页面内容
6. TCP四次挥手:关闭连接(或保持持久连接)
08 知识小结
本文详细讲解了TCP协议的核心机制:
- 状态机:从LISTEN到ESTABLISHED,再到TIME_WAIT的完整状态转换
- 拥塞控制:慢启动、拥塞避免、快速重传、快速恢复四大机制
希望这篇文章能帮助你彻底搞懂TCP协议。如果觉得有用,欢迎点赞、在看、转发支持!