gpt4 book ai didi

c - RAW-Sockets 应该忽略 MTU

转载 作者:太空宇宙 更新时间:2023-11-04 12:47:26 24 4
gpt4 key购买 nike

我的 RAW-Socket 有一个小问题。我必须捕获网络中的数据包才能修改它们。为此,我必须添加特殊数据,例如时间戳。一切正常,但我的 MTU (Linux) 有问题。

如果上层的某些应用程序生成接近 MTU 的数据包,我无法添加我的数据。所以我决定缩小系统的 MTU。所以我得到了更小的数据包,可以添加我的数据。但是当我尝试使用我的 RAW-Socket 发送我的数据包时,它不起作用。

我发现(通过谷歌,在旧的 Stackoverflow 线程和 linux 联机帮助页中)IP_MTU_DISCOVER 选项可以提供帮助。但是当我将它与 setsockopt 一起使用时,没有任何变化。

if ((s = socket(AF_PACKET, SOCK_RAW, ETH_P_ALL)) < 0) {
printf("Error: could not open socket\n");
return -1;
}

char socket_mtu = IP_PMTUDISC_DONT;
setsockopt(s,IPPROTO_IP,IP_MTU_DISCOVER,socket_mtu, 1);

也许这很重要。 MTU 的缩小已经完成,因为当我添加自己的数据时,生成的数据包不会大于 1500 + ETH-Header。我的问题是,让 Raw-Sockets 忽略我的 Linux 系统的本地 MTU。

  1. IP_MTU_DISCOVER 是忽略 MTU 中设置的值的正确方法吗?
  2. IP_MTU_DISCOVER 真的可以用于我的 RAW-SOCKET 吗?
  3. 是否有任何其他方法可以减少第 3 层及更高层协议(protocol)的分段大小?

我读到,当大小太大时,sendto() 返回 EMSGSIZE (=90)。所以我做了下面的测试。

int k = sendto(s, frame.buffer, frame_len, 0,
(struct sockaddr*)&saddrll, sizeof(saddrll));
printf("K:%i\n", k);

调用 sendto() 后,“k”包含“-1”。但是如果要看数据包的大小,不应该是“90”吗??

当我将要发送的数据包大小设置为小于 MTU 时,它工作正常......有点奇怪。

任何帮助都会很好 :-)

亲切的问候,安德烈亚斯

最佳答案

好的。我找到了从我的 C 程序更改 MTU 的解决方案。

set MTU in C programmatically

buffer.ifr_mtu = 1500;
if(!ioctl(s, SIOCSIFMTU, &buffer)) {
printf("MTU changed\n");
}

第一次它起作用了。但这只是一种解决方法,并不是很干净。问题可能是,如果在我调整 MTU 大小时应用程序正在发送数据包,则数据包可能太大。有更好的想法吗?

亲切的问候,安德烈亚斯

关于c - RAW-Sockets 应该忽略 MTU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38305799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com