【发布时间】:2022-01-20 15:44:28
【问题描述】:
我正在使用 Rust 开发一个应用程序,其中我需要将两种类型的数据传输到 Internet 上的服务器:
- 很多“不太重要”的信息,我会使用 UDP 协议。
- 我会使用 TCP 协议的一些“非常重要”的信息。
是否可以同时使用两种协议?或者是否有任何协议(在 Rust 中可用)允许我发送两种类型的信息而不会产生重大后果?
【问题讨论】:
-
当然可以,但不是同一个端口。 “这样更正确吗?”这真的取决于,这是一种在(编码良好的)服务器 fps 游戏中大量使用的模式。 “是否有任何协议(在 rust 中可用)允许我发送两种类型的信息而不会产生重大后果?”没有任何意义。
-
也就是说,用 TCP 编写服务器代码已经够难了,用 UDP 编写服务器代码也很困难,因此需要“协同工作”的代码非常困难
-
@Stargateur: “当然可以,但不是同一个端口” - UDP和TCP都有自己的端口“空间”,即完全可以使用UDP和TCP的端口号相同。甚至很常见:DNS 使用端口 53,基于 UDP 的 HTTP/3 和基于 TCP 的 HTTP 都使用端口 443。
-
UDP 与 TCP 并不是关于“不太重要”与“非常重要”的关系。 UDP 是关于可以接受消息丢失、重复或重新排序但按时交付很重要的消息,例如实时音频。 TCP 是不惜一切代价进行可靠的按顺序交付,即使会导致更高的延迟。
-
我将 Steffen Ullrich 的信息表述为:当 TCP 的机制(特别是它实现按顺序传递的方式,也称为行头阻塞和拥塞控制)不是一种选择。通常,您在 UDP 之上有另一个协议,它以您的数据可接受的方式实现类似的事情。
标签: sockets rust tcp udp network-protocols