RAW套接字应该忽略MTU

时间:2016-07-11 11:28:55

标签: c linux network-programming

我的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. IS IP_MTU_DISCOVER真的可以用我的RAW-SOCKET吗?
  3. 还有其他方法可以减少第3层及更高层协议的分段大小吗?
  4. 我读过,sendto()在大小太大时返回EMSGSIZE(= 90)。所以我做了以下测试。

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

    致电sendto()&#34; k&#34;包含&#34; -1&#34;。但如果它取决于数据包的大小,那就不应该是&#34; 90&#34; ??

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

    任何帮助都会很好: - )

    亲切的问候, 安德烈亚斯

1 个答案:

答案 0 :(得分:0)

确定。我找到了一个从我的C程序中改变MTU的解决方案。

set MTU in C programmatically

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

第一时间它起作用。但它只是一个工作场所,它不是真正干净。问题是,如果应用程序在调整MTU大小的那一刻发送数据包,则数据包可能太大。有更好的想法吗?

亲切的问候, 安德烈亚斯