我看到它在其他地方问了但是没有人满意地回答:我怎样才能接收和发送原始数据包?
通过“raw packets”,我的意思是我必须生成所有标头和数据,以便字节完全是任意的,和我不受任何限制。这就是为什么Microsofts RAW套接字无法工作的原因,因为您无法发送源地址不正确的TCP或UDP数据包。
我知道您可以使用WinPCAP发送我想要的数据包,但是您无法使用它接收原始信息,我也需要这样做。
答案 0 :(得分:9)
首先确定您要在哪个协议层上测试格式错误的数据:
<强>以太网强>
如果您想生成和接收带有错误以太网校验和的无效以太网帧,那么您或多或少会因为校验和通常在硬件中完成而失败,而在它们不是的情况下,则是NIC的驱动程序执行校验和,至少在Windows上没有办法解决问题。 NetBSD为大多数在OS驱动程序中执行以太网校验和的驱动程序提供了该选项。
替代方案是购买专用硬件(例如Napatech的卡,你可能会发现更便宜的硬盘),它提供了一个发送和接收以太网帧的API,但是你想要的无效。
请注意,通过发送无效的以太网帧,接收端或中间的路由器发送只会丢帧,它们永远不会到达应用程序或OS IP层。您将在接收端测试NIC或NIC驱动程序。
<强> IP 强>
如果你想要的只是发送/接收无效的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流中具有较低级别协议的任何muckery,例如导致其中一个数据包具有无效/不同的IP源地址,只会被较低级别的层丢弃。
您将测试在TCP / UDP(或任何其他IP协议)上运行的应用程序。
<强>替代强>
切换到另一个操作系统,您至少可以使用原始套接字而不受最近窗口的限制。
基于上面的“以太网”或“IP”替代方案实施透明的插入式插入解决方案。即你有正常的客户端应用程序,您的普通服务器应用程序。你在它们之间断开电缆,插入带有2个NIC的盒子,在那里以编程方式改变收到的帧的字节,然后在另一个NIC上再次发送它们。这样您就可以轻松地在系统中引入数据包延迟。 Linux的netfilter已经具备了这种功能,您可以轻松地构建它,通常只需配置或编写脚本。
如果您可以更改要测试的接收应用程序,请让它从其他内容(例如文件或管道)中读取数据,并根据需要随机提供字节/数据包。
混合模型,主要用于TCP应用程序测试,但也可用于例如测试UDP ICMP响应。使用套接字设置TCP连接。使用套接字发送无效的应用程序数据。引入随机格式错误的数据包(比使用设置TCP会话的原始套接字和然后引入较低层错误)编程要容易得多。发送格式错误的IP或UDP / TCP数据包,或者使用WinPcap发送ICMP数据包,尽管使用套接字代码与winpcap代码进行通信,这样您的地址/端口就会正确,这样接收应用程序就可以看到它。
查看NS/2