TCP(Transmission Control Protocol)是互联网中最重要的传输层协议之一,其设计目标是提供可靠的、面向连接的、全双工的数据传输服务。本文将从核心机制、工作原理到经典面试题,全面解析 TCP 协议的关键特性。
一、TCP 核心特性
1. 有连接
-
三次握手建立连接,四次挥手释放连接,确保通信双方的数据传输路径畅通。
-
面向连接 vs 无连接(如 UDP):TCP 在数据传输前需要建立虚拟链路,而 UDP 直接发送数据包。
2. 可靠传输
通过以下机制保证数据可靠到达:
-
确认应答(ACK):接收方收到数据后发送 ACK 确认。
-
超时重传:发送方未收到 ACK 时重传数据。
-
序列号与确认号:标识数据包的顺序和完整性。
3. 面向字节流
-
数据被看作无结构的字节流,发送方和接收方通过缓冲区处理数据。
-
粘包问题:多个数据包在传输中粘连,需应用层处理(如定义消息边界)。
4. 全双工通信
-
双方可同时发送和接收数据,通过独立的发送和接收缓冲区实现。
二、TCP 可靠传输的核心机制
1. 确认应答(ACK)
-
核心原理:接收方收到数据后返回 ACK(确认号 = 已接收数据的下一字节序号)。
-
示例:
-
发送方发送数据包
Seq=1, Len=100
→ 接收方返回ACK=101
。 -
若发送方未收到 ACK,触发超时重传。
-
2. 超时重传
-
动态计算超时时间(RTO):基于网络往返时间(RTT)调整。
-
快速重传:收到 3 个重复 ACK 时立即重传,无需等待超时。
3. 滑动窗口
-
核心作用:提高传输效率,允许发送方连续发送多个数据包而无需等待单个 ACK。
-
窗口大小:由接收方通过 TCP 头部字段通告,动态调整(流量控制)。
三、TCP 连接管理:三次握手与四次挥手
1. 三次握手(建立连接)
Client Server|-------- SYN (Seq=100) --------->| |<------- SYN+ACK (Seq=300, ACK=101) ----||-------- ACK (ACK=301) --------->|
关键问题:
-
为什么需要三次握手?
防止已失效的连接请求突然到达服务器,导致资源浪费(如网络延迟导致的旧 SYN 包)。 -
握手过程中的状态转换:
-
Client:
SYN_SENT
→ESTABLISHED
-
Server:
LISTEN
→SYN_RCVD
→ESTABLISHED
-
2. 四次挥手(释放连接)
Client Server|-------- FIN (Seq=500) --------->| |<------- ACK (ACK=501) ----------||<------- FIN (Seq=700) ----------||-------- ACK (ACK=701) --------->|
关键问题:
-
为什么需要四次挥手?
TCP 是全双工的,需双方独立关闭发送和接收通道。 -
TIME_WAIT 状态的作用:
-
确保最后一个 ACK 到达服务器。
-
允许旧数据包在网络中消散,避免新连接收到旧数据。
-
四、其他关键机制
1. 流量控制
-
滑动窗口协议:接收方通过 TCP 头部的
窗口大小
字段告知发送方可接收的数据量。 -
零窗口探测:当接收方窗口为0时,发送方定期发送探测包。
2. 拥塞控制
-
慢启动:初始窗口较小,指数级增长。
-
拥塞避免:窗口线性增长,避免网络过载。
-
快速恢复:在快速重传后调整窗口大小。
五、经典面试题解析
1. 三次握手中交换了哪些信息?
-
Client 发送 SYN 包:初始序列号(ISN)、窗口大小、支持的 TCP 选项(如 MSS)。
-
Server 返回 SYN+ACK 包:ISN、ACK 号、窗口大小、TCP 选项。
-
Client 发送 ACK 包:确认号。
2. SYN 洪泛攻击是什么?如何防御?
-
攻击原理:攻击者发送大量 SYN 包但不完成握手,耗尽服务器资源。
-
防御方案:SYN Cookie、限制半连接数、使用防火墙过滤异常流量。
3. TIME_WAIT 状态为什么要等待 2MSL?
-
MSL(Maximum Segment Lifetime):报文最大生存时间(通常 30s–2min)。
-
等待 2MSL:确保最后一个 ACK 到达 + 旧数据包从网络中消失。
4. TCP 如何保证数据顺序?
-
通过序列号(Seq)和确认号(ACK)标识数据包的顺序,接收方按序重组数据。
5. 什么是 Nagle 算法?
-
目的:减少小数据包的发送次数,合并多个小数据包。
-
触发条件:发送方在未收到前一个数据包的 ACK 时,缓存后续数据。
六、总结
TCP 协议的复杂性体现在其精细设计的可靠传输机制、连接管理策略和动态调整算法。实际应用中需结合 Wireshark 抓包工具观察 TCP 行为,或通过netstat
命令查看连接状态。