Каков размер пакетов udp, если я посылаю 0 данных полезной нагрузки в c #? - PullRequest
9 голосов
/ 18 ноября 2010

Я выяснил, что максимальное число данных до фрагментации между двумя конечными точками с использованием udp равно 1472 (другие конечные точки могут отличаться). это говорит о том, что mtu составляет 1500 байт, а заголовок заголовка на пакет составляет 28 байт. Можно ли предположить, что если я отправлю 0-байтовые данные (полезная нагрузка), фактические передаваемые данные будут 28 байт? Я делаю какой-то тест, поэтому мне важно знать, что происходит на канале. спасибо.

Ответы [ 4 ]

28 голосов
/ 18 ноября 2010
  • MTU - это максимальный размер IP-пакета, который может быть передан без фрагментации.

    IPv4 предписывает MTU пути не менее 576 байтов, IPv6 не менее 1280 байтов.

    Ethernet имеет MTU 1500 байт.

  • IP-пакет состоит из двух частей: заголовка пакета и полезной нагрузки.

    Размерзаголовка IPv4 составляет не менее 20 байт, размер заголовка IPv6 не менее 40 байт.

    Полезная нагрузка IP-пакета обычно представляет собой сегмент TCPили дейтаграмма UDP.

  • дейтаграмма UDP состоит из заголовка UDP и транспортируемых данных.

    Размер заголовка UDP составляет 8 байтов.

Это означает, что IP-пакет с пустой дейтаграммой UDP в качестве полезной нагрузки занимает не менее 28 (IPv4) или 48 (IPv6) байтов, но может занимать больше байтов.

Также обратите внимание, что в случае Ethernet IP-пакет будет дополнительно упакован в MAC-пакет (14-байтовый заголовок + 4CRC (байт), который будет встроен в кадр Ethernet (последовательность преамбул из 8 байтов).Это добавляет 26 байтов данных к IP-пакету, но не учитывается в MTU.

Таким образом, вы не можете предполагать, что дейтаграмма UDP вызовет передачу определенного количества байтов.

7 голосов
/ 18 ноября 2010

Типичные IP-заголовки имеют размер 20 байт, если ни один из вариантов не был выбран. Заголовки UDP составляют 8 байтов. В Ethernet размер кадра составляет 14 байтов (заголовок) + 4 байта (трейлер). В зависимости от того, как вы перехватываете эти пакеты, вы можете или не должны учитывать размер кадра.

Без Ethernet (IP + UDP) = 20 + 8 = 28 байтов
С Ethernet = 18 + 28 = 46 байт

Класс UdpClient в C # будет возвращать пакет начиная с уровня 5, поэтому вам не придется учитывать вышеизложенное.

Обновление:
MTU 1500 байт применяется на уровне IP. Это означает, что размер пакета ниже уровня IP незначителен при фрагментации.

Это означает:
Байт кадра Ethernet (фиксированный) = 18
IP заголовок (мин) = 20
Заголовок UDP (фиксированный) = 8
Максимум. разрешенная полезная нагрузка без фрагментации = 1472
Общее количество байтов, которые идут по проводам = (сумма выше) 1518 байт
(Вы можете посчитать количество байтов, оставленных с помощью инструмента, такого как Wireshark)

Если (заголовок IP + заголовок UDP + полезная нагрузка> 1500), тогда пакет фрагментирован.

4 голосов
/ 24 октября 2016

Безопасно ли предполагать, что если я отправляю данные в 0 байтов (полезная нагрузка), то фактические передаваемые данные составляют 28 байтов

нет

Нет

(и да ... потому что обычно это не имеет большого значения, если это "безопасно")

Хотя верно, что дейтаграмма UDP / IPv4 без полезной нагрузки без опций составляет ровно 28 байтов (или «октеты» в жаргоне сети), это ни в коем случае не является безопасным допущением.
Это, однако, по большей части несущественно. Коммутаторы и маршрутизаторы обычно пересылают небольшой пакет точно так же быстро, как и больший (или с незначительной разницей). Единственный случай, когда вы можете увидеть разницу - это счет за пропускную способность (вы платите за все биты в проводе, а не только за те, которые используете!).

К IPv4 может быть прикреплено до 40 октетов «опций», а IPv4 может быть инкапсулирован в IPv6 (даже без вашего ведома). И то, и другое может резко увеличить размер дейтаграммы и, следовательно, данные, передаваемые довольно очевидным образом.

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

Ethernet и ATM - два широко используемых стандарта, которые могут помешать вашим предположениям (но другие уровни связи аналогичны).

Фрейм Ethernet имеет минимальный размер 64 байта и дополняется нулями до этого размера. При наличии 802.1Q (VLAN) это означает, что минимальная полезная нагрузка для кадра Ethernet составляет 42 октета, в противном случае - 46 октетов.
Следовательно, отправка дейтаграммы UDP / IPv4 нулевой длины через «обычную» сеть Ethernet добавит 18 нулевых байтов к полезной нагрузке. Вы никогда их не увидите, но они есть, и они появятся в вашем счете.

Аналогично, ячейки АТМ (как и «фрейм», по некоторым причинам они используют другое слово) всегда составляют 53 байта с 48 байтами полезной нагрузки с нулевым дополнением. Таким образом, диаграмма UDP с нулевой полезной нагрузкой вызовет добавление 20 нулевых байтов, тогда как дейтаграмма UDP / IPv6 нулевой длины сохранит свой первоначальный размер (равный точно 48 байтов), при условии, что между ними нет другой инкапсуляции, такой как PPPoE.

Наконец, учтите, что для отправки и получения пакетов могут потребоваться дополнительные пакеты. Например, вашей сетевой карте может потребоваться ARP (или NDP) для отправки дейтаграммы. Кэширование результатов амортизирует это, когда вы отправляете несколько дейтаграмм, но если вы отправляете только одну UPD дейтаграмму, вы можете быть удивлены, что примерно в три раза больше "данных" отправлено и получено по сравнению с тем, что вы могли наивно ожидать.

1 голос
/ 18 ноября 2010

IP-издержки составляют 20 байт, а UDP - 8 байт, так что да, 28 байт.

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

Не забывайте об издержках Ethernet, если вы проводите внутреннее тестирование

...