Win IOCP下如何识别pushback?
Posted
技术标签:
【中文标题】Win IOCP下如何识别pushback?【英文标题】:How to identify pushback under Win IOCP? 【发布时间】:2014-10-31 04:12:28 【问题描述】:使用 IOCP 时如何识别 TCP 推送? IE。我怎样才能知道接收方没有接收,连接两端的 tx/rx 缓冲区已满,发送方应该停止发送更多数据?
【问题讨论】:
你为什么想知道?当缓冲区变满时,您的发送不会开始失败。只需全速发送即可。 您可能想知道的一个原因是 TCP 推回是 TCP 流控制的一种有效形式,它不需要您的应用程序级协议中的协议级支持。因此,您可能需要知道仅仅是因为您的客户希望能够使用它。此外,如果您只是忽略推送并继续发送,那么您将面临严重的拒绝服务攻击,这可能会耗尽发件人上无法控制的非分页池内存量,在某些情况下,这可能会崩溃盒子。请参阅我的答案中的链接了解如何/为什么。 【参考方案1】:对于任何异步 TCP 发送操作,确定对等方接收数据速率的方法是监视发送方的发送完成率。
我已经深入写过这个here。总之,当接收方的缓冲区填满并且 TCP 流控制正在运行并且 TCP 窗口减小时,发送方无法发送,这会导致发送方的 TCP 缓冲区填满。这意味着异步发送请求无法完成。如果您跟踪待处理的未完成发送请求的数量,您可以发现这种情况并限制发送者。
【讨论】:
【参考方案2】:发生这种情况时,发送将无法完成。
【讨论】:
问题是第二次发送是以异步方式完成的,即使 tx 缓冲区中仍有空间。既然如此,我怎样才能将“第二次发送”与“TCP 推送”场景区分开来? 您可以通过发送完成的速率来区分。如果缓冲区未满,则没有后推。一旦缓冲区已满,发送将以与缓冲区中空间相同的速率完成,这将与接收器接收的速率相同。以上是关于Win IOCP下如何识别pushback?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 win32 控制台识别 ANSI/VT100 转义序列?