Разделение/слияние UDP. Какой слой обрабатывает его? (QТ сетей)


Я пытаюсь использовать UDP для передачи больших данных по локальной сети, используя QT в качестве фреймворка для доступа к сокету. Отправка простых сообщений пока не является проблемой. Однако я не совсем понимаю, как происходит сегментация пакетов и кто это делает.

Итак, QT утверждает:

Отправка дейтаграмм размером более 512 байт обычно не рекомендуется, так как даже если они будут отправлены успешно, они, скорее всего, будут фрагментированы IP-уровнем до того, как придут к своей конечной точке. место назначения.
Поэтому я реализовал свой собственный маленький протокол для обработки разделения и слияния больших данных. Играя с большими размерами, чем 512 байт (порядка 10кбайт), я наткнулся на следующий фрагмент из wireshark:
"17","0.145050","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=0, ID=3a47) [Reassembled in #23]"
"18","0.145051","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=1480, ID=3a47) [Reassembled in #23]"
"19","0.145051","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=2960, ID=3a47) [Reassembled in #23]"
"20","0.145051","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=4440, ID=3a47) [Reassembled in #23]"
"21","0.145052","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=5920, ID=3a47) [Reassembled in #23]"
"22","0.145052","192.168.2.111","192.168.2.222","IPv4","1514","Fragmented IP protocol (proto=UDP 17, off=7400, ID=3a47) [Reassembled in #23]"
"23","0.145052","192.168.2.111","192.168.2.222","UDP","1186","63230  >  8007 Len=10024"

И из этого я получаю одну Датаграмму в QT. Поэтому мне кажется, что IP-уровень уже заботится о разделении / слиянии моих (слишком больших) UDP-пакетов. Итак:

  1. Почему рекомендуется разделить данные для UDP на я сам?
  2. " кто " обрабатывает IP-уровень? (QT, Windows, сетевое оборудование?)
  3. я предполагаю, что существует второе ограничение, возникающее из буферов чтения / записи в сокете UDP, где я могу это проверить?
1 3

1 ответ:

То, что утверждает QT, - чепуха. Даже если датаграммы фрагментированы по пути через интернет, они будут повторно собраны в пункте назначения. Они правы в том, что это делается на уровне IP, поэтому вашему приложению не о чем беспокоиться, если только вы не собираетесь нарушить максимальный размер дейтаграммы 64k (64k - Wikipedia on UDP )

Что касается ваших вопросов:

  1. явная ошибка. Игнорировать.
  2. IP-уровень обрабатывается стеком IP, обычно на уровне ядра
  3. в "2-й предел" определяется протоколом IP (v4 в вашем случае), который определяет длину поля до 16 бит, что делает максимальный размер дейтаграммы 64k (RFC 791)

Однако, если вы собираетесь передавать большие куски данных надежным способом, вы должны действительно использовать TCP вместо UDP. Пусть TCP обрабатывает эти вещи вместо вашего приложения.