0

我正在尝试做一个作业(来自另一个大学的课程页面),它在启动代码(带有 mininet 的 Python)中有一行

os.system("rmmod tcp_probe; modprobe tcp_probe full=1")

Popen("cat /proc/net/tcpprobe > %s" % (outfile), shell=True)

这给出了一个错误,说tcp_probe已被禁用。

我通过谷歌搜索发现在 linux 内核中tcp_probe已被弃用。然而,它只是要求我“使用 ftrace 做同样的事情”。我曾尝试在线搜索,但无法找到如何使用 ftrace 来实现相同的目标。

任何帮助表示赞赏。

4

1 回答 1

1

tldr;

不幸的是,我找不到任何方法让 TCP 跟踪点在 Mininet 中工作,而这正是 ftrace 将使用的。原因是mininet的/sys/kern/debug目录是空的,即不能开启tracing。

选项:

1. 使用 mininet-tracing(不推荐)

可能有一种方法可以让内核包含它,或者您可以使用https://github.com/mininet/mininet-tracing这可能会为您提供所需的东西,但我已经看到报告说它很慢,并且有9年前更新...

2.编写一个新的内核模块(我已经测试过了,它可以工作)

我找到的解决方案是强制打印我想到的 TCP,然后以这种方式查看结果。为了实现这一点,您基本上需要扩展 TCP 的一些行为并(很可能)重用您想到的 TCP 模块。并创建一个新的内核模块。

在这里,我提供了一个您可以使用的示例。它在每个 ACK​​ 上记录套接字信息。我还包括了一个 Makefile 和一个脚本来加载/卸载内核模块。启用模块并让一些流量流动后(假设您使用的是基于 debian 的 linux),您应该能够在/var/log/kern.log.

注意: 这是解决该问题的一种 hacky 方法,但足以满足我的需求,希望也可以帮助其他人。

于 2021-02-15T16:10:49.637 回答