Каков размер кадра Ethernet «в сети»? 1518 или 1542?

Каков размер кадра Ethernet «в сети»? 1518 или 1542?

В соответствии стаблица здесь, там написано, что MTU = 1500 байт, а полезная часть составляет 1500 - 42 байта или 1458 байт (<- это на самом деле неверно!). Теперь к этому нужно добавить заголовки IPv4 и UDP, которые составляют 28 байт (20 IP + 8 UDP). Это оставляет максимально возможное сообщение приложения в 1430 байт! Но, посмотрев это число в Интернете, я вижу 1472. Я неправильно делаю расчет?

Все, что я хочу узнать, это максимальное сообщение приложения, которое я могу отправить по сети без риска фрагментации. Это определенно не 1500, потому что это включает заголовки кадров. Может кто-нибудь помочь?


Путаница в том, что PAYLOAD на самом деле может быть размером до 1500 байт, и это MTU. Так каков же размер in-the-wire для payload в 1500? Из этой таблицы он может быть размером до 1542 байт.

Таким образом, максимальное количество сообщений приложения, которое я могу отправить, составляет 1472 (1500 - 20 (ip) - 8 (udp)) для максимального размера провода 1542. Меня поражает, как все может быть настолько сложным, когда оно на самом деле простое. И я понятия не имею, как кто-то придумал число 1518, если в таблице указано 1542.

решение1

Диаграмма на Википедии ужасна. Надеюсь, то, что я сейчас напишу, будет понятнее.


Максимумполезная нагрузкав 802.3 ethernet это 1500 байт.
Это данные, которые вы пытаетесь отправить по проводу (и на что ссылается MTU).
[payload]<- 1500 байт

