【问题标题】:Will I see decreased network throughput if I bind many sockets on the same port?如果我在同一个端口上绑定多个套接字,我会看到网络吞吐量降低吗?
【发布时间】:2011-11-24 11:49:30
【问题描述】:

我正在创建 3 个套接字(发送方套接字)以使用 UDP 将我的数据发送到远程单个套接字。

我已将所有这 3 个发送方套接字绑定在同一个端口上。

这种将所有 3 个发送方套接字绑定在同一个端口上的设计会降低发送数据包的吞吐效率吗?或者我应该为每个线程创建一个新端口和一个新套接字?我的目标是尽快发送数据包并保持网络持续繁忙。

重要提示:我正在使用 UDP 套接字。与为其每个子线程创建不同进程的 TCP 套接字不同。

【问题讨论】:

    标签: sockets


    【解决方案1】:

    每个端口的套接字数量无关紧要。端口不是物理实体,它们没有要在用户之间分配的带宽。

    【讨论】:

      【解决方案2】:

      我想不出将多个套接字绑定到同一个端口会以某种方式影响发送效率的任何原因。由于您的 CPU(可能)比网卡快得多,因此限制因素将是以太网硬件将数据推送到网络上的速度,仅此而已。

      当然,唯一真正确定的方法是尝试两种方法,看看您是否发现吞吐量有任何差异;但如果你这样做了,我会感到惊讶。

      (请注意,当发送 UDP 数据包时,重要的是不要试图发送它们的速度超过网卡的传输速度,否则内核将简单地丢弃它在其发送缓冲区中没有空间的 UDP 数据包。 . 具体来说,您需要使用阻塞 I/O 发送(在这种情况下 send() 调用不会返回,直到内核有足够的发送缓冲区空间来发送您要求它发送的数据包),或者使用非阻塞 I/O,但仅在 UDP select()(或 poll()s 或其他)准备好写入时发送数据包。否则,您将获得惊人的快速“发送率”,其中 99% 的数据包只发送到位桶;^))

      【讨论】:

      • 是的,你是正确的,感谢您的建议,因为我遇到了同样的事情,即发件人太快并且数据包丢失了,但是我使用发送错误有我的方式来创建另一个插座。因为,每个套接字都有一个内核缓冲区,这样我就能够发送所有的数据包。我还在接收端使用了 3 个线程,这样数据包就不会在接收端丢失。
      • 实际上,我在 UDP 协议之上实现了一个应用程序协议,我将一个 1GB 的文件从一台计算机传输到另一台计算机,但链路丢失。我的目标是在链路上实现高吞吐量。因此,我使用 UDP 协议来传输和重新传输丢失的数据包。全部确认。消息和控制消息在 TCP 链路上进行,只有传输和重新传输在 UDP 上进行。
      • 所以,我使用了从 2 个套接字发送的 1 个线程第一次发送文件,并使用了 3 个线程从 1 个套接字接收文件。每 5 秒超时后,我发送一个丢失数据包的确认,当发送方收到确认时,我分叉一个新线程并创建一个新套接字(其中 2 个)并发送丢失的数据包,我使用连接进行 UDP 传输使内核更快。这一直持续到收到整个文件。希望,我的设计没有任何缺陷... 2 天内测试设计...希望,它给了我最高的吞吐量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      相关资源
      最近更新 更多