【问题标题】:How to send big chunk of data in one UDP packet?如何在一个 UDP 数据包中发送大量数据?
【发布时间】:2016-07-22 15:19:41
【问题描述】:

尝试使用 Netcat 发送 UDP 数据包

nc -u 127.0.0.1 1234

并使用 tcpdump 查看实际数据包

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

理论上,UDP 数据包大小约为 64K,但是当我发送大小大于 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

是否可以通过 Netcat 或其他工具在一个 UDP 数据包中发送长消息?在 Internet 上找不到 Netcat 的任何选项。

附:我正在使用 Ubuntu 14.04

【问题讨论】:

    标签: ubuntu udp ubuntu-14.04 tcpdump netcat


    【解决方案1】:

    问题是因为 netcat 读取特定大小的块并以这些块大小写入。而且由于它是从流(即标准输入)中读取的,因此无论如何都无法定义诸如消息边界之类的东西。我看不到使用 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                                                                                                                       
    

    【讨论】:

    • 我想发送更大的数据块,看看延迟会有多少不同,你能帮帮我吗? (数据包大小为 1GigaBytes)
    • @Arash:最大 UDP 数据包大小为 64k - UDP 标头中不支持更多。
    • 非常感谢您的帮助。我的意思是,除了 UDP,有没有办法测试更大的块?当我们发送超大数据包时,我想计算网络内的延迟,我不知道从哪里开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多