2014-10-31 48 views
2

如何在使用IOCP时识别TCP回送?即我怎么能发现接收器没有收到,连接两端的TX/RX缓冲区是否满了,发送者应该停止发送更多的数据?如何识别Win IOCP下的推送?

+0

你为什么想知道?这不像你的缓冲区变满时发送失败。只需全油门发送。 – usr 2014-11-01 22:59:51

+0

您可能想知道的一个原因是,TCP回送是TCP流量控制的有效形式,它不需要您的应用级协议中的协议级别支持。所以你可能需要知道,因为你的客户希望能够使用它。另外,如果你只是忽略回推并继续发送,那么你就会打开你的自我,遭受严重的拒绝服务攻击,这可能会在发送者中使用无法控制的非页面缓冲池内存量,并且这在某些情况下会导致崩溃盒子。请参阅我的答案中的链接,了解如何/为什么。 – 2014-11-03 16:11:34

回答

3

对于任何异步TCP发送操作,确定对等体正在接收数据的速率的方式是监视发送方的发送完成率。

我已经写了关于这个深入here。总之,当接收者的缓冲区填满并且TCP流量控制正在运行并且TCP窗口减少时,发送者不能发送导致发送者的TCP缓冲区填充的发送者。这意味着异步发送请求无法完成。如果您跟踪待处理的未完成发送请求的数量,您可以发现这种情况并限制发件人。

2

发生这种情况时,发送将无法完成。

+0

问题是即使tx缓冲区中仍有空间,第二次发送也是以异步方式完成的。那么,我怎样才能从“TCP推回”场景中扰乱“第二次发送”呢? – 2014-10-31 10:21:14

+1

您可以根据发送完成的速率来区分。如果缓冲区未满,则无法回推。一旦缓冲器满了,发送将以与缓冲器中的空间相同的速率完成,这将与接收器接收的速率相同。 – 2014-10-31 15:15:30