移动提供商无法进行UDP打孔

Dan*_*ano 7 java android udp protocols

实际上iam编写一个Android应用程序,接收连接到PC的网络摄像头的图片.为了获得更多的fps,我使用udp协议而不是tcp.这个想法是,电脑将图片发送到手机的IP和端口.但手机提供商有不同的公共端口.所以我不能直接拨打电话.这就是为什么我试图通过udp打孔来解决这个问题,但那没有用.当我的手机发送一个数据包到电脑,电脑的电话的公共IP和端口.这种情况每秒都会发生,以保持开放.然后,服务器尽可能快地将网络摄像头帧发送到此IP和端口.但手机只需1-2秒即可收到10-15张照片.之后,提供商似乎过滤了后续的每个数据包或类似的东西,因为手机没有收到任何进一步的数据包.

现在我的问题是:发生了什么(或提供商在做什么)以及如何解决这个问题?TCP协议可以工作,但由于过多的开销和错误更正,因此流速太慢.

Set*_*ble 11

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

  • 正如您可能知道的那样,一旦发送UDP数据报,就绝对无法保证它能够通过并且没有确定的方法来知道发生了什么,如果没有.

  • 大于1400字节的有效负载可能会被分解为IP分段.接收操作系统可以将它们重组为整个数据包,但仅限于每个片段到达时.有些路由器会随意丢弃片段,如果某些防火墙包含特定的字节模式,则会丢弃片段,有些会限制片段的发送速率.最好始终保持您的数据报很小,并自己处理重新组装和重复丢失的部分.

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

一般来说,设备和防火墙制造商倾向于将UDP视为垃圾,因此作为UDP开发人员,您必须成为一个不被倾倒的额外好公民:规范您的流量,记住丢弃的数据包意味着您可能过快,并保持包小.在受控环境中有很多可以逃脱的东西,但如果应用程序将"在野外"部署,则需要进行大量精心编程以避免出现问题.