Как отправить большой кусок данных одним пакетом UDP?

пытается отправить UDP-пакеты с помощью Netcat

nc -u 127.0.0.1 1234

И используя tcpdump, чтобы увидеть фактические пакеты

tcpdump -i any -vv -n udp dst port 1234

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

012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789

tcpdump покажет 2 пакета:

08:13:09.171828 IP (tos 0x0, ttl 64, id 25262, offset 0, flags [DF], proto UDP (17), length 2076)
    127.0.0.1.33279 > 127.0.0.1.1234: [bad udp cksum 0x061c -> 0x7eb9!] UDP, length 2048
08:13:09.171842 IP (tos 0x0, ttl 64, id 25263, offset 0, flags [DF], proto UDP (17), length 981)
    127.0.0.1.33279 > 127.0.0.1.1234: [bad udp cksum 0x01d5 -> 0x3723!] UDP, length 953

Можно ли отправлять длинные сообщения одним UDP-пакетом через Netcat или другой инструмент? Не удалось найти ни одной опции для Netcat в Интернете.

P.S. Я использую Ubuntu 14.04


person MKo    schedule 22.07.2016    source источник


Ответы (1)


Проблема в том, что netcat читает кусками определенного размера и записывает их. И поскольку он читает из потока (т.е. stdin), в любом случае невозможно определить что-то вроде границы сообщения. Я не вижу никаких параметров для изменения размера чтения с помощью nc, но если вам нужна командная строка для отправки больших пакетов, вы можете использовать Perl или аналогичный, например:

$ dd if=/dev/zero bs=1024 count=32 | perl -MIO::Socket::INET -e \
   'IO::Socket::INET->new(PeerAddr => q[127.0.0.1:1234], Proto => q[udp])->send(do { local $/; <STDIN> })'

$ tcpdump -i lo -n port 1234
... IP 127.0.0.1.42061 > 127.0.0.1.1234: UDP, length 32768                                                                                                                       
person Steffen Ullrich    schedule 22.07.2016
comment
Я хочу отправить больший объем данных и посмотреть, насколько будет отличаться задержка, не могли бы вы мне помочь? (размер пакета 1Гигабайт) - person Arash; 11.08.2020
comment
@Arash: Максимальный размер пакета UDP составляет 64 КБ - больше не поддерживается в заголовке UDP. - person Steffen Ullrich; 11.08.2020
comment
Спасибо большое за помощь. Я имею в виду, кроме UDP, есть ли способ протестировать более крупные куски? Я хочу рассчитать задержки в сети, когда мы отправляем очень большие пакеты, и я не уверен, с чего начать. - person Arash; 11.08.2020