Я провожу некоторые эксперименты с обнаружением пути MTU в Linux.Насколько я понял из RFC 1191, если маршрутизатор получает пакет с ненулевым битом DF и пакет не может быть отправлен на следующий хост без фрагментации, то маршрутизатор должен отбросить пакет и отправить сообщение ICMP начальномуотправитель.
Я создал несколько виртуальных машин на своем компьютере и связал их следующим образом:
VM1 (192.168.100.2)
R1 (192.168.100.1,
192.168.150.1)
R2 (192.168.150.2,
192.168.200.1)
VM2 (192.168.200.2)
Rx - это виртуальные машины с установленным Linux, у них есть два сетевых интерфейса сстатический маршрут.Пинг V2 с V1 и наоборот успешен.
traceroute from 192.168.100.2 to 192.168.200.2 (192.168.200.2)
1 192.168.100.1 (192.168.100.1) 0.437 ms 0.310 ms 0.312 ms
2 192.168.150.2 (192.168.150.2) 2.351 ms 2.156 ms 1.989 ms
3 192.168.200.2 (192.168.200.2) 43.649 ms 43.418 ms 43.244 ms
tracepath 192.168.200.2
1: ubuntu-VirtualBox.local 0.211ms pmtu 1500
1: 192.168.100.1 0.543ms
1: 192.168.100.1 0.546ms
2: 192.168.150.2 0.971ms
3: 192.168.150.2 1.143ms pmtu 750
3: 192.168.200.2 1.059ms reached
Сегменты 100.x и 150.x имеют MTU 1500. Сегмент 200.x имеет MTU 750.
Я пытаюсьотправлять UDP-пакеты с включенным DF.Дело в том, что VM1 вообще не отправляет пакет в случае, если размер пакета больше 750 (я получаю ошибку EMSGSIZE для вызова send ()).
Однако я ожидаю такого поведения для пакетов, размер которых превышает 1500. И я ожидаю, что VM1 отправляет пакеты с размером от 750 до 1500 в R1, и R1 (или R2) отбрасывает такие пакеты ивозвращает ICMP-пакет на VM1.Но этого не происходит.
Есть два вопроса:
1) Почему?
2) Можно ли настроить мою виртуальную сеть для приема пакетов ICMP вСогласно RFC 1191?
Спасибо.