Как настроить большой mtu (linux)

Как настроить большой mtu (linux)

У меня есть гигабитное ethernet-соединение между моим ноутбуком и маршрутизатором, а также работающее ipv6-соединение с интернетом. Я могу получать очень большие пакеты с сайтов в интернете, размером до 10000 байт (согласно wireshark). (редактировать: оказывается, это «общая разгрузка приема» Linux) Однако при попытке отправить что-либо мой локальный компьютер фрагментирует данные размером чуть ниже 1500 байт для ipv6. (На ipv4 я могу отправлять в Интернет пакеты TCP размером не менее 1514 байт, я могу пинговать пакеты вплоть до настроенного mtu 6128, но они блокируются.)

Я использую Ubuntu 12.04. Я настроил mtu для своего eth0 на 6128 (максимум, который он принимает), используя ip link set dev eth0 mtu 6128и в графическом интерфейсе апплета NetworkManager, и перезапустил соединение. ip link show eth0показывает, что mtu 6128 действительно установлено. ip -6 routeпоказывает, что ни один из путей, о которых знает ядро, не имеет установленного mtu. Я могу пинговать по ipv4 пакетами до 6128 байт (хотя я не получаю ответов), но когда я это делаю, ping6 myrouter -c3 -s1500 -Mdoя получаю сообщения об ошибкахс моего компьютераговорит, что пакеты слишком большие, а mtu равен 1480. Я подтвердил с помощью Wireshark, что в сеть ничего не передается, а ответы действительно генерируются моим собственным компьютером.

Итак, как мне заставить свой компьютер использовать больший MTU?

решение1

То, что вы видите, скорее всего, не является кадрами jumbo. Что-то около 99,9% Интернета работает на MTU в 1500 байт и ниже. Вероятно, это просто ваше ядро ​​или сетевая карта выполняют объединение пакетов.

Это делается с помощью функции, которая обычно называется Generic Recieve Offload (GRO) или Large Recieve Offload (LRO). Это работает так: пакеты в одном потоке идентифицируются и объединяются, а затем подаются в стек TCP/IP. Это может сэкономить значительное количество циклов ЦП, поскольку сокращает количество циклов обратного перемещения в стек.

Попробуйте это: ethtool -K $INTERFACE gro off

Что отключает эту функцию и делает Wireshark счастливее (но не ваш процессор)

Вы все еще можете использовать более высокие MTU локально, но это не дает вам многого именно из-за таких функций, как эта, и, конечно, все более быстрого оборудования. Также это может стать кошмаром для управления. Существует множество глючных драйверов и оборудования, а также разная степень поддержки настройки MTU через DHCP или RA в операционных системах. Поскольку вы хотите, чтобы все устройства в данном широковещательном домене работали с одинаковым MTU, это часто делает большие кадры непрактичными.

решение2

MTU в основном используется локально. Использование Jumbo-кадров через несколько сетевых переходов (например, маршрутизатор+интернет) является сложным и, скорее всего, не будет работать. DSL, например, обычно ограничиваетMTU путидо 1492 байт. Как правило, Path MTU определяется наименьшим MTU соединения между любыми участвующими маршрутизаторами. Если вы не контролируете весь путь и не устанавливаете большие MTU для каждого соединения, увеличение MTU только на вашем компьютере ничего не даст (кроме, возможно, улучшения скорости вашей локальной сети).

решение3

Я узнал, как это сделать, основываясь на комментарии Стефана Зайделя. Оказывается, есть еще одна настройка mtu, которую ipкоманда не отображает. Установка большего значения в /proc/sys/net/ipv6/conf/eth0/mtu(команда sudo sh -c "echo 0 > /proc/sys/net/ipv6/conf/eth0/mtu"сделала то, что я хотел. (Не то чтобы это сильно помогло, маршрутизатор действительно отбрасывал более крупные кадры.) Это значение регулярно обновляется/сбрасывается через Router Advertisement. RA можно отключить, записав 0в accept_raту же папку в /proc.

Связанный контент