在网络通信中,TCP(Transmission Control Protocol)作为面向连接、可靠传输的协议,是客户端与服务器稳定通信的基石。本章将深入讲解 TCP 的结构、连接管理流程、状态转换、粘包问题等关键技术细节。
一、TCP 协议概述
特性 | 说明 |
---|---|
面向连接 | 通信前需建立连接(三次握手) |
可靠传输 | 序号、确认号、重传机制、窗口控制、拥塞控制等 |
全双工通信 | 客户端与服务器可同时收发数据 |
字节流服务 | 数据以无结构的字节流形式发送 |
二、TCP 首部结构
+-------------------------------+
| 源端口 | 目标端口 |
+-------------------------------+
| 序号 Sequence Number |
+-------------------------------+
| 确认号 Acknowledgment Number |
+-----------+-------------------+
| 数据偏移 | 标志位(SYN/ACK等)|
+-------------------------------+
| 窗口大小 |
+-------------------------------+
| 校验和 |
+-------------------------------+
| 紧急指针 |
+-------------------------------+
常见标志位:
-
SYN
: 建立连接 -
ACK
: 确认应答 -
FIN
: 断开连接 -
RST
: 强制关闭连接 -
PSH
: 推送数据(立即传输) -
URG
: 紧急数据
🤝 三、TCP 三次握手详解
📌 建立连接流程
-
客户端 → 服务器: 发送 SYN,序号为
x
-
服务器 → 客户端: 返回 SYN + ACK,序号为
y
,确认号为x+1
-
客户端 → 服务器: 发送 ACK,确认号为
y+1
客户端 服务器
| --------- SYN --------> |
| <------ SYN+ACK ------- |
| --------- ACK --------> |
连接建立
作用:
-
确保双方收发能力正常
-
分配资源(缓冲区、控制块)
-
防止旧连接干扰(防止重复数据)
四、TCP 四次挥手详解
📌 断开连接流程
-
客户端 → 服务器: 发送 FIN,进入
FIN_WAIT_1
-
服务器 → 客户端: ACK,客户端进入
FIN_WAIT_2
-
服务器 → 客户端: 发送 FIN,进入
LAST_ACK
-
客户端 → 服务器: 回复 ACK,进入
TIME_WAIT
(持续 2MSL)
客户端 服务器
| --------- FIN --------> |
| <--------- ACK -------- |
| <-------- FIN --------- |
| --------- ACK --------> |
关闭完成
为什么不是三次挥手?
因为关闭连接是单向的,即“我不发了”并不代表“我不收了”。
五、TCP 状态机详解(图)
stateDiagram
[*] --> CLOSED
CLOSED --> SYN_SENT: connect()
CLOSED --> LISTEN: listen()
LISTEN --> SYN_RECEIVED: rcv SYN
SYN_SENT --> ESTABLISHED: rcv SYN, send ACK
SYN_RECEIVED --> ESTABLISHED: rcv ACK
ESTABLISHED --> FIN_WAIT_1: close()
FIN_WAIT_1 --> FIN_WAIT_2: rcv ACK
FIN_WAIT_2 --> TIME_WAIT: rcv FIN, send ACK
TIME_WAIT --> CLOSED: timeout(2MSL)
ESTABLISHED --> CLOSE_WAIT: rcv FIN
CLOSE_WAIT --> LAST_ACK: close()
LAST_ACK --> CLOSED: rcv ACK
TIME_WAIT
的意义:
-
确保最后 ACK 抵达对方
-
防止旧连接数据影响新连接
🧩 六、粘包与拆包问题
🧨 发生原因
TCP 是面向流的协议,不保留消息边界。发送方连续发送,接收方可能一次读多条或半条数据。
🛠 常见解决方法
-
定长协议: 固定字节长度(如每条消息 1024 字节)
-
分隔符协议: 使用特殊标记(如
\n
,EOF
) -
长度前缀: 包头携带数据长度(如 TLV)
🧰 七、TCP 参数优化建议
参数 | 建议用途 |
---|---|
tcp_tw_reuse | 是否允许重用 TIME_WAIT 连接 |
tcp_tw_recycle | 已废弃,不建议开启 |
tcp_fin_timeout | 缩短 FIN_WAIT2 等待时间 |
tcp_max_syn_backlog | 增加 SYN 半连接队列,防御 SYN 攻击 |
tcp_syn_retries | 降低 SYN 重试次数,加快失败响应 |
配置示例:
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
八、常见面试题总结
-
三次握手为什么不是两次?(防止旧连接伪装)
-
四次挥手中 TIME_WAIT 的作用?
-
粘包是什么?如何处理?
-
什么是半连接队列?
-
TCP 与 UDP 的区别?
📌 九、本章小结
-
掌握 TCP 的连接建立与释放机制
-
熟悉 TCP 状态机和相关状态的意义
-
理解粘包拆包机制和处理方式
-
掌握 TCP 参数调优与网络故障排查技巧