установить MTU в C программно - PullRequest
4 голосов
/ 06 мая 2011

Клиент запросил, чтобы ограничение MTU было 1492.

Есть ли способ сделать это в исходном коде (программа на C)?

Есть ли другой способ сделатьэто вообще?(ifconfig?)

Почему кому-то нужно изменить MTU до определенного предела?В чем выгода?И самое главное: изменяя MTU, есть ли риск сломать код?

Ответы [ 4 ]

4 голосов
/ 14 января 2016

Программным способом с использованием 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.

3 голосов
/ 06 мая 2011

Дело не в скорости напрямую; Увеличивая MTU, вы уменьшаете накладные расходы, то есть данные, которые отвечают за правильную доставку пакета, но не могут быть использованы конечным пользователем; Это может иметь увеличение скорости, но только для интенсивного движения;

Кроме того, если вы увеличиваете MTU, вы склонны увеличивать количество отбрасываемых пакетов (поскольку у вас есть фиксированная вероятность ошибок по битам и больше битов в пакете), что в конечном итоге приводит к снижению производительности при повторном отправлении пакетов, и т.д ... Так что это компромисс между издержками и целостностью данных;

Я полагаю, что это скорее конфигурация интерфейса, чем то, чем вы управляете с помощью программы; Поэтому лучше придерживаться команды 'ifconfig' или найти эквивалентное решение для Windows.

3 голосов
/ 06 мая 2011

MTU - это число, которое определяет максимальную единицу передачи для пакета. Чем оно больше, тем быстрее будут отправлены ваши данные. Предполагая, что вы можете отправлять n пакетов / с размером m, если m увеличивается, m*n также увеличивается.

Я думаю, что ваш клиент хочет этот MTU из-за своего сетевого оборудования (возможно, Ethernet 802.3). У некоторых аппаратов гендель самые большие рамки, чем у других.

Вы можете использовать ifconfig с параметром mtu, чтобы изменить его значение: ifconfig eth0 mtu 1492.

1 голос
/ 24 мая 2019

современный способ установки параметров интерфейса - через sysfs

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

С помощью C просто откройте и запишите файлы

...