我有两个用 veth-pair 连接的 linux 容器。在一个容器的 veth 接口上,我设置了 tc qdisc netem 延迟并将流量从它发送到另一个容器。如果我使用 tcpdump/wireshark 观察双方的流量,可以看到发送方和接收方的同一数据包的时间戳不会因选定的延迟而有所不同。
我想更详细地了解在哪一点 libpcap 将时间戳放入与 tc qdisc 对应的出口流量。我在互联网上搜索了一个方案/图片,但没有找到。我发现了这个话题(wireshark packet capture point),但它建议通过再增加一个容器/接口来引入间接。在我的情况下,这不是可能的解决方案。有没有办法解决这个问题,而不是引入额外的中间接口(即不改变拓扑),而只能通过在已经给定的 veth-interface 进行记录,但以这种方式可以看到延迟?
更新:
我太快了,所以误会了。我的解决方案(与@AB 答案的第一个变体相同)和@AB 的 IFB 解决方案(我已经检查过)都不能解决我的问题。问题是a1-eth0
拓扑中发送方接口的传输队列溢出:
[a1-br0 ---3Gbps---a1-eth0]---100Mbps---r1---100Mbps---r2
Run Code Online (Sandbox Code Playgroud)
我太快了,只检查了a1-eth0
和路由器之间链接的延迟 10 毫秒r1
。今天我试图提高延迟:100 毫秒、200 毫秒,结果(我得到的每个数据包延迟和速率图)对于上面的拓扑和正常拓扑开始不同:
[a1-eth0]---100Mbps---r1---100Mbps---r2
Run Code Online (Sandbox Code Playgroud)
所以不,当然,为了准确测试,我不能有额外的链接:Linux 网桥、这个 IFB 或任何其他第三方系统都没有引入。我测试拥塞控制方案。我想在特定的拓扑结构中做到这一点。而且我不能仅仅为了绘图而改变拓扑——我的意思是如果我的速率和延迟结果/绘图同时发生变化。
更新 2:
所以看起来已经找到了解决方案,如下所示(NFLOG 解决方案)。
更新 3:
这里描述了 NFLOG 解决方案的一些缺点(大链路层标头和具有零负载的出口 TCP 数据包的错误 TCP 校验和),并提出了一个更好的解决方案,NFQUEUE 没有任何这些问题:零长度出口数据包的 TCP 校验和错误(用 iptables 捕获)。但是,对于我的任务(拥塞控制方案的测试),NFLOG 和 NFQUEUE 都不适合。正如同一个链接所解释的那样,当从内核的 iptables 捕获数据包时,发送速率会受到限制(这就是我的理解)。因此,当您通过从接口捕获(即,定期)在发件人处记录时,您会得到 2 GB 的转储,而如果您通过从 iptables 捕获而在发送者处记录,则会得到 …
如果我运行 ifconfig 我可以看到没有分配给任何接口的 ipv6 地址。如果我尝试创建 AF_INET6 套接字,我收到一条错误消息,指出不支持地址系列。我没有/proc/sys/net/inet6文件夹。该机器运行 Debian 10 (buster)。在/etc/default/grub中没有关于 ipv6 禁用的行。
$ uname -r
4.19.52.1.amd64-smp
Run Code Online (Sandbox Code Playgroud)
请您告诉我如何启用ipv6?我找到了很多关于如何禁用它但没有找到如何启用它的文章。