首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RAW-套接字应该忽略MTU

RAW-套接字应该忽略MTU
EN

Stack Overflow用户
提问于 2016-07-11 11:28:54
回答 1查看 868关注 0票数 0

我的生插座有点小问题。我必须在网络中捕获数据包来修改它们。为此,我必须添加特殊数据,如时间戳。一切都很好,但是我的MTU (Linux)有问题。

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

我发现(通过谷歌,在旧的Stackoverflow线程和linux手册中),IP_MTU_DISCOVER可能会有所帮助。但是当我和setsockopt一起使用它时,没有什么变化。

代码语言:javascript
复制
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报头。我的问题是,让原始套接字忽略我的Linux系统的本地MTU。

  1. IP_MTU_DISCOVER是忽略MTU中的值集的正确方法吗?
  2. IP_MTU_DISCOVER对我的原始套接字是可用的吗?
  3. 有没有其他方法来减少第三层及更高层协议的分割大小?

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

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

调用sendto()后,"k“包含"-1”。但是,如果它取决于数据包的大小,是不是应该是"90"?

当我把我喜欢发送的数据包的大小设置得比MTU小的时候,它工作得很好.有点奇怪。

任何帮助都会很好:)

你好,安德烈亚斯

EN

回答 1

Stack Overflow用户

发布于 2016-07-11 12:43:11

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

set MTU in C programmatically

代码语言:javascript
复制
buffer.ifr_mtu = 1500;
  if(!ioctl(s, SIOCSIFMTU, &buffer)) {
      printf("MTU changed\n");
  }

它第一次起作用。但这只是个工作,不太干净。问题是,如果一个应用程序在我调整MTU大小的时候发送一个数据包,那么这个包可能太大了。有更好的主意吗?

你好,安德烈亚斯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38305799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档