我在别处看到有人问过它,但没有人回答我满意:我如何接收和发送原始数据包?
通过“原始数据包”,我的意思是我必须在何处生成所有 header 和数据,以便字节是完全任意的,并且不受任何限制。这就是 Microsoft 的 RAW 套接字不起作用的原因,因为您无法使用不正确的源地址发送 TCP 或 UDP 数据包。
我知道您可以像使用 WinPCAP 一样发送数据包,但您无法使用它接收原始信息,我也需要这样做。
最佳答案
首先决定你想在哪个协议(protocol)层上测试格式错误的数据:
以太网
如果你想用错误的以太网校验和生成和接收无效的以太网帧,你或多或少不走运,因为校验和通常是在硬件中完成的,在它们不是的情况下,网卡的驱动程序执行校验和至少在 Windows 上没有办法解决这个问题。 NetBSD 为大多数在操作系统驱动程序中进行以太网校验和的驱动程序提供了该选项。
另一种方法是购买专门的硬件(例如 Napatech 的卡,但您可能会找到更便宜的卡),它提供了一个 API,用于发送和接收以太网帧,无论您希望它无效。
请注意,通过发送无效的以太网帧发送,接收端或中间的路由器只会将帧扔掉,它们永远不会到达应用程序或操作系统 IP 层。您将在接收端测试 NIC 或 NIC 驱动程序。
知识产权
如果您只想发送/接收无效的 IP 数据包,winpcap 可以让您做到这一点。生成数据包,设置winpcap抓包,使用winpcap发送..
请注意,具有无效 IP 校验和其他无效字段的数据包,接收应用程序运行的 TCP/IP 堆栈只会将 IP 数据包丢弃,就像发送方和接收方之间的任何 IP/第 3 层路由器一样。他们不会到达应用程序。如果您正在生成有效的 IP 数据包,您还需要生成有效的 UDP 并自己使用有效的 TCP 数据包实现 TCP session ,以便应用程序处理它们,否则它们也会被 TCP/IP 丢弃堆
您将在接收端测试 TCP/IP 堆栈的较低部分。
TCP/UDP
这与发送/接收无效 IP 数据包没有什么不同。你可以用 winpcap 做这一切,尽管路由器不会把它们扔掉,只要以太网/IP header 没问题。但是,应用程序不会收到这些数据包,它们会被 TCP/IP 堆栈丢弃。
您将在接收端测试 TCP/IP 堆栈的上部。
应用层
这是实际测试应用程序的(理智)方式(除非您的“应用程序”实际上是 TCP/IP 堆栈或更低)。您可以像使用套接字的任何应用程序一样发送/接收数据,但会根据需要生成格式错误的应用程序数据。应用程序将接收这些数据,它不会被较低的协议(protocol)层丢弃。
尽管使用 TCP 的一种特定形式的测试可能很难测试 - 即改变发送的 TCP 段,如果您例如想要测试应用程序是否正确地将 TCP 数据解释为流。 (例如,您希望将字符串“hello”分成 5 段发送,并以某种方式使接收应用程序一个一个地 read() 字符)。如果您不需要速度,通常可以通过在发送中插入暂停并关闭 nagel 算法 (TCP_NDELAY) 和/或调整 NIC MTU 来获得该行为。
请记住,TCP 流中具有较低级别协议(protocol)的任何困惑,例如导致其中一个具有无效/不同 IP 源地址的数据包被较低级别的层丢弃。
您将测试运行在 TCP/UDP(或任何其他 IP 协议(protocol))之上的应用程序。
替代品
关于c++ - 发送任意(原始)数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6389253/