最近调试网口传输,同样的固件从win10系统升级至win11系统测试,发现出现不同的现象。。。
Win10环境:
程序运行稳定,在上周的测试中未出现丢帧现象。
Win11环境:
在上周的测试中存在偶发性、非确定性丢帧,且无明确触发规律;原因是系统兼容性或协议栈行为差异导致的TCP重传从而出现数据包丢失。
分析原因:
一、底层原因分析
1. 网络驱动程序兼容性问题
-
驱动缺陷:Windows 11可能使用更新的驱动程序,存在缓冲区管理或中断处理问题(如DMA映射错误、NAPI轮询不充分)。
-
中断合并(Interrupt Moderation):驱动可能默认启用更高强度的中断合并,导致数据包处理延迟,触发TCP超时重传。
2. TCP协议栈行为变化
-
RTO(重传超时)计算优化:Windows 11可能采用更敏感的RTO算法(如动态调整RTO最小值),对延迟波动更敏感。
-
拥塞控制算法调整:默认使用CUBIC或BBR算法,可能在高吞吐场景下激进发送,导致缓冲区填满丢包。
-
选择性确认(SACK)支持问题:SACK协商或处理逻辑异常,导致冗余重传。
3. 硬件卸载功能异常
-
TCP Chimney Offload:若网卡卸载TCP校验和、分段(TSO)或接收端缩放(RSS)时出错,可能引发数据包损坏或丢失。
-
虚拟化卸载(VMMQ):在虚拟化环境中,硬件队列分配错误导致丢包。
4. 电源管理干扰
-
节能模式下的网卡状态:网卡进入低功耗状态(如PCIe L1/L2),唤醒延迟导致数据未能及时处理。
-
CPU C-State限制:CPU核心休眠延迟增加网络处理线程的调度延迟。
5. NDIS过滤器或中间层驱动
-
安全软件干扰:第三方防火墙或杀毒软件通过NDIS过滤器注入的驱动(如流量扫描)可能错误丢弃数据包。
-
QoS策略调整:Windows 11内置的流量整形策略(如DSCP标记)导致路由器丢包。
使用wireshark抓包软件抓取底层数据包传输分析,发现win11系统下更容易触发TCP重传机制(如下图),并且恢复的很慢,但win10系统就不会出现该情况,在 Windows 中,TCP 全局参数通过 netsh int tcp show global 命令查看,这些参数控制 TCP 协议栈的底层行为,直接影响网络性能(如吞吐量、延迟、重传效率)。通过合理配置这些参数,测试发现显著优化网络性能,但需要较长时间测试查看结果。
二、试图修改底层TCP参数来优化
1.优化TCP协议栈参数
-
操作步骤(需修改注册表,谨慎操作):
-
打开注册表编辑器,定位到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
-
调整关键参数--例如,关闭TcpDelay(默认200ms延时确认) 、设置TcpAckfrequency为1(一包应答一次)(需重启生效)
-
或者在终端下通过查看tcp参数和指令直接修改tcp参数(可能不需要重启生效,但部分测试时发现更改过多最好还是重启会相对稳定)
-
2. 修改缓存窗口大小
在 Windows 11 中,TCP 窗口大小(即接收窗口,RWIN
)直接影响网络吞吐量,尤其是在高延迟(高 RTT)网络中。以下是查看和修改 TCP 窗口的详细方法
一、查看当前 TCP 窗口大小
1. 通过命令行工具查看全局参数
netsh int tcp show global
-
查看输出中的以下字段:
-
Receive Window Autotuning Level:窗口自动调整级别(默认为
normal
)。 -
Initial RTO:初始重传超时。
-
Max SYN Retransmissions:SYN 重试次数。
-
注意:此命令不会直接显示当前窗口大小,但会显示自动调整的状态。
2. 通过注册表查看手动配置的窗口大小
-
打开注册表编辑器(
regedit
),定位到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
-
检查以下键值:
-
TcpWindowSize:手动设置的窗口大小(单位:字节,默认可能不存在)。
-
Tcp1323Opts:控制窗口缩放(Window Scaling)和时间戳的选项。
-
3. 通过 Wireshark 抓包直接观测
使用 Wireshark 抓取 TCP 流量:
-
过滤条件:
tcp
。 -
在 TCP 报文头中查找 Window Size 字段(实际窗口值需乘以窗口缩放因子)。
二、修改 TCP 窗口大小
修改需通过注册表调整,操作前请备份注册表。
1. 启用窗口缩放(Window Scaling)
-
窗口缩放允许突破传统 64KB 的窗口限制(最大支持 1GB)。
-
打开注册表路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
-
创建或修改 DWORD 值:
"Tcp1323Opts"=dword:00000003 # 启用窗口缩放和时间戳(3=1+2)
2. 手动设置固定窗口大小
-
在相同注册表路径下,创建或修改 DWORD 值:
"TcpWindowSize"=dword:00040000 # 262,144 字节(示例值)
-
计算方式:
十进制值 → 转换为十六进制 → 填充为 8 位(如262144
→0x40000
→00040000
)。
-
-
推荐值:
-
高延迟网络:窗口大小 ≥ 带宽 (Mbps) × 延迟 (秒) × 1.5(例如 100Mbps、100ms 延迟 → 窗口 ≥ 1.875MB)。
-
典型值:
TcpWindowSize=256,000~1,000,000
(需根据网络条件测试)。
-
3. 调整自动调整级别
-
若希望系统自动管理窗口但调整灵敏度,可通过命令行:
netsh int tcp set global autotuninglevel=normal
-
可选模式:
disabled
(禁用自动调整)、normal
(默认)、restricted
(保守)、experimental
(激进)。
-
三、重启生效与验证
-
重启系统:注册表修改需重启生效。
-
验证配置:
-
再次运行
netsh int tcp show global
,确认Receive Window Autotuning Level
。 -
使用 Wireshark 抓包,观察实际 TCP 窗口值(需注意窗口缩放因子)。
-
-
性能测试:
-
使用
iperf3
测试吞吐量:iperf3 -c <服务器IP> -t 30 -P 4
-
对比修改前后的传输速率和重传率。
-
三、TCP参数简述
因为每个电脑可能网卡驱动或win11版本都不通用,所以并不能保证TCP参数设置对每个电脑均有效,因而在上面博主没有具体说配置了哪些。但对于TCP通用的全局参数,在这里还是想做个分享,希望对正在调试的友友有帮助。。。以win11为例,如下图:
在 Windows 中,TCP 全局参数通过 netsh int tcp show global 命令查看,这些参数控制 TCP 协议栈的底层行为,直接影响网络性能(如吞吐量、延迟、重传效率)。以下是每个参数的含义、作用及配置建议:
1. Receive Window Auto-Tuning Level(接收窗口自动调优级别)
- 含义:控制接收窗口(RWIN)的动态调整策略,决定系统如何根据网络条件自动优化窗口大小。
- 可选值:
- disabled:禁用自动调整,使用固定窗口(需手动设置 TcpWindowSize)。
- normal(默认):根据延迟和带宽动态调整(推荐大多数场景)。
- restricted:保守调整,限制窗口增长(适用于丢包严重的网络)。
- experimental:激进调整,最大化吞吐量(适合高带宽低延迟网络)。
- 作用:优化网络吞吐量与延迟的平衡,避免缓冲区溢出或带宽浪费。
2. Add-On Congestion Control Provider(拥塞控制算法)
- 含义:指定 TCP 使用的拥塞控制算法。
- 可选值:
- none:传统算法(如 Reno)。
- default:Windows 默认算法(如 CUBIC)。
- ctcp:复合 TCP(Compound TCP,微软优化算法)。
- dctcp:数据中心 TCP(低延迟场景专用)。
- 作用:
- CUBIC:高带宽网络的默认选择,公平性与吞吐量兼顾。
- Compound TCP:混合丢包和延迟反馈,适合广域网。
- DCTCP:数据中心内网专用,最小化队列延迟。
3. ECN Capability(显式拥塞通知)
- 含义:是否启用 ECN(Explicit Congestion Notification),允许路由器标记拥塞而非直接丢包。
- 可选值:
- enabled:支持 ECN。
- disabled(默认):禁用 ECN。
- 作用:减少丢包重传,但需网络设备支持(某些老旧路由器不兼容)。
4. RFC 1323 Timestamps(时间戳选项)
- 含义:是否启用 RFC 1323 定义的时间戳选项。
- 可选值:
- enabled(默认):启用时间戳。
- disabled:禁用时间戳。
- 作用:
- 精确计算 RTT(往返时间)。
- 防止序列号回绕(在高带宽网络中避免数据混淆)。
5. Initial RTO(初始重传超时时间)
- 含义:TCP 连接首次重传的等待时间(毫秒)。
- 默认值:3000ms(3秒)。
- 作用:影响重传敏感度。值过小可能导致过早重传,过大则增加延迟。
6. Max SYN Retransmissions(SYN 最大重传次数)
- 含义:TCP 握手阶段 SYN 包的最大重传次数。
- 默认值:2(共尝试 3 次)。
- 作用:控制连接建立的可靠性。过多重传会延长连接失败判定时间。
7. Non Sack Rtt Resiliency(非 SACK 网络的 RTT 抗性)
- 含义:在未启用 SACK(选择性确认)的网络中,是否优化 RTT 计算。
- 默认值:disabled。
- 作用:提升对老旧网络设备的兼容性,但可能降低吞吐量。
8. Fast Open(快速打开)
- 含义:是否启用 TCP Fast Open(TFO),允许在握手阶段携带数据。
- 可选值:
- enabled:支持 TFO。
- disabled(默认):禁用 TFO。
- 作用:减少 HTTP 等短连接的延迟,需服务器和客户端同时支持。
9. Max Ack Retransmissions(ACK 最大重传次数)
- 含义:TCP ACK 包的最大重传次数。
- 默认值:根据系统策略动态调整。
- 作用:影响数据确认的可靠性,值过高可能导致无效重传。
10. Force WS(强制窗口缩放因子)
- 含义:强制指定窗口缩放因子(Window Scaling Factor),突破传统 64KB 窗口限制。
- 默认值:自动协商。
- 作用:需与 Tcp1323Opts=3 配合使用,支持大窗口传输。
其他:一些参数配置示例与场景建议
场景 1:高带宽低延迟(局域网/数据中心)
- 配置:
netsh int tcp set global autotuninglevel=experimental
netsh int tcp set global congestionprovider=dctcp
netsh int tcp set global ecncapability=enabled
- 效果:最大化吞吐量,降低延迟。
场景 2:高丢包高延迟(跨国网络)
- 配置:
netsh int tcp set global autotuninglevel=restricted
netsh int tcp set global initialrto=5000
netsh int tcp set global congestionprovider=ctcp
- 效果:保守调整窗口,适应不稳定链路。
查看与修改命令
- 查看当前配置:
netsh int tcp show global
- 修改参数示例:
netsh int tcp set global autotuninglevel=normal
netsh int tcp set global congestionprovider=default
注意事项
- 备份配置:修改前记录原始参数,以便快速恢复。
- 逐步调整:每次仅修改一个参数,验证效果后再继续。
- 兼容性测试:某些参数(如 ECN)需网络设备支持,否则可能导致连接失败。
通过合理配置这些参数,可以显著优化网络性能,但需结合具体场景反复测试。