Установить MTU в C программно
Клиент запросил, чтобы ограничение MTU было 1492.
Есть ли способ сделать это в исходном коде (программа на C)?
Есть ли другой способ сделать это вообще? (IFCONFIG?)
Почему кто-то должен изменить MTU до определенного предела? В чем выгода? И самое главное: изменяя MTU, есть ли риск сломать код?
3 ответа
Дело не в скорости напрямую; Увеличивая 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, смотрите man netdevice
,
MTU - это число, которое определяет максимальную единицу передачи на пакет. Чем оно больше, тем быстрее будут отправлены ваши данные. Предполагая, что вы можете отправить n
пакетов / с m
размер, если m
растет, m*n
тоже растет.
Я думаю, что ваш клиент хочет этот MTU из-за его сетевого оборудования (может быть, Ethernet 802.3). У некоторых аппаратов гендель самые большие рамки, чем у других.
Вы можете использовать ifconfig с опцией mtu
изменить его значение: ifconfig eth0 mtu 1492
,
Современный способ установки параметров интерфейса - через sysfs
sudo sh -c 'echo 1492 > /sys/class/net/tun/mtu'
C, просто откройте и напишите как файлы