Python: Как обрабатывать UDP-пакеты, размер которых превышает максимальный безопасный размер UDP-пакета? - PullRequest
0 голосов
/ 11 марта 2020

У меня проблемы с получением пакетов UDP, превышающих максимальный безопасный размер UDP. Я использую python с asyncio, где я создал класс UdpReceiver, который реализует базовый класс для реализации протоколов дейтаграмм (UDP) (asyncio.DatagramProtocol). Данные принимаются следующим способом:

def datagram_received(self, raw_data: bytes, addr: Tuple[str, int]) -> None

Однако, если отправляемые данные превышают максимально безопасную полезную нагрузку UDP, они фрагментируются в разные пакеты. Кто-нибудь знает, можно ли преодолеть максимально безопасную полезную нагрузку UDP в сети? Мне не нужно получать каждое отдельное сообщение, поэтому мне не нужно получать все отправляемые посылки. Если нет, то как я могу буферизовать данные для объединения всех фрагментов из одного сообщения?

Максимальный размер полезной нагрузки: максимальная безопасная полезная нагрузка UDP составляет 508 байтов, тогда как размер пакета составляет 576, с максимальным IP-заголовок байта и UDP-заголовок 8 байтов.

Asyncio: https://docs.python.org/3/library/asyncio-protocol.html

1 Ответ

0 голосов
/ 14 марта 2020

Маршрутизаторы обычно обрезают или отбрасывают фрагменты UDP, превосходящие MTU.

Отправка пакета с максимальным размером и флагом dont fragment. На сервере вы получили вырезанный фрагмент. Отправьте полученный размер клиенту и используйте его в качестве максимальной полезной нагрузки.

Безопасный способ использовать UDP - создать протокол поверх него. Добавить заголовок с размером, порядковыми номерами ... Читать о RTP (rfc3550)

Я попытался отправить 1500 байт. В локальной сети UDP повторно собрана. На Inte rnet все фрагменты не получены с другой стороны.

...