问题描述
我正在尝试做一个作业(来自另一个大学的课程页面),其中在入门代码(Python 和 mininet)中有一行作为
os.system("rmmod tcp_probe; modprobe tcp_probe full=1")
Popen("cat /proc/net/tcpprobe > %s" % (outfile),shell=True)
出现错误,指出 tcp_probe
已被禁用。
我通过谷歌搜索发现 tcp_probe
在 linux 内核中一直是 deprecated。然而,它只是要求我“使用 ftrace 做同样的事情”。我试过在线搜索,但找不到如何使用 ftrace 来实现相同的效果。
感谢任何帮助。
解决方法
tldr;
不幸的是,我找不到任何方法让 TCP 跟踪点在 Mininet 中工作,而这正是 ftrace 将使用的。原因是mininet的/sys/kern/debug目录为空,即无法启用tracing。
选项:
1.使用 mininet-tracing(不推荐)
可能有一种方法可以让内核包含它,或者您可以使用 https://github.com/mininet/mininet-tracing 这可能会为您提供所需的东西,但我看到报告说它很慢,并且已在 9 年前更新...
2.编写一个新的内核模块(我已经测试过了,它可以工作)
我找到的解决方案是强制打印我想到的 TCP,然后以这种方式查看结果。为了实现这一点,您本质上需要扩展一些 TCP 的行为并(很可能)重用您想到的 TCP 模块。并创建一个新的内核模块。
Here 我提供了一个您可以使用的示例。它在每个 ACK 上记录套接字信息。我还包含了一个 Makefile 和一个脚本来加载/卸载内核模块。在您启用模块并让一些流量流动后(假设您使用的是基于 debian 的 linux),您应该能够在 /var/log/kern.log
中找到您的 TCP 日志。
注意: 这是解决这个问题的一种黑客方法,但足以满足我的需求,希望也能帮助其他人。