繁体   English   中英

RAW套接字应忽略MTU

[英]RAW-Sockets should ignore MTU

我的RAW插槽有一个小问题。 我必须捕获网络中的数据包才能对其进行修改。 为此,我必须添加特殊数据,例如时间戳。 一切正常,但MTU(Linux)出现问题。

如果上层的某些应用程序生成接近MTU的数据包,则无法添加数据。 因此,我决定缩小系统的MTU。 因此,我收到了较小的数据包,可以投放我的数据。 但是,当我尝试使用RAW套接字发送数据包时,它不起作用。

我发现(通过google,在较旧的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。 我的问题是,使原始套接字忽略我的Linux系统的本地MTU。

  1. IP_MTU_DISCOVER是否是忽略MTU中设置的值的正确方法?
  2. IP_MTU_DISCOVER是否真的可以与RAW-SOCKET一起使用?
  3. 还有其他方法可以减小第3层及更高层上协议的段大小吗?

我读到,当大小太大时,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的解决方案。

以编程方式在C中设置MTU

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

第一次起作用。 但这只是一个工作环境,不是很干净。 问题可能是,如果应用程序在我调整MTU大小的那一刻正在发送数据包,则该数据包可能太大。 还有更好的主意吗?

亲切的问候,安德烈亚斯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM