c++ - TCP 丢包 (ns3)
问题描述
我是 ns3 网络模拟器的新手,想知道如何获取 TCP 连接中丢包的数量。我知道以下命令:
devices.Get (1)->TraceConnectWithoutContext ("PhyRxDrop", MakeBoundCallback (&RxDrop, stream));
但这仅对通过 p2p 链接的单个 TCP 连接有用。在我的拓扑中,有一个 p2p 连接,但有 2 个应用程序在同一 p2p 链路上使用 TCP,我想分别了解每个 TCP 连接丢弃的数据包数。我在网上搜索了很多,但找不到任何资源。请指出一些资源或给出我可以用来检测特定于 TCP 连接的数据包丢失的类名。
到目前为止,上述命令结合了两个连接的数据包丢失并将它们输出到,stream
因为它们位于相同的 p2p 链路上。
解决方案
的用法RxDrop
告诉我您使用的是 ns-3 教程中的第四个.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;
}
推荐阅读
- php - PHP CURL - 当你只知道 id 时抓取 seo url
- javascript - 当我只想传递一个字符串(ANGULAR 5 AND FIREBASE)时,角度反应形式制作对象
- python - 使用python查找集群
- android-recyclerview - recyclerview 在 7 个项目后未显示来自 json 数组的数据
- perl - 如何推送 1) 查找内容、2) 替换内容和 3) 计数
- postgresql - 未实现跨数据库引用:
- android - LiveData 中意外添加的观察者
- ios - 矩形周围的阴影实现
- html - 输入文本的自定义工具提示
- sharepoint - 如何授予用户自定义操作权限(站点操作)