我应该使用 TCP 还是 UDP? [关闭]
Posted
技术标签:
【中文标题】我应该使用 TCP 还是 UDP? [关闭]【英文标题】:Should I use TCP or UDP? [closed] 【发布时间】:2012-06-20 12:12:38 【问题描述】:我的应用程序需要将视频数据从服务器逐帧发送到客户端。 我在使用 TCP 还是 UDP 之间犹豫不决。
从我的测试中,我发现了以下一些结果:
TCP:很容易实现。
UDP:要向客户端发送一个帧(大约 50KB),如果我为每个帧创建 1 个 UDP 包,那么发送总是会丢失帧。所以我必须把每一帧分成很多UDP包。这使我的算法更加复杂,因为 UDP 协议可能会丢失包裹并且包裹可能会乱序交付。 另外,如果每个UDP包中的数据长度很大,很容易丢失。
我有一些问题:
我应该对这种类型的应用程序使用 TCP 还是 UDP。
如果我想使用UDP进行更快的传输,如何确定每个包中数据的合适长度,在传输过程中不会轻易丢失? (这可能属于网络带宽)?
根据您的经验,您能估算出 TCP 比 UDP 快多少百分比?
很抱歉在帖子中有这么多问题,但在决定在我的应用程序中使用 TCP 还是 UDP 之前,我需要了解更多详细信息。
【问题讨论】:
skullbox.net/tcpudp.php ,udp 常用于音频和视频,所以可能对于您的应用程序更适合 【参考方案1】:由于您的应用程序流式传输视频,您可能需要 UDP。 TCP 和 UDP(在这种情况下)之间的一个巨大区别是 UDP 不会像 TCP 那样尝试恢复丢失的数据包。您不希望每次跳过一帧时都重新加载视频,因为这需要很长时间,相反 UDP 只会跳过丢失的帧。 (如果您右键单击 Youtube 视频,您可以看到流式传输视频时丢弃的数据包数)
【讨论】:
抱歉,我不知道百分比,但您可以查看***.com/questions/47903/… 了解有关速度差异的更多信息。【参考方案2】:在您的情况下,我会使用 TCP 除非您实际上具有手动分段和重新组装 UDP 数据包的实践经验,并且您愿意维护代码中引入的开销(就像拥有一个重组缓冲区并控制这意味着的延迟)。
此外,您应该考虑目标网络。它是仅本地主机、局域网、广域网还是互联网。您对网络的控制越少,在往返时间、延迟、数据包丢失等方面偏爱 TCP 的影响就越大。通过控制我的意思是上限或估计跨网段 (#routers) 的数量,数量不同的配置(QoS、带宽限制器、MTU、...)等等。
根据经验,当瞬间所需的所有数据(定义如下)都适合一个数据包(IPv6 中的 MTU 保证为 1280)时,UDP 非常有用。瞬间是时间上的短暂快照,通常具有往返时间的生命周期。 UDP 也适用于查询和响应都是小实体的对话。
所以从这个意义上说,我会将 UDP 用于 DNS(简短查询、简短回答)或金融交易数据(在 1 次往返的生命周期内只有这么多时间),或协议元数据,例如参与客户端的数量或身份哈希(查询/响应很短,在往返时间内只有少数)。
希望这会有所帮助。
编辑: 回答您的问题
-
UDP(上面列出的限制)
IPv6 提供路径 mtu 检测,您只需使用 PMTU,对于 IPv4,您必须自己滚动:
设置
IP_DONTFRAG
套接字选项
发送一个您认为通过的数据包
想一个简单的协议,让接收者告诉你数据包是否已被完全接收
如果不是 -> 减小尺寸,如果是 -> 增大尺寸
经过几次乒乓操作后,您对 PMTU 有了一个安全的估计(当然您已经可以发送有效载荷数据了)
UDP 将大大优于 TCP如果网络的性质是稳定的并保持稳定。
(相反)当网络的性质不断变化(延迟变化、丢包概率变化等)时,TCP 将不会获胜
但是,同样的,当网段相距很远并且在某些中间段中使用 QoS 时,UDP 将不会获胜(配置为支持或多或少已知的 TCP 服务的 QoS “其他”的东西。
有关一些数据和灵感,您应该查看udt。
【讨论】:
什么?您会使用 UDP 获取财务信息,但 TCP 用于具有实时限制的视频流?这与最佳实践相去甚远。 不,我在这种情况下也会使用 UDP,前提是我可以控制编解码器。而且我认为与金融数据相比,视频流在延迟方面要宽松得多,只要它保持不变。【参考方案3】:除了视频/音频流之外,UDP 还用于具有短消息的低延迟应用程序。
【讨论】:
以上是关于我应该使用 TCP 还是 UDP? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章