Полезная нагрузка инкапсулирована вEthernet-фрейм(который добавляет исходный/целевой MAC, тег VLAN, длину и контрольную сумму CRC. Это в общей сложности 22 байта дополнительных "вещей"
[SRC+DST+VLAN+LENGTH+[payload]+CRC]<- 1522 байта

Кадр передается по проводу — прежде чем ваша сетевая карта сделает это, она просто встает и очень громко кричит, чтобы убедиться, что никто другой не использует провод (CSMA/CD) — этоПреамбулаиОграничитель начала кадра(SFD) -- еще 8 байт, теперь у нас есть:
[Preamble+SFD+[Ethernet Frame]]<- 1530 байт

Наконец, когда Ethernet-трансивер завершает отправку кадра, стандарт 802.3 требует, чтобы он передал 12 байт тишины («межкадровый интервал»), прежде чем ему будет разрешено отправить следующий кадр.
[Preamble+SFD+[Ethernet Frame]+Silence]<- 1542 байта передано по проводу.


Преамбула, SFD и межкадровый интервал не считаются частью кадра. Они являются структурой поддержки для самого протокола Ethernet.

MTU применяется к полезной нагрузке — это самая большая единица данных, которую можно втиснуть в пакет. Таким образом, пакет Ethernet с MTU 1500 байт на самом деле будет фреймом 1522 байта и 1542 байта на проводе (при условии наличия тега vLAN).

Итак, ответ на ваш вопрос -Какой максимальный пакет я могу отправить по Ethernet 802.3 без фрагментации?- является1500 байт полезных данных.

ОДНАКОуровень ethernet может не быть вашим ограничивающим фактором. Чтобы узнать, ограничивает ли что-то по пути MTU размером менее 1500 байт данных полезной нагрузки, используйте один из следующих способов:

  • Окна: ping hostname -f -l sizeofdata(техника, упомянутая Джоном К.)
  • БСД:ping -D -s sizeofdata hostname
  • Линукс:ping -M do -s sizeofdata hostname

Наибольшее значение из sizeofdataэтого числа — MTU (по конкретному пути, по которому передаются ваши данные).

решение2

Это зависит от количества данных, которые вы поместите в кадр. Если вы поместите 1500 байт данных в кадр, ваш общий размер кадра составит 1518 байт. С 1472 байтами данных вы получите общий размер кадра 1500..

http://en.wikipedia.org/wiki/Ethernet_frame

Тем не менее, если вы действительно заинтересованы в тестировании фрагментации, хорошим способом сделать это будет старый добрый ping с несколькими флагами:

ping имя_хоста -f -l размер_данных

Флаг -f приведет к сбою ping, если пакет фрагментирован. Ключевым моментом для понимания здесь является то, что "sizeofdata" - это объем данных, которые вы можете поместить в сообщение без фрагментации - так что если вы отправляете полезную нагрузку в 1500 байт, вы начнете фрагментировать, как только превысите 1500 байт. Однако уменьшите это значение до 1472 (1500 - 18 байт накладных расходов), и вы увидите, что ping проходит.

решение3

Для базового кадра Ethernet_II размер кадра составляет 1518 байт (по проводу или вне его). Он состоит из 6 байт для каждого адреса назначения и источника, 2 байт для поля типа между 46 и 1500 байтами для полезной нагрузки (в вашем случае весь пакет IP с его заголовком IP и заголовком UDP) и 4 байта для FCS. В дополнение к этому существует ограничение на то, насколько малым может быть кадр (64 байта). Вот почему диапазон составляет от 46 байт (добавьте это к двум адресам, типу и FCS, и вы получите 64 байта - 46+6+6+2+4=64).

Если кадр находится в сети, которая поддерживает несколько vlan, и вам нужно пометить кадр тегом vlan, то одно дополнительное поле добавляется перед полем типа. Это 4 байта. Теперь это означает, что диапазон размеров для полезной нагрузки может быть уменьшен на 4 байта в нижней части и все еще иметь 64 байта как минимум. Отсюда и 42. (Так что 42+6+6+2+4 + 4 для тега vlan = 64)

Так что когда диапазон записан 1500-42, это не означает 1500 минус 42, это означает, что все от 1500 до 42 байт является допустимым. На проводе этот маркированный кадр может быть размером до 1522 байт (если используется только один тег, или 1526, если используются два тега). Ничто из этого не объясняет число 1542.

Чтобы получить это число, вам нужно рассмотреть, как можно отправить кадр по Ethernet. В локальной сети Ethernet нет часов, поэтому передатчик кадра отправляет серию единиц и нулей для установки часов. Это называется преамбулой. Не каждый слушатель «услышит» всю преамбулу, но большинство должны услышать некоторую ее часть. Чтобы обозначить конец преамбулы, один из последних 8 отправленных битов переворачивается так, что вместо 10101010 он становится 10101011. Этот байт называется разделителем начала кадра (SDF). Это технически бесполезно для захвата с провода, поэтому 7 байтов преамбулы и 1 байт SDF обычно не учитываются, но если бы они были, наши исходные 1518 теперь были бы 1526. Все еще не 1542..

После отправки кадра на проводе наступает вынужденная тишина, которая называется межкадровым промежутком. Это эквивалентно передаче 12 байт. Это также не подсчитывается и не фиксируется, но если бы это было так, то мы получили бы 1538 байт. Единственный способ теперь перейти от 1538 к 1542 — это сказать, что кадр помечен (т. е. он содержит 4-байтовый тег плана). Уф, наконец-то 1542.

Все дело в терминологии. Стандартный кадр — это 1518 байт на проводе (с точки зрения любого устройства захвата). Тегированный кадр (один тег) — это 1522 байта на проводе. Они занимают 1538 байт или 1542 байта пространства передачи на проводе.

Надеюсь, это поможет прояснить ситуацию.

решение4

нет, вы хотите, чтобы произошла фрагментация, поэтому вы получаете пакет, который должен быть фрагментирован, но df set воспринимает это так: двухстороннее шоссе с целой кучей полуприцепов против того же шоссе с целой кучей маленьких смарт-автомобилей, которые оба едут в один и тот же пункт назначения полуприцепы несут больше полезной нагрузки, но медленнее и могут легче застрять в пробке меньшие автомобили несут меньше, но едут быстрее MSS также не то же самое, что MTU

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