移动提供程序无法进行UDP打孔



实际上是在编码一个安卓应用程序,该应用程序接收连接到电脑的网络摄像头的图片。为了获得更多的fps,我使用udp协议而不是tcp。这个想法是,电脑将图片发送到手机的ip和端口。但手机的提供商有不同的公共端口。所以我不能直接打电话。这就是为什么我试图通过udp打孔来解决这个问题,但没有成功。当我的手机向电脑发送一个数据包时,电脑会获得手机的公共ip和端口。这会每秒发生一次,以保持连接打开。然后服务器以最快的速度将webcome帧发送到这个ip和端口。但手机在1-2秒内只收到10-15张图片。在那之后,提供商似乎会过滤掉接下来的每一个数据包或类似的东西,因为手机没有收到任何进一步的数据包。

现在我的问题是:发生了什么(或者提供商在做什么),我该如何解决这个问题?TCP协议可以工作,但由于太多的开销和纠错,流传输速度太慢。

UDP有几个问题需要记住,这些问题在移动网络上会被放大:

  • 正如你可能知道的,一旦你发送了一个UDP数据报,就绝对不能保证它会通过,也没有确切的方法知道如果它没有通过会发生什么。

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

  • 没有流量控制:如果任何路由器的缓冲区已满,之后的所有内容都会被丢弃。如果一些路由器的缓冲区正在增长但尚未满,它们将开始随机丢弃一定比例的数据包。如果UDP源的速度超过某个任意阈值,某些防火墙会将其列入黑名单。

一般来说,设备和防火墙制造商倾向于像对待垃圾一样对待UDP,所以作为UDP开发人员,你必须是一个特别好的公民,不要被抛弃:调节你的流量,记住丢弃的数据包意味着你可能走得太快,并保持数据包较小。在受控的环境中有很多问题可以解决,但如果应用程序将"在野外"部署,则需要进行大量仔细的编程才能避免问题。

最新更新