我的数据包里面有什么协议? (NS3)

时间:2015-01-02 22:30:55

标签: arp ns-3

需要知道我的Rx获取的数据包是否为ARP ,以便为我的进程丢弃它们。

我查看了ns3的手册和教程,但是我发现两者中没有关于数据包内的协议的内容。

ns3中是否有任何函数或部分让我知道数据包中的协议?或者我需要查找标头的十六进制代码并将其与ARP进行比较?这应该非常低效,因为我必须对我在模拟中收到的每个数据包执行此操作。 (因为我没有这样做,我不确定这是正确的方式,也不可能)。

感谢您阅读

1 个答案:

答案 0 :(得分:0)

GetUid()不相关;它只是分组数据结构的内部ID,与正在传输的协议无关。

在ns-3中,数据包按网络字节顺序序列化为Buffer对象,类似于Linux内核skbuff。检查数据包内容的强力方法是将数据包内容反序列化(复制)到一个单独的缓冲区中,并按照您的提及选择字节。但是,有更好的方法。

如果你在Wifi层,并且想要了解你所拥有的数据包是否是一个ARP数据包,有两种主要方法可以学习它。首先,您可以检查数据包的标头。如果您位于堆栈中仅由WifiNetDevice添加了LlcSnapHeader的位置,您可以尝试查看标头并查看协议编号(存储在“类型”字段中)。鉴于Ptr pkt,您可以尝试:

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

但请注意,如果您在堆栈中使用各种帧类型的位置,并非所有数据包都有一个LlcSnapHeader,那么上面的偷看可能不太可靠,或者您可能需要检查其他可能性。此外,如果您不够幸运,您关心的标头位于数据包的最前面,请记住,复制数据包并从数据包副本中删除标头并不昂贵(基本上将它们从堆栈)获得你想要的标题。

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

Packet::EnablePrinting ();

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