如何使用 ftrace 进行 tcp 探测?

问题描述

我正在尝试做一个作业(来自另一个大学的课程页面),其中在入门代码(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 日志。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...