2015-09-25 5 views
1

Я занимаюсь тестированием пропускной способности UDP с использованием iperf (https://iperf.fr/) по IPv6. У меня есть очень плохие результаты при использовании клиента Linux UDP с помощью следующей командной строки:iperf UDP over IPv6

iperf -u -V -c fe80::5910:d4ff:fe31:5b10%usb0 -b 100m 

Исследуя вопрос с Wireshark я видел есть некоторая фрагментация, пока клиент отправляет данные. Точнее, я вижу UDP-клиент исходящих пакетов размером 1510 байт и 92 байта, чередующихся. Например, UDP-пакеты, которые я вижу, имеют следующий шаблон (в размере): 1510, 92, 1510, 92, 1510, 92, ..., 1510, 92, ...

Чтение документации iperf2 I прочитайте следующее для опции (-l):

Длина буферов для чтения или записи. iPerf работает, записывая массив len байтов несколько раз. Значение по умолчанию - 8 КБ для TCP, 1470 байт для UDP. Примечание для UDP, это размер дейтаграммы и должен быть снижен при использовании адресации IPv6 до 1450 или менее, чтобы избежать фрагментации. См. Также опции -n и -t.

Я попытался сделать то же тест пропускной способности, заменив клиента командной строки Linux Iperf UDP следующим:

iperf -u -V -c fe80::5910:d4ff:fe31:5b10%usb0 -b 100m -l1450 

и я вижу хорошие результаты. Глядя на захват Wireshark, я больше не вижу фрагментации.

Выполнение того же теста по IPv4 Мне не нужно изменять размер дейтаграммы по умолчанию UDP (мне не нужно использовать параметр -l), чтобы получить хорошие результаты.

Таким образом, мой вывод заключается в том, что фрагментация (по протоколу IPv6) отвечает за слабые характеристики полосы пропускания.

В любом случае, мне интересно, что на самом деле происходит при установке размера дейтаграммы UDP на 1450 по IPv6. Почему у меня есть фрагментация по IPv6, а не по IPv4 со значением по умолчанию для размера дейтаграммы UDP? Более того, почему у меня нет фрагментации при уменьшении размера дейтаграммы UDP до 1450?

спасибо.

ответ

3

Наиболее распространенный MTU для Ethernet - 1500, not including ethernet frame headers. Это означает, что вы можете отправить 1500 байтов в одном пакете по проводу, включая заголовки IP. IPv6 headers больше, чем IPv4 headers по нескольким причинам, причем наиболее важным является то, что адреса IPv6 больше, чем IPv4. Поэтому при запуске со значением по умолчанию по IPv6 размер вашего пакета превышает размер MTU, и пакет необходимо разбить на два; процедура известна как fragmentation.

+1

Итак, если я правильно понял, сохраняя MTU фиксированным на 1500, у нас меньше места для полезной нагрузки UDP из-за большего размера заголовка IPv6. В результате датаграмма UDP по умолчанию не соответствует рамке Ethernet вместе с заголовками Ethernet и IPv6, и пакет должен быть фрагментирован. – salvo

+1

Да! Хотя ethernet MTU делает [не включать заголовки Ethernet] (https://en.wikipedia.org/wiki/Ethernet_frame#Ethernet_II). Таким образом, вы можете обычно отправлять 1500 байтов * полезную нагрузку * (полезная нагрузка в контексте Ethernet, являющаяся IP-пакетом, включая заголовки IP) в каждом кадре Ethernet. –

5

Базовый заголовок IPv4 составляет 20 байтов, базовый заголовок IPv6 - 40 байт, а UDP - 8 байтов.

С IPv4 суммарный размер пакета 1470 + 8 + 20 = 1498, что меньше, чем локальные сети по умолчанию MTU 1500.

с IPv6 общий размер пакета составляет 1470 + 8 + 40 = 1518, который более 1500 и должен быть фрагментирован.

Теперь давайте рассмотрим ваши наблюдения. Вы видите пакеты размером 1510 и 92. Среди них - заголовок ethernet, который составляет 14 байтов. Таким образом, ваши пакеты IPv6 составляют 1496 и 78 байтов. Содержимое большого пакета: заголовок IPv6 (40 байт), заголовок фрагментации (8), заголовок UDP (8) и 1440 байт данных. Меньший пакет содержит заголовок IPv6 (40), заголовок фрагментации (8) и остальные 30 байтов данных.

+1

Привет, это звучит неплохо. Спасибо. – salvo

Смежные вопросы