我的应用程序需要从服务器到客户端逐帧发送视频数据。 我在使用TCP或UDP之间摇摆不定。
从我的测试中,我发现了一些以下结果:
TCP:非常容易实现。
UDP:要向Client发送一个帧(大约50KB),如果我为每个帧创建1个UDP包,则发送总是丢失帧。所以我必须将每个帧分成许多UDP包。这使得我的算法更加复杂,因为UDP协议可能会丢失包,并且包可能无序传递。 此外,如果每个UDP包中的数据长度很大,则很容易丢失。
我有一些问题:
我是否应该将TCP或UDP用于此类应用程序。
如果我想使用UDP进行更快的传输,如何确定每个包中的数据长度在传输时不会轻易丢失? (这可能属于网络带宽)?
根据您的经验,您能估算一下TCP的速度达到了多少UDP?
很抱歉帖子中有这么多问题,但在决定是否在我的应用程序中使用TCP或UDP之前,我需要了解更多详细信息。
答案 0 :(得分:5)
由于您的应用程序流视频,您可能需要UDP。 TCP和UDP之间的一个巨大差异(在这种情况下)是UDP不会像TCP那样尝试恢复丢失的数据包。您不希望每次跳过帧时都重新加载视频,因为它需要很长时间,而UDP只会跳过丢失的帧。 (如果右键单击Youtube视频,您可以看到流式传输视频时丢弃的数据包数量)
答案 1 :(得分:3)
在你的情况下我会使用TCP ,除非你实际上有手动分段和重新组装UDP数据包的实践经验,并且你愿意保持代码中引入的开销(比如有一个重新组装缓冲区并控制这暗示的延迟。
此外,您应该考虑目标网络。它只是localhost,LAN,WAN甚至互联网。您对网络的控制越少,在往返时间,延迟,数据包丢失等方面支持TCP的影响就越大。控制是指交叉网段(#routers)数量的上限或估计值,数量不同的配置(QoS,带宽限制器,MTU,......),等等。
根据经验,当即时(下面定义)所需的所有数据都适合一个数据包(IPv6中的MTU保证为1280)时,UDP非常棒。瞬间是一个短暂的快照,通常具有往返时间的寿命。 UDP也适用于查询和响应都是小实体的对话。
所以从这个意义上说,我'使用UDP来做DNS(简短查询,简答)或金融交易数据(在1次往返的生命周期内只有这么多时间),或协议元数据,如参与客户的数量或身份哈希(查询/响应短,并且在往返时间内只有少数)。
希望这有帮助。
修改强>
回答你的问题
IP_DONTFRAG
套接字选项对于某些数字和灵感,您应该查看udt。
答案 2 :(得分:0)
除了视频/音频流之外,UDP还用于具有短消息的低延迟应用程序。