从Linux内核看TCP重传机制
从Linux内核看TCP重传机制
0. 工作计划
2023.05.15~19
本周工作:
- 会议决议每人负责一个底层方向,目前我的方向为TCP重传与丢包
- 查找TCP重传机制的相关资料
下一步计划:
- 分析TCP重传的三种机制及在Linux中的实现
- 使用传统工具以及现有的eBPF工具,观测性能参数
- 分析
/proc/sys/net/ipv4/
下面涉及TCP的参数含义,以及了解如何通过参数配置进行网络调优(特化)
1. TCP重传机制原理简述
关于TCP重传机制的阐述,网络上有大量的优质文章,读者可以搜索查阅。为了文章的完整性,本文仅做概述。
TCP重传机制具有以下几种方法:
基于计时器的重传(超时重传)
快重传(Fast Retransmit)
选择重传
- 选择性确认方法(Selective Acknowledgment,SACK)
- Duplicate SACK
1.1 超时重传
关于超时重传,即数据发送时计时,若指定超时重传时间(Retransmission Timeout,RTO)范围内,没有收到ACK确认应答报文,将触发超时重传机制,重新发送该数据包。
- RTO不固定,根据网络延迟,动态调整
- 调整与RTT(Round Trip Time)往返时间有关
1.2 快重传
快重传是TCP协议在特定情况下的一种优化重传机制,当TCP发送方连续收到三个相同的确认,就会认为这个报文是丢失了而不是延迟,此时会立即进行重传,从而减少等待超时时间的长短,提高重传的速度和效率。
1.3 选择重传
SACK是TCP协议引入的一种优化重传的机制,它可以在数据包中带上一个SACK选项,记录已经成功接收的数据及缺失的数据段的起止位置。这样当TCP重传时,可以精确指定要重传的数据包,从而避免重传已经成功接收的数据包,减少网络拥塞和提高传输效率。
D-SACK(Duplicate SACK)是SACK的一个改进,它可以记录重复的SACK块,即探测到的丢失数据块的段在后续的确认中又会出现。D-SACK在与SACK一起使用时,主要解决某些复杂情况下SACK的不足,例如在网络重传造成新段落结构时,SACK存在可能会指示不正确的段。
2. Linux内核网络协议栈重传机制实现
2.1 TCP关键参数
SYN重传次数tcp_syn_retries
SYN-ACK重传次数tcp_synack_retries
SYN包队列tcp_max_syn_backlog
丢包率
超时重传时间
重传队列
2.2 TCP重传机制的实现
通过跟踪数据包重传的路线,理解Linux网络协议栈的具体实现。
Linux内核版本:5.10.104
2.2.1 超时重传
2.2.1.1 RTO的范围
超时重传时间最大最小值的计算与HZ
有关。HZ
的由CONFIG_HZ
设置,如下所示,目前这台X64主机的CONFIG_HZ
为250,可以修改设置为100,300以及1000等。若用户不设置,则默认是100。
1 |
|
因此, 超时重传时间的最小值为50ms,最大为30s。
1 |
|
2.2.1.2 重传计时器
1 |
|
1 |
|
1 |
|
2.2.2 快重传
2.2.3 SACK与D-SACK
3. 如何观测重传关键参数
3.1 传统工具
3.2 现有eBPF技术工具
3.3 开发采用eBPF技术的小工具
==若有必要==