我在其他地方看到过它被问到,但没有人满意地回答:我怎样才能接收和发送原始数据包?
“原始数据包”是指我必须在哪里生成所有标头和数据,以便字节完全是任意的,并且我不受任何限制。这就是为什么 Microsoft 的 RAW 套接字无法工作的原因,因为您无法发送源地址不正确的 TCP 或 UDP 数据包。
我知道你可以用 WinPCAP 发送我想要的数据包,但你不能用它接收原始信息,我也需要这样做。
我在其他地方看到过它被问到,但没有人满意地回答:我怎样才能接收和发送原始数据包?
“原始数据包”是指我必须在哪里生成所有标头和数据,以便字节完全是任意的,并且我不受任何限制。这就是为什么 Microsoft 的 RAW 套接字无法工作的原因,因为您无法发送源地址不正确的 TCP 或 UDP 数据包。
我知道你可以用 WinPCAP 发送我想要的数据包,但你不能用它接收原始信息,我也需要这样做。
首先决定您要在哪个协议层上测试格式错误的数据:
以太网
如果您想生成和接收带有错误以太网校验和的无效以太网帧,您或多或少会不走运,因为校验和通常是在硬件中完成的,如果不是,NIC 的驱动程序会执行校验和至少在 Windows 上没有办法解决这个问题。NetBSD 为大多数在 OS 驱动程序中进行以太网校验和的驱动程序提供了该选项。
另一种选择是购买专门的硬件(例如 Napatech 的卡,不过你可能会找到更便宜的),它提供了一个用于发送和接收以太网帧的 API,但是你想要的无效。
请注意,通过发送无效的以太网帧进行发送,接收端或中间的路由器只会将帧丢弃,它们永远不会到达应用程序或 OS IP 层。您将在接收端测试 NIC 或 NIC 驱动程序。
知识产权
如果您只想发送/接收无效的 IP 数据包,winpcap 可让您执行此操作。生成数据包,设置winpcap抓包,使用winpcap发送..
请注意,具有无效 IP 校验和其他无效字段的数据包,接收应用程序运行的 TCP/IP 堆栈只会丢弃 IP 数据包,发送方和接收方之间的任何 IP/第 3 层路由器也会这样做。他们不会到达应用程序。如果您正在生成有效的 IP 数据包,您还需要自己生成有效的 UDP 并使用有效的 TCP 数据包实现 TCP 会话,以便应用程序处理它们,否则它们也会被 TCP/IP 丢弃堆
您将在接收端测试 TCP/IP 堆栈的较低部分。
TCP/UDP
这与发送/接收无效 IP 数据包没有什么不同。您可以使用 winpcap 完成所有这些操作,尽管路由器不会丢弃它们,只要以太网/IP 标头没问题。但是,应用程序不会收到这些数据包,它们会被 TCP/IP 堆栈丢弃。您将在接收端测试 TCP/IP 堆栈的上部。
应用层
这是实际测试应用程序的(理智)方式(除非您的“应用程序”实际上是 TCP/IP 堆栈或更低)。您可以像任何应用程序使用套接字一样发送/接收数据,但会根据需要生成格式错误的应用程序数据。应用程序将接收这些数据,它不会被较低的协议层丢弃。
尽管使用 TCP 的一种特定形式的测试可能很难测试——即改变发送的 TCP 段,例如,如果您想测试应用程序是否正确地将 TCP 数据解释为流。(例如,您想以 5 段发送字符串“hello”,并以某种方式导致接收应用程序一个接一个地读取()字符)。如果您不需要速度,通常可以通过在发送中插入暂停并关闭 nagel 算法 (TCP_NDELAY) 和/或调整 NIC MTU 来获得该行为。
请记住,任何在 TCP 流中使用较低级别协议的行为,例如导致其中一个数据包具有无效/不同的 IP 源地址,都会被较低级别的层丢弃。
您将测试在 TCP/UDP(或任何其他 IP 协议)之上运行的应用程序。
备择方案
切换到另一个操作系统,您至少可以在不受最近窗口限制的情况下使用原始套接字。
实施基于上述“以太网”或“IP”替代方案的透明插入式解决方案。即你有你的普通客户端应用程序,你的普通服务器应用程序。您断开它们之间的电缆,插入带有 2 个 NIC 的盒子,您可以在其中以编程方式更改接收到的帧的字节,然后将它们再次发送回另一个 NIC。这也将允许您轻松地在系统中引入数据包延迟。Linux 的 netfilter 已经具备这种功能,您可以轻松地在其上构建,通常只需要配置或脚本。
如果您可以更改要测试的接收应用程序,请让它从文件或管道等其他内容中读取数据,并根据需要为其提供随机字节/数据包。
混合模型,主要用于 TCP 应用程序测试,但也可用于测试 UDP ICMP 响应等。使用套接字建立 TCP 连接。使用套接字发送无效的应用程序数据。引入随机格式错误的数据包(比使用原始套接字进行编程要容易得多,后者会设置 TCP 会话然后引入较低层错误)。发送格式错误的 IP 或 UDP/TCP 数据包,或者可能使用 WinPcap 的 ICMP 数据包,尽管通过套接字代码与 winpcap 代码通信,以便您将地址/端口正确,以便接收应用程序看到它。
查看NS/2