繁体   English   中英

无法通过大于10K的UDP发送图像

[英]Unable to send images on UDP larger than 10K

我正在尝试开发一个客户端/服务器应用程序,其中客户端会将图像发送到服务器。

情况1:

服务器在路由器后面的一台计算机上运行,​​客户端在另一台路由器后面的另一台计算机上运行。 由于此通信将通过WAN(公共IP)进行,因此在服务器端路由器上转发了端口,以便服务器可以轻松地在该端口上接收传入的UDP数据报。

UDP的最大传输单位(MTU)大小为64KB。 这意味着UDP套接字应该能够传输大小小于或等于65,536字节的任何内容。 当我正在开发应用程序时,客户端只能发送10-13k的图像(UDP数据报)。 如果我尝试传输大小大于10Kb的图像,服务器将无法接收它,并且服务器端UDP套接字将始终处于(接收)阻止模式。

情况2:

服务器在路由器后面的机器上运行,而客户端在同一路由器后面的机器上运行。 这意味着客户端和服务器位于同一局域网中。 甚至客户端和服务器都共享同一个局域网客户端正在服务器的公共IP上发送图像(UDP数据报)。 在这种情况下,服务器能够接收最大64K的任何大小的UDP数据报,这是我期望从我的应用程序获得的数据。

我尝试在不同的远程PC上运行客户端,但是结果是相同的。 服务器无法接收大于10-13Kb的UDP数据报。 如果有人可以帮助我处理这种情况,将不胜感激。

链接到代码: http : //pastebin.com/f644fee71

谢谢,祝你好运。 问候,

阿提夫

尽管IP层可能允许最大64k的UDP数据包,但我认为您会发现最大的“原始” UDP数据包大小将被限制为源和目标之间设备的最小MTU。

标准的以太网MTU是〜1500字节。 某些设备支持最大约10 KB的“巨型”帧以提高性能。 但是通常在公共Internet上不支持这种事情,而仅在LAN上。

IP层可以对UDP数据包进行分段(除非在数据包中设置了无分段位)。 但是,只有按顺序(或在特定时限内乱序)接收到每个片段,接收方才可以接收和整理数据包。 否则它将丢弃该数据包。

也可能并非所有源和目标之间的设备都支持发送设备的帧大小。 我遇到过这样的情况,我需要将路由器上的MTU降低到〜1450字节,因为中间路由器在1500丢弃了数据包。这是由于MTU发现不能可靠地工作。 即,发送设备无法确定其到达目的地的路径上的设备的MTU是多少。 设备在该路径中的某个位置将丢弃它认为太大的数据包。

UDP对于您正在执行的操作是一个非常糟糕的主意。 您最好使用TCP。

如果您担心TCP连接设置/断开的性能,请保持连接尽可能长的时间。

当您不太在意目标是否接收到数据包时,UDP只是一种传输数据的好协议。 无法保证交货。 在所有其他情况下,请使用TCP。

如果确定要使用UDP,则必须在协议中实现路径MTU发现 ,并假设路由器/防火墙不会阻止“需要分段”的ICMP数据包。 他们不应该这样,否则TCP也将不起作用。 但是就像我说的那样,过去我曾见过需要分段的ICMP数据包被阻塞或丢弃,而我不得不手动调整自己的MTU的情况。

UDP是不可靠的数据报协议。 不能保证数据包到达其目的地或发送顺序。

另外,当发送大于1500字节的数据包时,您会发现它们变得碎片化,或更糟的是丢失了。 接收器将尽力将其拼凑在一起。 但是,如果缺少任何内容,请再见。 所以实际上,限制实际上是在1500字节标记附近,但有时要少得多,以确保没有碎片并确保碎片到达。 要发送比更高级别协议更大的数据,必须将它们重新组合在一起,并请求丢失的所有内容。

图像有多大? 无论如何,64K可能太小。

您有两个或三个选项。

1)使用TCP-它可靠且面向流。 您不必担心会为您处理多大或小的碎片。

2)使用UDP,但首先要开发更高级别的应用协议。 根据您的协议,可能需要大量工作。 我现在正在这样做。

3)看一下使用UDT库。 它设计用于通过WAN传输批量数据,并且具有比TCP更好的性能。

但是,我想建议TCP可能会很好地满足您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM