提问者:小点点

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


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

我已经看了ns3的手册和教程,但是我在它们中都没有发现数据包中包含哪种协议。

在ns3中有什么功能或部分让我知道我的数据包内的协议吗?或者我需要寻找报头的十六进制代码并将其与ARP代码进行比较吗?这应该是极其低效的,因为我必须对我在模拟中收到的每个数据包执行此操作。(既然我还没有完成,我不确定这是正确的方式,也不是完全可能的)。

感谢阅读


共1个答案

匿名用户

GetUid()不相关;它只是包数据结构的内部ID,与所承载的协议无关。

在ns-3中,数据包按照网络字节顺序序列化为缓冲区对象,类似于Linux内核skbuffs。检查数据包内容的一种强力方法是将数据包内容反序列化(复制)到一个单独的缓冲区中,并选取字节,正如您所提到的那样。不过,还有更好的办法。

如果您在Wifi层,并且您想了解您所拥有的数据包是否是ARP数据包,有两种主要方法可以了解这一点。首先,您可以检查数据包的报头。如果您在堆栈中只由WifiNetDevice添加了LlcSnapHeader的位置,您可以尝试查看该头并查看协议号(存储在Type字段中)。给定Ptr pkt,您可以尝试:

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

但是,请注意,如果您在堆栈中正在使用各种帧类型的地方,并不是所有的数据包都会有一个LlcSnapHeader,因此像上面这样的窥视可能并不可靠,或者您可能需要检查其他可能性。另外,如果您不够幸运,您所关心的报头位于数据包的最前面,请记住,复制数据包并从数据包副本中删除报头(实质上是将它们从堆栈中弹出)以获得所需的报头并不昂贵。

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

Packet::EnablePrinting ();

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