【问题标题】:How can I slow down a TCP connection on Windows?如何减慢 Windows 上的 TCP 连接速度?
【发布时间】:2011-01-19 22:11:25
【问题描述】:

我正在开发一个 Windows 代理程序,其中通过不同适配器连接的两个 TCP 套接字由我的程序桥接。也就是说,我的程序从一个套接字读取并写入另一个套接字,反之亦然。每个套接字都由自己的线程处理。当一个套接字读取数据时,它会排队等待另一个套接字写入。我遇到的问题是一个链接以 100Mb 运行而另一个以 10Mb 运行的情况。我从 100Mb 链接读取数据的速度比将其写入 10Mb 链接的速度要快。如何“减慢”较快的连接,使其本质上以较慢的链接速度运行?将较快的链接更改为较慢的速度不是一种选择。 --谢谢

【问题讨论】:

    标签: c++ windows proxy tcp


    【解决方案1】:

    已经阐述了许多复杂且正确的解决方案。但实际上,要找到问题的症结所在 - 为什么你有两个线程?如果你在一个线程中执行 socket-100 读取,socket-10 写入,它自然会阻塞写入,你不必设计任何复杂的东西。

    【讨论】:

      【解决方案2】:

      如果您正在执行非阻塞、select() 样式的事件循环:仅当您的传出数据队列小于某个硬编码的最大大小时才调用 FD_SET(readSocket, &readSet)。

      这样,当传出套接字落后时,您的代理将停止从更快的客户端读取数据,直到它赶上。 TCP 协议会处理剩下的事情(特别是,它会告诉你更快的客户端放慢一段时间)

      【讨论】:

        【解决方案3】:

        当您无法写入数据时,停止读取数据。

        有一个字节队列从 100Mb/s 链接进入您的程序,还有一个队列从您的程序到 10Mb/s 链接。当传出队列已满时,停止从传入队列和 TCP 读取,并在 100Mb/s 链路上限制客户端。

        您可以在读取器和写入器之间使用内部队列来干净利落地实现这一点。

        【讨论】:

          【解决方案4】:

          如果这是一个问题,那么你的程序编写不正确。

          您不能在 10mbps 链接上放置超过 10mbps,因此在较慢链接上写入的线程应该在您写入时开始阻塞。因此,只要您的线程使用与写入缓冲区相同大小的读取缓冲区,线程就应该只在可以将数据从 10mbps 管道中抛出时尽快消耗数据。 TCP 协议会自动处理任何需要阻止远程发送方将超过 10mbps 的流量放入 100mbps 管道的流量控制。

          因此,只要您的读写缓冲区在该线程(或任何线程)中的大小相同,这应该不是问题。

          【讨论】:

          • 嗯,我认为这只有在同一个线程上完成读写操作时才有效。
          • @Nikolai,为什么?只要不溢出缓冲区,就可以了。
          • 我猜这是因为我分配了一个缓冲区,读入它并将其排队等待写入线程。然后重复这个过程。写线程出列、写入和释放缓冲区。
          • 如上所述,OP 在两个线程之间使用一个队列,具有两个不同的套接字描述符(输入/输出)。 'in'-thread 更快地获取数据,然后'out'-thread 可以将其写出。因此,除非有内部流量控制,否则队列会溢出可用内存(您不知道我在“生产级”应用程序中看到过多少次:)我的只是可能的解决方案之一。你的也可以,但它需要控制读写之间的依赖关系。
          • 无论如何使用第二个线程可能毫无意义。它将在 10mbps 端被阻塞,因此读取 100mbps tcp 缓冲区将与方案无关。
          【解决方案5】:

          在读写线程之间创建一个固定长度队列。当队列满时阻塞入队,当队列为空时阻塞出队。常规信号量或互斥体/条件变量应该可以工作。调整队列大小,让较慢的线程始终处于忙碌状态。

          【讨论】:

            猜你喜欢
            • 2016-05-06
            • 2012-08-17
            • 1970-01-01
            • 2021-11-24
            • 2014-09-28
            • 1970-01-01
            • 2021-08-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多