【发布时间】: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 标记
你有解释吗?
【问题讨论】:
-
您是否在您的网卡中启用了
gro或tso或类似选项?如果 nic 正在执行一些分段卸载,它可能会报告高达 64k 大小的数据包,而不管 mtu 是多少
标签: c++ linux raw-sockets mtu