asynchronous - 通过多个 UDP 端口传递数据是否会提高性能

标签 asynchronous networking udp multiplexing

我目前正在实现受 KCP、Dragonite 和 QUIC 启发的可靠 UDP 传输,只是出于自学目的。我想应用多项优化,其中之一是多路复用。

我的想法是:我将数据分成小块( block 大小与 MTU 相关),并使用协程通过多个数据报套接字异步并行地(在客户端和服务器上)发送和接收它们。

这个解决方案行得通吗?我应该期待性能提升吗?

最佳答案

与 TCP 相反,UDP 没有慢启动,即它可以从一开始就以全速(如果已知)开始发送。因此,本质上,发送速度的限制要么是本地系统发送数据的速度,要么是可用带宽。假设发送不受 CPU 限制,并且您设想的所有多个套接字的流量都将采用相同的方式(传出网卡、路由器、传入网卡)并且没有在中间盒中完成特定于连接的流量整形,然后使用多个套接字不应导致速度提高,因为它不会改变各种瓶颈的使用方式。

如果发送受 CPU 限制,这会改变。在这种情况下,使用多个协程结合多个套接字可能会更好地利用当今的多处理器系统,因为它同时在多个 CPU 内核上运行,并且这种方式可以发送更多数据包,直到它再次受到 CPU 限制。

如果流量受带宽限制,但存在提供额外带宽的目标系统的替代路径,这也会发生变化。通过将套接字绑定(bind)到不同的本地 IP 地址(在不同的本地网卡上)或通过选择不同的目标 IP 地址(对于同一目标系统),人们可能能够使用这种替代路径,从而利用额外的带宽.

如果有一些流量整形限制了客户端和服务器之间每个连接的带宽,那么多个套接字可能会有所帮助。在这种情况下,多个套接字可以增加可用带宽量。

关于asynchronous - 通过多个 UDP 端口传递数据是否会提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53573805/

相关文章:

ios - 如何为 NSURLSession 连接选择特定的网络接口(interface)?

Python3 wifi模块返回对象,而不是wifi网络列表

math - 为什么 UDP 校验和包含两倍的 UDP 长度?

javascript - 延迟返回声明

java - Play Framework - 在 X 秒后进行处理/重定向时呈现 View

android - 在一个 WiFi 网络上获取多个 Android 设备以共享信息的最佳方式

ffmpeg - 在 FFmpeg/LibAV 中设置 RTSP/UDP 缓冲区大小

java - netty 4.x.x 中的 UDP 广播

javascript - MongoDB/EJS : How to make synchronous query and render result values in EJS

c# - 如何对从 Task.ContinueWith 衍生出来的方法进行单元测试?