深入理解 TCP 协议
TCP(Transmission Control Protocol,传输控制协议)是互联网协议族中最重要的协议之一。它位于传输层,为应用层提供可靠的、面向连接的字节流服务。
TCP 的核心特性
- 面向连接:在传输数据前,必须先建立连接(三次握手)。
- 可靠性:通过确认应答、超时重传、错误校验等机制保证数据完整到达。
- 全双工通信:连接的两端可以同时发送和接收数据。
- 流量控制与拥塞控制:动态调整发送速率,防止网络拥塞或接收端缓冲区溢出。
三次握手:建立连接
三次握手是为了确保客户端和服务器都具备发送和接收数据的能力,并同步序列号。
- 第一次握手 (SYN):客户端发送
SYN包(序列号seq=x),进入SYN_SENT状态。 - 第二次握手 (SYN+ACK):服务器收到后,回复
SYN+ACK包(序列号seq=y, 确认号ack=x+1),进入SYN_RCVD状态。 - 第三次握手 (ACK):客户端收到后,回复
ACK包(确认号ack=y+1),双方进入ESTABLISHED状态。
为什么不是两次? 为了防止失效的连接请求报文段突然又传送到了服务端,产生错误或浪费资源。
四次挥手:断开连接
由于 TCP 是全双工的,每个方向的连接都需要单独关闭。
- 第一次挥手 (FIN):客户端发起关闭请求,发送
FIN,进入FIN_WAIT_1。 - 第二次挥手 (ACK):服务器收到后回复
ACK,进入CLOSE_WAIT。此时客户端到服务器的连接释放,但服务器仍可向客户端发送数据。 - 第三次挥手 (FIN):服务器数据发送完毕,发送
FIN,进入LAST_ACK。 - 第四次挥手 (ACK):客户端收到后回复
ACK,进入TIME_WAIT。等待2MSL(最大报文生存时间)后彻底关闭。
可靠传输机制
1. 确认应答(ACK)
接收端收到数据后会回复确认号,告知发送端:“我已经收到了第 N 字节之前的所有数据”。
2. 超时重传
若发送端在一定时间内未收到 ACK,会认为数据丢包并重新发送。
3. 滑动窗口(流量控制)
TCP 利用滑动窗口实现流量控制。接收端会告诉发送端自己的“接收窗口”大小,发送端据此限制发送速率,避免接收端处理不过来。
4. 拥塞控制
当网络出现拥塞时,TCP 会通过以下四个算法降低发送速率:
- 慢启动:指数级增长发送窗口。
- 拥塞避免:线性增长发送窗口。
- 快重传:收到三个重复 ACK 时立即重传。
- 快恢复:丢包后不直接回到慢启动,而是减半窗口。
TCP vs UDP
| 特性 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输(无丢包、顺序准确) | 不可靠(尽力而为) |
| 传输形式 | 字节流 | 数据报 |
| 速度 | 较慢(首部开销大、有确认机制) | 快(首部小、无连接) |
| 应用场景 | Web、文件传输、邮件 | 视频流、实时游戏、DNS |
总结
TCP 是一种复杂的协议,其设计的核心在于如何在不可靠的 IP 网络上构建可靠的通信渠道。虽然它的开销比 UDP 大,但在绝大多数需要数据准确性的场景下,它是不可或缺的选择。