发送校验和不正确的 TCP

发送校验和不正确的 TCP

我无法将大文件发送到 OpenStack 机器。

我们的互联网连接是通过 LTE 进行的,因此可能会出现坏数据包。但是,即使通过 TCP 发送数据,在发送几 MB 时也会导致数据损坏。

我想测试 TCP 校验和是否真的被验证,所以我需要一个工具来发送带有无效校验和的 TCP 数据包。

有一些程序允许我发送任意 IP 数据包,但我更喜欢一个也可以为我启动连接(执行三次握手等)的工具。

然后我可以用来tcpdump检查服务器是否确认数据包或请求重新发送。(如果该工具也能做到这一点,那就更好了。)

一些想法和注释:

  • 我在客户端和服务器上尝试过不同的 Linux 版本。
  • 切换到(较慢的)DSL 线路时,​​不再出现损坏的数据包。
  • 当从不同的主机发送到另一台服务器时,我们没有损坏的数据包。
  • 我有来自客户端和服务器的 TCP 传输的 tcpdump,但是 OpenStack 主机不想查看它们,这就是为什么我想找出校验和是否有问题,并为主机提供一个测试程序。
  • 该服务器是 OpenStack 环境中的一个实例。
  • vethLinux 内核中最近的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。查看下面的链接,它非常有用;

    hping3 示例

    从上面的链接来看,我认为这就是您正在寻找的内容;

    -b --badcksum(尝试)发送带有错误 IP 校验和的数据包,许多系统将修复发送数据包的 IP 校验和,因此您将得到错误的 UDP/TCP 校验和。

  • 如果你有编程技能(套接字编程,Linux 上的 BSD 套接字,你可以谷歌一下),你可以使用原始套接字,构建自己的传输层数据包。

相关内容