TCP/IP 协议分层模型
| 层次 | 协议 | 功能 |
|---|---|---|
| 应用层 | HTTP, DNS, SSH, FTP | 应用程序间通信 |
| 传输层 | TCP, UDP | 端到端的数据传输 |
| 网络层 | IP, ICMP, ARP | 数据包路由和转发 |
| 链路层 | Ethernet, Wi-Fi | 物理网络传输 |
TCP 三次握手详解
客户端 服务器
CLOSED LISTEN
|--- SYN (seq=x) ----------------------->| SYN_SENT → SYN_RCVD
|<-- SYN+ACK (seq=y, ack=x+1) ---------| ESTABLISHED ← ESTABLISHED
|--- ACK (ack=y+1) --------------------->|
ESTABLISHED ESTABLISHED
三次握手的本质是确认双方的发送和接收能力:
- 第一次:客户端证明自己能发送
- 第二次:服务器证明自己能接收和发送
- 第三次:客户端证明自己能接收
为什么不是两次握手?
两次握手无法防止已失效的连接请求报文段被服务器接收,造成资源浪费。第三次握手让客户端有机会确认或拒绝无效连接。
TCP 四次挥手详解
客户端 服务器
ESTABLISHED ESTABLISHED
|--- FIN (seq=u) ----------------------->| FIN_WAIT_1 → CLOSE_WAIT
|<-- ACK (ack=u+1) ---------------------| FIN_WAIT_2
|<-- FIN (seq=w) -----------------------| TIME_WAIT ← LAST_ACK
|--- ACK (ack=w+1) --------------------->| TIME_WAIT
| 等待 2MSL | CLOSED
CLOSED
四次挥手是因为TCP是全双工的,每个方向都需要单独关闭。
TIME_WAIT 状态
主动关闭方进入TIME_WAIT状态,持续2MSL(约60秒):
- 确保最后一个ACK能到达被动关闭方
- 让网络中残留的报文段过期
可通过net.ipv4.tcp_tw_reuse = 1或使用长连接来缓解大量TIME_WAIT的问题。
滑动窗口与流量控制
发送方滑动窗口:
[已确认] [已发送未确认] [可发送未发送] [不可发送]
←————— 窗口 ———→
接收方通过窗口大小告知发送方还能接收多少数据。当接收方缓冲区快满时,发送窗口缩小至0,发送方暂停。
TCP 拥塞控制
慢启动
拥塞窗口从1个MSS开始,每收到一个ACK翻倍(指数增长),直到达到慢启动阈值。
拥塞避免
超过阈值后,每个RTT只增加1个MSS(线性增长)。
快重传
收到3个重复ACK时,不等超时立即重传丢失的报文段。
快恢复
快重传后将cwnd减半,不回到慢启动阶段。
Linux TCP 参数调优
# 启用TIME_WAIT复用
net.ipv4.tcp_tw_reuse = 1
# 增加SYN队列长度
net.ipv4.tcp_max_syn_backlog = 65535
# 启用SYN Cookie
net.ipv4.tcp_syncookies = 1
# 启用BBR拥塞控制算法
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 优化TCP缓冲区
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
BBR算法相比传统CUBIC算法,在高延迟网络中能提升10-25%的吞吐量。
总结
TCP协议通过可靠传输、流量控制和拥塞控制三大机制,确保数据在复杂的网络环境中正确、高效地传输。理解TCP的工作原理对于网络编程和性能调优至关重要。