TCP/IP 协议核心技术:三次握手、四次挥手与拥塞控制算法

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的工作原理对于网络编程和性能调优至关重要。