2015-01-02 25 views
0

I 需要知道我的Rx正在收到的数据包是否为ARP以便为我的进程丢弃它们。我的数据包里面有什么协议? (Ns3)

我已经查看了ns3的手册和教程,但是我没有在它们两个中找到关于哪个协议在数据包内的内容。

ns3中有任何功能或部分让我知道在我的数据包中的协议?或者需要我查找标题的十六进制代码并将其与ARP一比较?这应该是极其低效的,因为我必须在我的模拟中接收每个数据包。 (因为我没有完成,我不确定这是正确的方式,也不可能)。

感谢您阅读

+0

我看到你没有得到任何答复,所以我提供了一个赏金来帮助你得到你需要的答案。 –

+0

你可以发布有问题的软件包的内容吗? –

+0

我可以创建它,让我模拟它。但我解释说,这不仅仅是一个软件包。我有两个设备通过WiFi连接。我正在模拟他们之间的沟通(在sinkpack和bulksenda之间)。我用它们之间的几个距离重复它。为了让“大”包(500B)能够通过,但是ARP(大约64B)仍然可以,错误太高了。所以如果我运行这个模拟并生成pcap文件,我可以检查它们是否是ARP。我需要这个练习,所以我最终通过尺寸对它们进行过滤。但仍然不知道是否有另一种(更正确的)方式。 –

回答

0

GetUid()不相关;它仅仅是分组数据结构的内部ID,与所携带的协议无关。

在ns-3中,数据包按照网络字节顺序被串行化到Buffer对象中,类似于Linux内核skbuffs。正如你所提到的,检查数据包内容的暴力方法是将数据包内容反序列化(复制)到单独的缓冲区中,然后选择字节。但是,有更好的方法。

如果您位于Wifi层,并且想要了解您拥有的数据包是否是ARP数据包,则可以通过以下两种主要方法来学习此知识。首先,您可以检查数据包的标题。如果您处于堆栈中WifiNetDevice只添加了LlcSnapHeader的位置,您可以尝试查看标题并查看协议编号(存储在“类型”字段中)。给定一个PTR PKT,你可以尝试:

LlcSnapHeader llc; 
pkt->PeekHeader (llc); 
if (llc.GetType() == 0x0806) 
    { 
    // found an ARP packet 
    } 

但是,请注意,如果你是在堆栈的地方正在使用的各种帧类型,不是所有的数据包将有LlcSnapHeader,所以偷看如上述可能不可靠,或者您可能需要检查其他可能性。另外,如果你不够幸运,你关心的标题位于数据包的最前端,请记住,复制数据包并从数据包副本中删除标题并不昂贵(基本上它们会从标题中弹出堆栈)来找到你想要的标题。

如果您在模拟中启用了数据包元数据,则可以使用第二种技术。这是一个数据结构,其中包含有关已添加的所有标题和结尾的元数据,并且可以作为可以扫描标题信息的链接列表返回给客户端。默认情况下,它在模拟性能方面的原因被禁用的,但可以通过调用这个在main()程序开始时启用:

Packet::EnablePrinting(); 

,然后用包类的BeginItem()迭代器(见ns-3 Doxygen)。就我所知,没有好的示例程序使用它,但src/network/test中存在可能提供提示的测试套件。

+0

不知道我是否理解它。那么,如果我在抛出一个phy trace的时候收到这个数据包,LLC应该在上面,我可以使用第一种方法?我已经运行了它,并且每个sigle数据包的协议都是“0”。我在PhyRxEnd的Rx回调中进行检查。 –