如何强制进程通过 UDP 而不是 TCP 传输?

dem*_*pap 4 networking tcp port udp

我在 Linux 机器上运行 ffserver 进程,以便通过ffmpeg实现视频流。但是,视频流有延迟。在ffserver 配置文件上,我定义了Port 8090.

命令netstat -tulnap给了我这个:

root@beagleboard:/etc# netstat -tulnap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             Stat                                                                             e       PID/Program name
tcp        0      0 0.0.0.0:68                  0.0.0.0:*                   LIST                                                                             EN      654/pump
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LIST                                                                             EN      662/portmap
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LIST                                                                             EN      698/dropbear
tcp        0      0 0.0.0.0:8090                0.0.0.0:*                   LIST                                                                             EN      744/ffserver
tcp        0     52 192.168.1.104:22            192.168.1.111:10838         ESTA                                                                             BLISHED 724/dropbear
udp        0      0 0.0.0.0:514                 0.0.0.0:*                                                                                                            703/syslog-ng
udp        0      0 0.0.0.0:111                 0.0.0.0:*                                                                                                            662/portmap
udp        0      0 0.0.0.0:60628               0.0.0.0:*                                                                                                            709/avahi-daemon: r
udp        0      0 0.0.0.0:5353                0.0.0.0:*                                                                                                            709/avahi-daemon: r
Run Code Online (Sandbox Code Playgroud)

如您所见,ffserver进程使用tcp协议进行传输,我怀疑这是视频流延迟的原因。如何强制进程使用或 udp 协议?我应该改变端口吗?

use*_*686 22

您不能只强制程序使用 UDP 而不是 TCP,而不重写程序本身的某些部分。这些协议差别太大,无法互换。

  • TCP 是面向流的(接收方将所有内容看作是按照发送方输出的确切顺序的连续流);UDP 是面向数据报的(每个数据报都在一个单独的数据包中发送,它们甚至可以重新排序)。

  • TCP 具有流量控制,因此发送方(或发送方的操作系统)确切知道在不溢出链接或显着影响其他连接的情况下应该以多快的速度发送数据。UDP 不会做任何这些——一个“强制”很差的程序可能会开始通过 UDP 每秒发送千兆字节的数据,而不管链接速度如何。

  • TCP 有重传,所以如果一个数据包在中间被丢弃(例如因为网络过载或有其他问题),它将被重新发送。如果协议依赖于可靠的传输,并且您强制它通过 UDP,则只要至少一个数据包丢失,连接就可能完全中断。(并且数据包丢失;请参阅上面的第 1 点和第 2 点。)


小智 6

正如其他人所提到的,UDP 和 TCP 是根本不同的协议。

但是,如果您必须通过 UDP 而不是 TCP 传输数据,则可以使用诸如socat 之类的中继工具。您可以将 socat 配置为侦听 TCP 连接,并将 TCP 流的内容作为 UDP 流转发到另一台主机。如果另一台主机需要 TCP 流量,您可以使用那里的另一个中继实例来转换回 TCP。这将从主机到主机链接中删除重试和确认行为。本地中继工具和本地应用程序之间仍会出现重试和确认,但您不太可能在本地环回链路上看到重试。

但是,这不太可能解决您的延迟问题。如果您的应用程序构建为使用 TCP 而不是 UDP,则它可能无法容忍丢弃的数据包,在这种情况下,此 hack 可能会导致不稳定的行为。