在您的情况下,我会使用 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 为在一些中间段中使用(配置为支持或多或少已知的 TCP 服务而不是“其他”内容的 QoS。
对于一些数字和灵感,您应该查看udt。