每50毫秒发送一张图片,我应该使用TCP还是UDP?

3
我正在构建一个C#应用程序,使用服务器-客户端模型,其中服务器通过套接字每50毫秒向客户端发送一个图像(100kb)...
我曾经使用TCP,但除了这个协议的开销之外,有时客户端最终会在套接字上拥有多个图像。而且我还没有想到一个聪明的机制来拆分每个图像的字节(实际上,我只需要最新的那个)。
我尝试使用UDP,但得出结论我不能发送100kb数据报,只能发送64kb数据报。即便如此,我也不应该使用超过1500字节;否则数据包将在网络上分裂,丢失数据包的可能性更大。
所以现在我有点困惑。我应该继续使用TCP,并在每个图像的末尾放置一些转义字节,以便客户端可以将它们分开吗?还是应该使用UDP,发送1500字节的数据报,并想出一个排序和恢复机制?
关键目标是非常快速地传输图像。只要客户端继续接收新的图像,我不介意在途中丢失一些图像。
或者我应该使用另一种协议?提前感谢!
5个回答

15

您应该考虑使用实时传输协议(又名RTP)。

RTP使用的底层IP协议是UDP,但它还有其他层用于指示时间戳、序列顺序等。

RTP是VoIP和视频-over-IP系统中主要的媒体传输协议。如果您找不到现有的C#实现,请不要感到意外。

此外,如果您的图像文件是JPEG格式,您应该能够生成一个RTP/MJPEG流。已经有相当多的视频查看器本身支持接收和显示这种流,因为一些IP网络摄像机输出的就是这种格式。


2
首先,无论你怎么做,你的网络可能都无法处理这个问题,但我会选择使用UDP。你可以尝试将图像分成更小的块,并且只有在收到所有部分后才显示每个图像,然后等待下一个图像的到来。
此外,你可以像其他人建议的那样使用RTP,或者尝试使用UDT。它是一种基于UDP的相对轻量级的可靠层。它应该比TCP更快。

1

如果:

  • 您的应用程序可以处理图像或小量突发图像未到达的情况
  • 您可以将图像压缩成65535字节以内

我建议使用UDP。

如果您正在实现视频会议应用程序,则值得注意的是,大多数使用UDP。

否则,您应该使用TCP并实现划分图像的方法。在这方面,有一个建议是查看RTP协议。它专门设计用于传输实时数据,如VoIP和视频。

编辑:过去我曾多次寻找.Net RTP库,除了非.Net库的包装器或不完整的库之外,我没有太大的成功。我又快速浏览了一下,这个 ConferenceXP 看起来更有前途。


1

其他答案涵盖了UDP或像RTP这样的“真实”协议的好选择。

但是,如果您想坚持使用TCP,只需构建一个简单的“消息”结构来满足您的需求。最简单的方法是长度前缀。首先,发送图像的长度作为4个字节,然后发送图像本身。编写客户端和服务器非常容易。


我同意这是如何通过TCP框架化数据的,但这违背了新即是最好的理念。因此,因为丢失旧数据而延迟新数据真的不是想要的。 - Simeon Pilgrim

0
如果最新的比每张图片都更重要,那么UDP应该是你的首选。
但是,如果你处理的帧大于64K,你必须自己进行某种形式的重新分帧。不要担心分段帧,因为你必须处理它,否则下层将会处理。而且你只想要完成的图片。
你需要的是一些带有时间戳/序列号的封装形式。

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