我无法将大文件发送到 OpenStack 机器。
我们的互联网连接是通过 LTE 进行的,因此可能会出现坏数据包。但是,即使通过 TCP 发送数据,在发送几 MB 时也会导致数据损坏。
我想测试 TCP 校验和是否真的被验证,所以我需要一个工具来发送带有无效校验和的 TCP 数据包。
有一些程序允许我发送任意 IP 数据包,但我更喜欢一个也可以为我启动连接(执行三次握手等)的工具。
然后我可以用来tcpdump
检查服务器是否确认数据包或请求重新发送。(如果该工具也能做到这一点,那就更好了。)
一些想法和注释:
- 我在客户端和服务器上尝试过不同的 Linux 版本。
- 切换到(较慢的)DSL 线路时,不再出现损坏的数据包。
- 当从不同的主机发送到另一台服务器时,我们没有损坏的数据包。
- 我有来自客户端和服务器的 TCP 传输的 tcpdump,但是 OpenStack 主机不想查看它们,这就是为什么我想找出校验和是否有问题,并为主机提供一个测试程序。
- 该服务器是 OpenStack 环境中的一个实例。
veth
Linux 内核中最近的TCP 校验和损坏错误可以解释这个错误。
我们也欢迎任何其他有关如何调试的想法。
答案1
https://github.com/kubernetes/kubernetes/issues/18898
解释如何做到这一点。
以下是一个(缩短的)版本:
在接收机上运行nc -l -p 12345
在发送机上运行(i=0; while true; do echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa $i; i=$((i+1)); sleep 1; done) | netcat IP_OF_RECEIVING_MACHINE 12345
要破坏软件包,请在发送方计算机上执行以下命令:
sudo tc qdisc add dev eth0 root netem corrupt 100%; sleep 10; sudo tc qdisc del dev eth0 root netem
请注意,10 秒内 eth0 上的所有软件包都将被损坏!
如果校验和正确,您将在 10 秒内不会收到任何文本,然后立即收到它们。但是,如果校验和不起作用,您将收到损坏的文本。
答案2
python3 scapy 使用 TCP 校验和语法制作数据包:
>>>p=IP/TCP(dport=22, chksum=0xffff)
>>>send(p)
上面将从 scapy 的当前默认源 IP 地址向 scapy 的当前默认目标 IP 地址发送一个 SYN 数据包,从 scapy 的当前默认源端口向目标端口 22 发送一个 SYN 数据包,使用最有可能是无效的 TCP 校验和0xffff
。
答案3
您可以使用数据包制作工具如hping、hping3。查看下面的链接,它非常有用;
从上面的链接来看,我认为这就是您正在寻找的内容;
-b --badcksum(尝试)发送带有错误 IP 校验和的数据包,许多系统将修复发送数据包的 IP 校验和,因此您将得到错误的 UDP/TCP 校验和。
如果你有编程技能(套接字编程,Linux 上的 BSD 套接字,你可以谷歌一下),你可以使用原始套接字,构建自己的传输层数据包。