移动网络供应商不支持UDP打洞。

8
实际上,我正在编写一款Android应用程序,该应用程序接收连接到PC的网络摄像头的图片。为了获得更多的帧速率,我使用UDP协议而不是TCP。这个想法是,PC将图片发送到手机的IP和端口。但是,手机的供应商有不同的公共端口,因此我无法直接寻址手机。因此,我尝试通过UDP打洞来解决问题,但这并没有起作用。当我的手机向PC发送一个数据包时,PC会获得手机的公共IP和端口。这每秒钟发生一次以保持连接开放。然后,服务器以最快的速度将网络帧发送到此IP和端口。但是,手机在1-2秒内仅收到10-15张图片。之后,提供商似乎过滤了每个后续数据包或类似的东西,因为手机不再接收任何数据包。

现在我的问题是:发生了什么(或者供应商在做什么),我该如何解决这个问题? TCP协议可以工作,但由于太多的开销和错误校正而对流媒体来说速度太慢了。


3
它们大约有20k。但我已经找到了原因:我在太短的时间内发送了太多数据包。由于���备无法快速处理它们,它们已被存储在设备的网络堆栈中。现在我在每个数据包之间等待75ms,它就像魔法般地工作了=) - Dano
2
@Dano 如果你找到了解决方案,请编辑你的答案或回答你自己的问题。谢谢。 - user569322
1个回答

12

UDP存在一些需要注意的问题,这些问题在移动网络上会被放大:

  • 发送UDP数据包后,无法保证它们一定能够到达目的地,并且如果未能到达,则没有确切的方法可以知道发生了什么。

  • 大于约1400字节的有效负载可能会被分成IP片段。接收操作系统可能将它们重新组合成一个完整的数据包,但前提是每个片段都成功到达。一些路由器随意丢弃片段,有些防火墙会在片段中包含特定字节模式时丢弃片段,还有些会限制片段发送速率。因此最好始终保持数据报文小,并自己处理缺失部分的重组和重复。

  • 没有流量控制:如果任何路由器的缓冲区已满,那么该路由器之后的所有数据包将被丢弃。某些路由器在其缓冲区正在增长但尚未充满时会开始随机丢弃一定比例的数据包。如果UDP源以比某个任意阈值更快的速度传输数据,则某些防火墙将把其列入黑名单。

总的来说,设备和防火墙制造商往往会对UDP进行不良处理,因此作为UDP开发人员,您必须成为一个额外好的公民,以避免被抛弃:调节你的流量,记住丢失的数据包意味着你可能过于迅速,同时保持数据包小。在受控环境中有很多可以做的事情,但如果应用程序将部署到"野外",就需要进行大量的编程工作来避免问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接