我将流量转发到 eth0 和 lo 上的端口。
对于相同端口和不同端口的相同流量,当我执行 tcpdump 并对数据包进行计数时,在时间 t 内,与 eth0 相比,我只看到环回上的数据包数量大约只有一半。
我在不同的端口号、不同的流量速率上尝试过,lo 上的数据包数量始终约为 eth0 的一半。
lo 和 eth 接口之间是否有任何本质上的不同可以解释这一点?
更新:我使用环回的 IP 地址来发送流量,这在所有设备上都是相同的。我的数据包是否可能只是在两个设备及其环回端口之间分割?
更新 2:所以我从 tcpdump 看到的是,对于 eth0,100% 的数据包被过滤器接收并捕获。但在 lo 处,过滤器只处理了 50% 收到的数据包。我只计算捕获的数据包,而不是过滤器收到的所有数据包。
但为什么 lo 只捕获了 50% 的数据包呢?
答案1
以下是您的界面的示例:
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether be:1a:e0:7d:22:6e brd ff:ff:ff:ff:ff:ff link-netns test
而 MTU 为以太网0仅1500,MTU罗是 65536。这意味着如果您通过 TCP 传输某些内容,则需要更少的数据包罗比结束以太网0对于相同的总数据大小。
数据合并的确切行为取决于多种因素和一些因素TCP 选项。例如使用TCP_CORK会赞成这种行为,而使用TCP_NODELAY将避免这种行为(通过禁用内格尔算法)。