以编程方式在C中设置MTU

以编程方式在C中设置MTU,c,sockets,network-programming,mtu,C,Sockets,Network Programming,Mtu,客户要求MTU限额应为1492 在源代码(C语言的程序)中有这样做的方法吗 一般来说,还有其他方法吗?(ifconfig?) 为什么有人需要将MTU修改到某个限制?好处是什么?最 重要提示:更改MTU是否有破坏代码的风险?是定义每个数据包的最大传输单位的数字。它越大,发送数据的速度就越快。假设您可以发送大小为m的n数据包/s,如果m增长,m*n也会增长 我认为您的客户需要MTU是因为它的网络设备(可能是以太网802.3)。一些设备的机架尺寸比其他设备大 您可以使用选项mtu来更改其值:ifcon

客户要求MTU限额应为1492

在源代码(C语言的程序)中有这样做的方法吗

一般来说,还有其他方法吗?(ifconfig?)

为什么有人需要将MTU修改到某个限制?好处是什么?最 重要提示:更改MTU是否有破坏代码的风险?

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

我认为您的客户需要MTU是因为它的网络设备(可能是以太网802.3)。一些设备的机架尺寸比其他设备大


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

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

此外,如果您增加MTU,您很容易增加丢弃的数据包的数量(因为您有固定的误码概率,并且数据包中有更多的位),最终导致重新发送数据包的性能下降,等等。。。因此,这是开销和数据完整性之间的折衷


我猜这更像是一个界面配置,而不是你用程序控制的东西;因此,最好坚持使用“ifconfig”命令,或者为Windows找到等效的解决方案。

使用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上运行,请参阅。

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

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

通过C语言,只需打开并作为文件写入即可

那么,这仅仅是速度和配置的问题(以太网、pppoE等)?是否存在破坏现有代码的风险?据我所知,这比软件问题更重要。在Windows上,为了实现最大性能,建议使用MTU。是否可以通过编程设置它?是否有一个API来设置连接或接口的MTU?我确实相信这是~可能的~,但不确定如何设置。可能是一些非常特定于平台的东西…很酷
ioctl()
函数也可以在Windows中使用
Ws2_32.lib
Ws2_32.dll
winsock2.h