Каков размер пакетов udp, если я посылаю 0 данных полезной нагрузки в C#?
Я выяснил, что максимальный объем данных до фрагментации между двумя конечными точками с использованием udp составляет 1472(другие конечные точки могут отличаться). это говорит о том, что mtu составляет 1500 байт, а заголовок заголовка на пакет составляет 28 байт. Можно ли предположить, что если я отправляю данные в 0 байтов (полезная нагрузка), то фактические передаваемые данные составляют 28 байт? Я делаю какой-то тест, поэтому мне важно знать, что происходит на канале. Благодарю.
4 ответа
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-байтовый заголовок + 4-байтовый CRC), который будет встроен в кадр Ethernet (8-байтовая последовательность преамбулы). Это добавляет 26 байтов данных к IP-пакету, но не учитывается в MTU.
Таким образом, вы не можете предполагать, что дейтаграмма UDP вызовет передачу определенного количества байтов.
Типичные заголовки 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), то пакет фрагментирован.
Можно ли предположить, что если я отправляю данные 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, вы можете быть удивлены, что примерно в три раза больше "данных" отправляется и получается по сравнению с тем, что вы могли наивно ожидать.
Служебная нагрузка IP составляет 20 байт, а UDP - 8 байт, поэтому да, 28 байт.
http://en.wikipedia.org/wiki/User_Datagram_Protocol
Не забывайте об издержках Ethernet, если вы проводите внутреннее тестирование