linux - Linux 可以缓冲 UDP 数据包来纠正顺序吗

标签 linux networking ffmpeg linux-kernel udp

再会,
我正在通过 Internet 使用 UDP 传输 MP3 音频。是的,由于各种原因,这很可能是一个坏主意,但是我的用例将我限制在此设置中。为了根据下面的评论进一步扩展,我的源设备通过非常高的延迟链路连接,吞吐量低且有限,因为这些设备位于农村/偏远地区。我的延迟时间长达 1 秒(令人震惊的是)。因此,使用 TCP 会降低我的服务,因为它有两种方式 coms、acks、resends 等。
我要解决的问题是在接收服务器(Linux Ubuntu 18.04)上,我看到了所有的数据包,但很多时候有点乱序。 IE。数据包 5 在数据包 4 之前。
Linux中有没有办法缓冲传入的UDP流,以便消费者(在我的情况下为FFMPEG)能够按顺序获取流(作为一个缓冲区,具有预期的延迟,与缓冲区大小相关联)。
Tcpdump 问题示例(注意:id 乱序):

16:04:48.648448 IP (tos 0x0, ttl 24, id 25335, offset 0, flags [DF], proto UDP (17), length 108)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 80
16:04:48.648503 IP (tos 0x0, ttl 24, id 25334, offset 0, flags [DF], proto UDP (17), length 1228)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 1200
16:04:48.884324 IP (tos 0x0, ttl 24, id 25336, offset 0, flags [DF], proto UDP (17), length 1228)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 1200
16:04:48.884357 IP (tos 0x0, ttl 24, id 25337, offset 0, flags [DF], proto UDP (17), length 108)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 80
16:04:49.145213 IP (tos 0x0, ttl 24, id 25339, offset 0, flags [DF], proto UDP (17), length 108)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 80
16:04:49.145257 IP (tos 0x0, ttl 24, id 25338, offset 0, flags [DF], proto UDP (17), length 1228)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 1200
16:04:49.406068 IP (tos 0x0, ttl 24, id 25340, offset 0, flags [DF], proto UDP (17), length 1228)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 1200
16:04:49.406125 IP (tos 0x0, ttl 24, id 25341, offset 0, flags [DF], proto UDP (17), length 108)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 80
16:04:49.667095 IP (tos 0x0, ttl 24, id 25342, offset 0, flags [DF], proto UDP (17), length 1228)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 1200
16:04:49.667175 IP (tos 0x0, ttl 24, id 25343, offset 0, flags [DF], proto UDP (17), length 108)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 80
16:04:49.929139 IP (tos 0x0, ttl 24, id 25344, offset 0, flags [DF], proto UDP (17), length 1228)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 1200
16:04:49.929200 IP (tos 0x0, ttl 24, id 25345, offset 0, flags [DF], proto UDP (17), length 108)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 80
16:04:50.164307 IP (tos 0x0, ttl 24, id 25346, offset 0, flags [DF], proto UDP (17), length 1228)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 1200
16:04:50.164385 IP (tos 0x0, ttl 24, id 25347, offset 0, flags [DF], proto UDP (17), length 108)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 80
16:04:50.425221 IP (tos 0x0, ttl 24, id 25348, offset 0, flags [DF], proto UDP (17), length 1228)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 1200
16:04:50.425285 IP (tos 0x0, ttl 24, id 25349, offset 0, flags [DF], proto UDP (17), length 108)
    xx.xx.xx.xx.2011 > 172.xx.xx.xx.2011: UDP, length 80

最佳答案

UDP 协议(protocol)不关心顺序问题以及保证交付。
因此,Linux UDP 实现即使在理论上也无法保证接收端遵守传输数据包的顺序(而网络中的某些数据包可能遵循不同的方式,导致接收端发生混洗)。这只是协议(protocol)问题,与 TCP 相比,UDP 协议(protocol)没有任何资源来实现这一点。
顺便说一句,您可以实现一些 L7(应用程序级别)逻辑来处理序列问题。但这是通过 UDP 传输媒体流量(VoIP - 例如 SIP-over-TCP/UDP + RTP-over-UDP 等)的常见情况,因为在媒体传输(语音、视频, ...)。
另请阅读:Ensuring packet order in UDP

关于linux - Linux 可以缓冲 UDP 数据包来纠正顺序吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66970471/

相关文章:

ffmpeg 创建幻灯片会导致文件非常大

Linux 端口被阻止 - 该站点无法访问,拒绝连接

linux - AWK/SED 附加到日志文件

java - 有没有好的 Java 网络库?

c - close() 和 exit() 调用后的 TCP 连接数

iphone - 使用 FFMPEG 可靠地将视频转换为 iphone/ipod 和 flash 播放器的 mp4

amazon-web-services - AWS lambda 使用 ffmpeg 达到大小限制

write(2) 能否返回写入的 0 个字节*,如果返回怎么办?

linux - #enter键在linux终端中做什么?

c - 如何使用 WPS 将 Linux 设备连接到 WiFi?