这个问题是我在过去几天提出的另外两个问题的结果。
我正在创建一个新问题,因为我认为它与我理解如何控制发送/接收流程的“下一步”有关,我还没有得到完整的答案。
其他相关问题是:
IOCP 文档解释问题 - 缓冲区所有权模糊性
非阻塞 TCP 缓冲区问题
总之,我使用的是 Windows I/O 完成端口。
我有几个线程处理来自完成端口的通知。
我相信这个问题与平台无关,并且会得到与在 *nix、*BSD、Solaris 系统上做同样的事情相同的答案。
所以,我需要有自己的流量控制系统。美好的。
所以我发送发送和发送,很多。我怎么知道什么时候开始排队发送,因为接收方限制为 X 数量?
让我们举个例子(最接近我的问题):FTP 协议。
我有两台服务器;一个在 100Mb 链路上,另一个在 10Mb 链路上。
我命令 100Mb 的一个向另一个(10Mb 链接的)发送一个 1GB 的文件。它以 1.25MB/s 的平均传输速率结束。
发送者(100Mb 链接的)如何知道何时停止发送,所以较慢的发送者不会被淹没?(在这种情况下,“待发送”队列是硬盘上的实际文件)。
另一种问这个问题的方法:
我可以从远程收到“保留发送”通知吗?它是内置在 TCP 中还是所谓的“可靠网络协议”需要我这样做?
我当然可以将我的发送限制为固定数量的字节,但这对我来说听起来不合适。
同样,我有一个循环,其中有许多发送到远程服务器,并且在某些时候,在该循环中,我必须确定是否应该对该发送进行排队,或者我可以将其传递给传输层 (TCP)。
我怎么做?你会怎么做?当然,当我从 IOCP 收到发送已完成的完成通知时,我将发出其他待处理的发送,这很清楚。
与此相关的另一个设计问题:
由于我要使用带有发送队列的自定义缓冲区,并且当“send-done”通知到达时,这些缓冲区被释放以供重用(因此不使用“delete”关键字) ,我将不得不在该缓冲池上使用互斥。
使用互斥锁会减慢速度,所以我一直在想;为什么不让每个线程都有自己的缓冲池,因此访问它,至少在获取发送操作所需的缓冲区时,不需要互斥体,因为它只属于那个线程。
缓冲池位于线程本地存储 (TLS) 级别。
没有相互池意味着不需要锁,意味着更快的操作,但也意味着应用程序使用更多的内存,因为即使一个线程已经分配了 1000 个缓冲区,另一个正在发送并且需要 1000 个缓冲区来发送内容的线程也需要分配这些都是自己的。
另一个问题:
假设我在“待发送”队列中有缓冲区 A、B、C。
然后我收到一个完成通知,告诉我接收器收到了 15 个字节中的 10 个。我应该从缓冲区的相对偏移量重新发送,还是 TCP 会为我处理它,即完成发送?如果我应该这样做,我是否可以确保这个缓冲区是队列中的“下一个发送”缓冲区,或者它可以是缓冲区 B 吗?
这是一个很长的问题,我希望没有人受伤(:
我希望看到有人花时间在这里回答。我保证我会双重投票给他!(:
谢谢大家!