Максимальный размер пакета Tcp и udp - PullRequest
1 голос
/ 10 февраля 2020

При использовании recvfrom(2) для получения пакета из сети я получаю каждый раз 1 пакет.

Какова максимальная длина пакета TCP / UDP, получаемого с этой функцией?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

В TCP нет фиксированного ограничения, потому что это потоковый протокол, а не протокол дейтаграмм.

В UDP через IPv4 ограничение составляет 65 507 байт. From Wikipedia :

Length
В этом поле указывается длина в байтах заголовка UDP и данных UDP. Минимальная длина составляет 8 байт, длина заголовка. Размер поля устанавливает теоретический предел в 65 535 байт (8-байтовый заголовок + 65 527 байт данных) для дейтаграммы UDP. Однако фактический предел для длины данных, который устанавливается базовым протоколом IPv4, составляет 65 507 байт (65 535 - 8-байтовый заголовок UDP - 20-байтовый заголовок IP).

Использование IPv6 jumbograms возможно иметь дейтаграммы UDP размером более 65 535 байт. RF C 2675 указывает, что поле длины установлено в ноль, если длина заголовка UDP плюс данные UDP превышает 65 535.

Обратите внимание, что используется чрезвычайно большой UDP датаграммы могут быть проблематичны c. Немногие сетевые соединения имеют такие большие MTU, поэтому датаграмма, вероятно, будет фрагментирована. Если какой-либо фрагмент потерян, весь уровень дейтаграммы должен быть повторно отправлен прикладным уровнем (если приложение требует и реализует надежность). TCP обычно использовал Path MTU Discovery для отправки потока в сегментах, которые соответствуют минимальному MTU всех ссылок в пути; если сегмент потерян, TCP может просто повторно передать сегменты после этого (или просто потерянный сегмент, если реализовано селективное подтверждение, которое сейчас предлагает большинство реализаций TCP).

2 голосов
/ 10 февраля 2020

recvfrom всегда будет возвращать ровно один пакет для UDP. Пакеты UDP могут иметь размер до 64 КБ, отдавать или принимать для нескольких байтов заголовка. На практике большинство протоколов UDP никогда не отправляют столько данных в одном пакете. Таким образом, размер буфера, передаваемый в recvfrom, может быть намного меньше в зависимости от того, что предписывает ваш протокол.

Для TCP вы обычно используете recv, а не recvfrom для чтения входящих данных из подключенного сокета. Многие отмечают, что TCP - это потоковый протокол, а не протокол сообщений / пакетов, такой как UDP. Таким образом, recv вернет вам неопределенное c количество байтов между 1 и размером буфера, передаваемого самому вызову recv. Всегда проверяйте возвращаемое значение из recv вызова - не гарантируется, что вы получите конкретный счетчик байтов.

...