[英]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。
我读到,当大小太大时,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的解决方案。
buffer.ifr_mtu = 1500;
if(!ioctl(s, SIOCSIFMTU, &buffer)) {
printf("MTU changed\n");
}
第一次起作用。 但这只是一个工作环境,不是很干净。 问题可能是,如果应用程序在我调整MTU大小的那一刻正在发送数据包,则该数据包可能太大。 还有更好的主意吗?
亲切的问候,安德烈亚斯
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.