Настройте MTU для каждого сокета? - PullRequest
2 голосов
/ 12 ноября 2010

Мне было интересно, есть ли способ настроить (в системе Linux) MTU для данного сокета. (Чтобы фрагментация уровня IP на куски была меньше, чем фактический MTU устройства).

Когда я говорю для данного сокета, я имею в виду не программно в коде приложения, владеющего сокетом, а скорее внешне, например, через запись sysfs.

Если в настоящее время нет способа сделать это, есть ли у вас какие-либо идеи о том, где перехватить / исправить в ядре Linux, чтобы реализовать такую ​​возможность?

Спасибо.

РЕДАКТИРОВАТЬ: какого черта я хочу это сделать?

Я делаю некоторое Layer3-in-Layer4 (например, туннелирование IP и выше через TCP-туннель) туннелирование. В отличие от VPN-подобных решений, я не использую виртуальный интерфейс для достижения этой цели. Я собираю пакеты с помощью iptables, отбрасываю их обычным способом и записываю в туннельный сокет.

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

Ответы [ 2 ]

2 голосов
/ 12 ноября 2010

Если сокет создан таким образом, что DF устанавливается для исходящих пакетов, вам может повезти в подделке (инъекции) сообщения о необходимости фрагментации ICMP обратно в себя, пока вы не получите желаемый MTU.Скорее уродливо, но в зависимости от того, насколько вы отчаянны, это может быть уместно.

Например, вы можете сгенерировать эти пакеты с помощью правил iptables, поэтому сопоставление и отправка просты и не зависят от вашего приложения.Похоже, что у цели REJECT для iptables нет необходимости отбраковывать фрагментацию, хотя, вероятно, добавить ее будет не так уж и сложно.

Другой подход, если вам нужны только TCP-пакеты, вам может повезти с опцией сокета TCP_MAXSEG или целью TCPMSS, если это соответствует вашей проблеме.

Для UDP или rawвы можете send() пакетов настолько маленького размера, насколько вы себе представляете!

Обновление:

На основании "почему я хочу это делать?"ответ, это похоже на фрагментацию пакетов, если DF не установлен или повышение ICMP «необходима фрагментация», и удаление фактически будет правильным решением.

Это то, что сделал бы более «нормальный» маршрутизатор, и при условии, что брандмауэры не сгружают пакет ICMP, тогда он будет вести себя разумно во всех сценариях, тогда как ретроспективное изменение вещей - это рецепт странного поведения.

iptables зажим mss довольно неплохое исправление для TCP через эту «VPN», тем более, что, похоже, вы уже широко используете iptables.

0 голосов
/ 12 ноября 2010

MTU - это свойство ссылки, а не сокета. Они принадлежат разным слоям стека. При этом TCP выполняет обнаружение Path MTU во время трехстороннего рукопожатия и очень старается избежать фрагментации. Вам будет сложно создавать фрагменты для отправки по TCP. С помощью UDP проще всего заставить небольшой интерфейс MTU на интерфейсе с ifconfig(8) и затем отправлять пакеты больше этого значения.

...