一台 Linux 计算机处于网络链接状态,表现出以下行为:
- 下载速度很快
- 上传/上行链路开始时一切正常,但几秒后就几乎降为零。这些套接字的 Send-Q 和 Recv-Q 数量很高,以数百或数千计,重传次数也很高。
- 使用交互式反向 shell(比如远程控制台),如果我执行输出较小的命令(例如“whoami”)或文件数较少的目录的 ls,它仍然很稳定。如果我生成较大的输出(甚至 ps xauww),连接就会断断续续,可能永远无法恢复
- 以太网接口报告无数据包丢失
我无法影响这台计算机以外的任何事情。我正在寻找有关如何在 Linux 上调整 TCP 堆栈以克服此行为的想法。更新:
net.ipv4.tcp_congestion_control = westwood
net.core.default_qdisc = fq_codel
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1000 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether zz:yy:yy:xx:xx:xx brd ff:ff:ff:ff:ff:ff
Linux pc2 5.15.0-84-generic #93~20.04.1-Ubuntu SMP Wed Sep 6 16:15:40 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
连接示例:
ESTAB 0 140304 192.168.X.X:34554 YY.YYYY.YY.YYYY:443
westwood wscale:9,7 rto:1200 backoff:2 rtt:98.553/3.011 ato:40 mss:948 pmtu:1000 rcvmss:948 advmss:948 cwnd:1 ssthresh:2 bytes_sent:668936 bytes_retrans:247428 bytes_acked:418665 bytes_received:8329 segs_out:719 segs_in:443 data_segs_out:708 data_segs_in:10 send 79000bps lastsnd:816 lastrcv:80600 lastack:1964 pacing_rate 184680bps delivery_rate 73992bps delivered:445 busy:80800ms unacked:3 retrans:1/261 lost:3 reordering:10 reord_seen:3 rcv_space:9480 rcv_ssthresh:64588 notsent:137460 minrtt:93
- 我尝试使用 MTU=1000 来间接更改数据包大小,以避免将来出现不正确的碎片。1500 和 1000 的值都没有区别
- tcp westwood 是我尝试的另一种算法。在此之前,我尝试过 cubic,但没有效果
答案1
如果这是现代 Linux 安装(<10 年),那么最可能的原因是根据您提供的信息这可能是您对问题的感知,也可能是网络故障。Linux 已在调整 TCP/IP 堆栈。
感知:当 TCP 主机开始发送数据时,它一开始会比较慢,然后会很快提高速度(特别是通过控制拥塞窗口)。当通往目标的路径上的某个东西表示它无法处理更多数据(即它接收数据的速度比转发数据的速度快,并且其缓冲区已满)时,它会告诉原始主机后退。结果是您应该会看到网络吞吐量出现阻尼振荡。
但也可能出现其他问题(最有可能是源主机之外的问题)。您是否尝试过连接到同一网络端口的不同主机沿同一路径连接?您是否能够从至少第一个网络跳跃获取带宽/吞吐量/拥塞指标?