最近我不得不使用优秀的google的packetdrill工具编写测试。 (https://github.com/google/packetdrill)
总而言之,它是一个可以通过编写一些结合了C命令,预期出站和入站数据包的测试用例来测试计算机的TCP(或IP或UDP)堆栈的工具。
但是,我无法弄清楚这些测试是多么便携。例如,如果我在github目录上运行测试,几乎所有这些都会失败。
我们来看看fr-4pkt-sack-linux.pkt
:
// Test fast retransmit with 4 packets outstanding, receiver sending SACKs.
// In this variant the receiver supports SACK.
// Establish a connection.
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 < S 0:0(0) win 32792 <mss 1460,sackOK,nop,nop,nop,wscale 10>
+0 > S. 0:0(0) ack 1 <mss 1460>
+.1 < . 1:1(0) ack 1 win 257
+0 accept(3, ..., ...) = 4
// Send 1 data segment and get an ACK, so cwnd is now 4.
+0 write(4, ..., 1000) = 1000
+0 > P. 1:1001(1000) ack 1
我收到以下错误:
fr-4pkt-sack-linux.pkt:19: error handling packet: live packet field ipv4_total_length: expected: 1040 (0x410) vs actual: 297 (0x129)
script packet: 0.100283 P. 1:1001(1000) ack 1
actual packet: 0.100277 P. 1:258(257) ack 1 win 29200
似乎表明我的计算机(64位Ubuntu gnome 16.04)仅为第一个数据包发送257个字节而不是1000个(简单地忽略了窗口缩放参数)。
如果我运行其他测试,例如sack-shift-sacked-1-2-3-fack.pkt
,它似乎表明我的计算机忽略了wscale参数。
所以,我的问题是:
提前谢谢
答案 0 :(得分:1)
解决方案很简单,但我会为处于相同情况的人保留这个主题。
事实上,我只是通过sysctl禁用TCP窗口缩放。
我在这里使用了一个配置文件:http://cnp3book.info.ucl.ac.be/2nd/html/_downloads/sysctl-cnp3.conf
我用sysctl -w variable
更改了变量,但我不知道重启计算机后这些更改是持久的。
所以,不要犯同样的错误:使用sysctl时要小心,它可能会破坏整个计算机(如果你在测试后忘记重置这些设置)。
重置为默认值后,它现在可以正常运行。因此,packetdrill测试的可移植性似乎没问题(如果没有新的主要TCP功能)。