【问题标题】:TCP packet drop (ns3)TCP 丢包 (ns3)
【发布时间】:2021-12-07 00:43:02
【问题描述】:

我是 ns3 网络模拟器的新手,想知道如何获取 TCP 连接中丢包的数量。我知道以下命令:

devices.Get (1)->TraceConnectWithoutContext ("PhyRxDrop", MakeBoundCallback (&RxDrop, stream));

但这仅对通过 p2p 链接的单个 TCP 连接有用。在我的拓扑中,有一个 p2p 连接,但有 2 个应用程序在同一 p2p 链路上使用 TCP,我想分别了解每个 TCP 连接丢弃的数据包数。我在网上搜索了很多,但找不到任何资源。请指出一些资源或给出我可以用来检测 TCP 连接特定数据包丢失的类名。

到目前为止,上述命令结合了两个连接的数据包丢失并将它们输出到stream,因为它们位于同一个 p2p 链接上。

【问题讨论】:

    标签: c++ networking tcp ns-3


    【解决方案1】:

    RxDrop 的用法告诉我您在 the ns-3 tutorial 中引用了第四个.cc。连接到 PhyRxDrop TraceSource 将导致为每个丢弃的数据包调用请求的回调。 ns-3 没有数据包过滤器,因此只会为某些数据包调用回调。

    但是,您可以确定数据包对应的连接。只需剥离数据包标头,并检查端口号。请记住,每个连接都由唯一的 4 元组定义:(主机 IP、主机端口、目标 IP、目标端口)。

    static void
    RxDrop(Ptr<const Packet> packet) {
        /* 
         * Need to copy packet since headers need to be removed
         * to be inspected. Alternatively, remove the headers,
         * and add them back.
         */
        Ptr<Packet> copy = packet->Copy();
    
        // Headers must be removed in the order they're present.
        PppHeader pppHeader;
        copy->RemoveHeader(pppHeader);
        Ipv4Header ipHeader;
        copy->RemoveHeader(ipHeader);
        TcpHeader tcpHeader;
        copy->RemoveHeader(tcpHeader);
    
        std::cout << "Source IP: ";
        ipHeader.GetSource().Print(std::cout);
        std::cout << std::endl;
        std::cout << "Source Port: " << tcpHeader.GetSourcePort() << std::endl;
        std::cout << "Destination IP: ";
        ipHeader.GetDestination().Print(std::cout);
        std::cout << std::endl;
        std::cout << "Destination Port: " << tcpHeader.GetDestinationPort() << std::endl;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2014-07-13
      • 2019-07-29
      • 2013-10-10
      相关资源
      最近更新 更多