以编程方式在C中设置MTU

时间:2011-05-05 20:42:41

标签: c sockets network-programming mtu

客户要求MTU限制为1492.

有没有办法在源代码中执行此操作(C语言中的程序)?

一般来说还有其他办法吗? (ifconfig的?)

为什么有人需要将MTU修改到一定限度?有什么好处?而且最多 重要的是:通过更改MTU是否存在破坏代码的风险?

4 个答案:

答案 0 :(得分:3)

以C编程方式使用C:

int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
struct ifreq ifr;
strcpy(ifr.ifr_name, "eth0");
if(!ioctl(sock, SIOCGIFMTU, &ifr)) {
  ifr.ifr_mtu // Contains current mtu value
}
ifr.ifr_mtu = ... // Change value if it needed
if(!ioctl(sock, SIOCSIFMTU, &ifr)) {
  // Mtu changed successfully
}

至少在Ubuntu上有效,请参阅man netdevice

答案 1 :(得分:2)

MTU是一个定义每个数据包的最大传输单位的数字。它越大,您的数据发送速度就越快。假设您可以发送nm个数据包,如果m增长,m*n也会增长。

我认为您的客户希望MTU因为其网络设备(可能是以太网802.3)。有些设备的最大帧数比其他设备大。

您可以使用ifconfig选项mtu更改其值:ifconfig eth0 mtu 1492

答案 2 :(得分:2)

这不是关于速度的直接;通过增加MTU,您可以减少开销,这是负责正确交付软件包的数据,但最终用户无法使用;这可以提高速度,但仅适用于繁忙的交通;

此外,如果增加MTU,则容易增加丢弃的数据包数量(因为您有一个固定的位错误概率和数据包中的更多位),最终会导致重新发送数据包的性能下降,等......所以它是开销和数据完整性之间的折衷;

我猜这更像是一个接口配置而不是你用程序控制的东西;所以最好坚持使用'ifconfig'命令或找到适合Windows的等效解决方案。

答案 3 :(得分:0)

设置接口参数的现代方法是通过sysfs

sudo sh -c 'echo 1492 > /sys/class/net/tun/mtu'

通过C,只需打开并写入文件即可