【问题标题】:Raw Socket receives 1504 bytes (MTU = 1500)原始套接字接收 1504 字节 (MTU = 1500)
【发布时间】:2013-06-27 11:09:39
【问题描述】:

在我的应用程序中,我使用以下内容打开一个原始套接字(LINUX 内核 3.8.5) 说明:

::socket( PF_PACKET, SOCK_RAW, htons((uint16_t)ETH_P_ALL));

一切正常,我可以接收它并将其发送到另一个接口。 不过有的时候

::recvfrom() 

在该套接字上返回 1518(1504 个有效负载字节 + 14 个 ETH_HLEN)。

当我尝试发送这个 1518 字节的缓冲区时,指令

::send(......)

返回 EMSGSIZE(消息太长)。

请注意,在我的 NIC 接口上,MTU 是 1500,所以我预计最大 使用 ::recvfrom 检索到的 1514 (payload + ETH_HLEN) 字节

ethtype 是 0x0800,所以它不是 vlan 标记帧,因此这 4 个字节“额外”不是由于 vlan 标记

你有解释吗?

【问题讨论】:

  • 您是否在您的网卡中启用了grotso 或类似选项?如果 nic 正在执行一些分段卸载,它可能会报告高达 64k 大小的数据包,而不管 mtu 是多少

标签: c++ linux raw-sockets mtu


【解决方案1】:

我的理解是 MTU 特定于连接,因为它取决于从源到目标的整个路径 - 而不仅仅是您的本地接口。如果您发送到的地址与您从中欺骗数据包的地址不同,则 MTU 可能不同似乎很合理。

引用Linux man pages:

启用 PMTU 发现后,内核会自动跟踪每个目标主机的路径 MTU。当它通过 connect(2) 连接到特定对等方时,可以使用 IP_MTU 套接字选项方便地检索当前已知的路径 MTU(例如,在发生 EMSGSIZE 错误之后)。它可能会随着时间而改变。对于具有多个目标的无连接套接字,也可以使用错误队列访问给定目标的新 MTU(请参阅 IP_RECVERR)。每个传入的 MTU 更新都会排队一个新错误。

【讨论】:

  • 禁用它只是意味着内核不会跟踪它。这不会改变路径 MTU 的大小 - 它只会阻止您找出它是什么。
  • 好吧,我希望或接收最多 1514 个字节或至少能够发送超过 1514 个字节。
  • 您是否尝试过将 MTU 设置为更低的值 - 比如 1000?如果您的 MTU 在两条路径上始终是最小的,那么理论上它对于发送和接收应该是相同的。如果这仍然不起作用,那么我想问题一定是其他的。
  • 将 MTU 设置为 1400 我看到发送的数据包最大大小为 1414,但它们到达(至少从原始套接字中检索)大小为 1518
  • 抱歉,我没办法了。
【解决方案2】:

更多关于此事,atm调试问题我有这个配置:

eth0(Server1)-------------->eth0(Server2)-----NAT----->dummy0(Server2)

Server1 和 Server2 之间没有开关,什么都没有,只有一根电缆, dummy0 是使用 dummy 网络模块获得的网卡。

在 eth0(Server1)“TX 端”和 eth0(Server2)“RX 端”嗅探这是什么 我得到:

TX端:

1514 bytes, sequence number  15476 
1514 bytes, sequence number  15477 
1514 bytes, sequence number  15478 
1514 bytes, sequence number  15479

在 RX 方面,我期望相同,但我明白了:

1514 bytes, sequence number 15476
1518 bytes, sequence number 15477
1514 bytes, sequence number 15479

有趣的是,虽然 15478 没有收到最后 4 个字节 在这 1518 个字节(序列号 15477)中是有效载荷中的前 4 个字节 丢失的 eth 数据包。

已解决:这是 GRO 选项,确实感谢 ::rcv 上的该选项 一次获得 2 个或更多以太网帧,这就是为什么例如序列 数字“出现”丢失(实际上它与前一个合并), 对于某些数据包我得到 1518 的事实是缓冲区的大小已通过 在 ::rcv,传递一个更大的缓冲区确实我没有丢失任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2016-01-27
    相关资源
    最近更新 更多