TCP 丢包 (ns3)

TCP packet drop (ns3)

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

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

但这仅对基于 p2p 的单个 TCP 连接有用 link。在我的拓扑中,有一个 p2p 连接,但有 2 个应用程序在同一个 p2p link 上使用 TCP,我想分别了解每个 TCP 连接的丢弃数据包数。我在网上进行了很多研究,但找不到任何资源。请指出一些资源或提供 class 名称,我可以使用它来检测 TCP 连接特定的数据包丢失。

上面的命令现在结合了两个连接的数据包丢失并将它们输出到 stream 因为它们是在同一个 p2p link.

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

但是,您可以确定数据包对应于哪个连接。简单地剥离数据包 headers,并检查端口号。请记住,每个连接都由唯一的 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;
}