验证发送的数据包与收到的数据包是否一致?

验证发送的数据包与收到的数据包是否一致?

运行 Ubuntu。

我有机器 A -> 机器 B (从 A 到 B 的单向连接)。机器A的目标是将tcp数据包转发到机器B(它与机器 B 没有 TCP 连接。它只是转发从其他机器获得的 TCP 数据包) 在机器A中有c++代码根据业务规则收集一些tcp数据包并通过原始套接字将它们写入机器B。

我想在机器 A 上对我的代码进行性能测试,因此为了做到这一点,我需要向机器 A 发送大量 TCP 数据包,我的 c++ 代码会将它们转发到 B。最后,我将验证所有数据包是否在机器 B 中恢复。您对工具有什么推荐吗?可以模拟大量发送的工具和有助于断言的工具(可以通过数量、校验和或任何其他想法进行断言)

我认为在将大文件上传到 A 时,转储上传流量,然后使用 tcpreplay 重放它(我将创建 100 个线程来重放相同的上传转储,以便获得大量 tcp 流)。为了验证,我将分析接收器上的 tcpdump,以检查其是否具有与发送相同的预期数据包数量。

这与 tcp 无关,因为协议仅生成真正的 tcp 数据包(作为结构)发送大量数据包并通过比较有效负载或数量或任何其他方式进行验证。 有什么建议吗?

答案1

我有机器 A -> 机器 B(从 A 到 B 的单向连接)。我需要从 A 向 B 发送大量 TCP 数据包并验证所有数据包是否恢复。您有什么工具推荐吗?

我建议TCP,这确保了reliable, ordered delivery数据的安全性。
(您要求我们提供一个工具来执行底层协议已经执行的操作。)

另请注意,TCP本质上是双向的ACK必须从机器 B 发送回机器 A。“单向连接”是不可能的——没有ACKs 意味着传输将永远停止。


我认为在从 A 向 B 上传大文件时(当它们具有双向连接时执行此操作),转储从 A 到 B 的流量,然后使用 tcpreplay 重播它(我将创建 100 个线程来重播它,以便获得大量 tcp 流)。为了验证,我将分析接收器上的 tcpdump 以检查其是否具有与发送相同的预期数据包数量。

TCP 不是这样工作的。由于不同的窗口/MTU 大小、丢弃和重新传输的数据包、延迟的 ACK(导致一些数据包的重复传输)等,通过线路传输的数据包数量可能会有所不同。

你不能只是把相同的数据塞进网络,并期望它以完全相同的方式工作——在实践中,这通常是可行的(也是重放攻击),但 TCP 是由状态机控制的,因此您确实需要在每个连接上都运行一次状态机。

如果您需要生成大量 TCP 流量并且不关心数据,您应该简单地启动多个流将数据发送到远程系统上的侦听器(大概可以丢弃它)。

如果你关心数据,你应该按照 lasrks 的建议做,并对已接收数据(完整)退出 TCP/IP 堆栈后......

相关内容