1 报文格式

  1. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  2. | Source Port (16bit) | Destination Port (16bit) |
  3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4. | Sequence Number (32bit) |
  5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  6. | Acknowledgment Number (32bit) |
  7. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8. | Data | |U|A|P|R|S|F| |
  9. | Offset| Reserved |R|C|S|S|Y|I| Window |
  10. | (4bit)| (10bit) |G|K|H|T|N|N| |
  11. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  12. | Checksum | Urgent Pointer |
  13. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  14. | Options | Padding |
  15. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  16. | data |
  17. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

四元组(源IP、源端口、目标IP、目标端口)唯一标识一个TCP报文。
seq,序列号,告诉对端本次发送数据的 offset,解决乱序问题。
ack,确认应答号,告诉对端已经确认的序列号,解决丢包问题。
win,窗口大小,使用滑动窗口实现流量控制、拥塞控制。

1.2 Flag

标志位
URG
ACK
PSH
RST
SYN
FIN
ECN
CWR

2 连接

2.1 握手

syn_backlog 半连接队列 server SYN_RCVD 时所在的队列
accept队列 全连接队列 server ESTABLISHED,但应用还未 accept() 时所在的队列。min(somaxconn, backlog)
ISN 初始化随机数
如何实现1次、2次、4次握手

2.1.1 配置参数

参数 实际值 备注
somaxconn=1024 3278 /proc/sys/net/core/
backlog listen(int fd, int backlog)
tcp_max_syn_backlog=1024
tcp_synack_retries=5
tcp_syncookies=1 默认打开
tcp_fastopen=0 绕过三次握手
tcp_abort_on_overflow=0 全连接队列满了直接丢弃请求

2.1.2 相关函数

socket()
connect()
bind()
listen()
accept()

2.2 挥手

如何实现1次、2次、3次挥手?

2.2.1 配置参数

参数 实际值 备注
tcp_fin_timeout=60 60 FIN_WAIT_2 超时,默认 60秒(2MSL)
tcp_orphan_retries=8 5 FIN 报文重传次数
tcp_max_orphans=0 16384 限制孤儿连接的个数
tcp_max_tw_buckets=18000 3000 限制 TIME_WAIT 的 socket 数量
so_linger
tcp_tw_reuse=0 复用 TIME_WAIT 的 socket,默认关闭
tcp_timestamps=1

2.2.2 相关函数

close()
shutdown()

4 传输

MSS Maximum Segment Size、最大报文长度。TCP数据最大长度,不包含报文头。
MSL Maximum Segment Lifetime、最大报文寿命。TIME_WAIT 默认 2MSL(60秒)。
RTT Round Trip Time 往返时延。数据到达对端的单程耗时。
RTO Retransmission Timeout 重传超时。应该略大于 RTT。
SACK Selective Acknowledgment 选择性确认。D-SACK
Nagle 发送方避免发送小数据,默认开启,使用 TCP_NODELAY 关闭。
紧急指针

参数 实际值 备注
tcp_window_scaling=1 扩大窗口的大小
tcp_wmem 发送缓冲区范围
tcp_rmem 接收缓冲区范围
tcp_mem 8980365 11973823 17960730 内存范围
tcp_moderate_rcvbuf 动态调节接收缓冲区

4.1 确认应答

延迟确认 接收方避免发送不携带数据的 ACK
重传 解决丢包问题。

  • 超时重传,超过RTO重传。
  • 快速重传。连续三次 ACK 不对劲,触发 client 重传。SACK、D-SACK。

    4.2 流量控制

    解决生产消费,实现背压。使用滑动窗口。

    4.3 拥塞控制

    解决网络拥塞。使用滑动窗口。算法:Reno、Vegas、Bic、CuBic、BBR、BBR2.0。

    5 总结

    TCP 协议解决丢包、乱序、消费、拥塞问题,其次才是追求效率。

  • 丢包。ack

  • 乱序。seq
  • 消费。win
  • 拥塞。win
  • 效率。win

    参考文献