窗口探查(window probe)

当接收方TCP缓冲区没有剩余空间后,在ACK中会通知发送方window=0,此时发送方就暂停发送数据。当接收方TCP缓冲区又有空间后,会再次发送一个ACK,告知其剩余缓冲区大小,可以接受新的数据包了,这个ACK叫做窗口更新。TCP接收方则等待新的数据包过来。但是如果这个窗口更新的ACK丢失了,那么则会两端互相等待:接收方等待新的数据包,因为他已经通知对端新的window大小了,而发送方则还在等待窗口更新,因为它还认为对端窗口为0。

坚持定时器(Persist Timer)就是为了解决这个问题而设计的。发送方使用一个坚持定时器来周期性的向接收方查询,以便发现窗口已经增大。这些从发送方发出的查询报文段被称为窗口探查(window probe)。窗口探查包含一个字节,TCP总是允许发送已关闭窗口之后一个字节的数据。发送方在收到window=0的通知后就开启这个定时器,如果这个定时器的时间到还没收到接收方的窗口更新,那么它就探查这个空的窗口以决定窗口是否丢失。

窗口探查的时间间隔为5,6,12,24,48,60秒,然后每60秒发一次,这个过程会一直持续到窗口更新或者连接断开。

糊涂窗口综合症(silly window syndrome)

滑动窗口用于流量控制,会导致少量的数据将通过连接进行交换,而不是满长度的报文段。该现象可放生在两端中的任何一端:接收方可以通告发送方一个小的窗口(而不是一直等到大的窗口时才通告),而发送发也可以发送少量数据(而不是等待其他的数据以便发送一个大的报文段)。该现象被称为“糊涂窗口综合症(SWS)”。可以在两端中的任何一端采取措施避免SWS。

1)接收方不通告小窗口。通常的算法是接受发不通告一个比当前窗口大的窗口(可以为0),除非窗口可以增加一个报文段大小(也就是要接收的MSS)或者可以增加接收方缓存空间的一半。

2)发送方只有满足以下条件之一才发送数据:(Nagle算法)

(a)可以发送一个MSS;

(b)可以发送至少接收方缓存大小一半的数据大小;

(c)能够发送手头所有数据并且不希望接收ACK(也就是说我们没有还未被确认的数据)或者给该连接禁止了Nagle算法。

Nagle算法伪代码如下:

 if there is new data to send
if the window size >= MSS and available data is >= MSS
send complete MSS segment now
else
if there is unconfirmed data still in the pipe
enqueue data in the buffer until an acknowledge is received
else
send data immediately
end if
end if
end if

方法b要求发送方一直监视另一方通告的最大窗口大小,这是一种发送方猜测接收方缓存空间的企图。虽然在连接建立时接受缓存的大小可能减小,但是在实际中这种情况很少见。

最新文章

  1. 使用 Code Snippet 简化 Coding
  2. 网友分享 调用dll的语音朗读 不能变速,不好
  3. 使用Html5+C#+微信 开发移动端游戏详细教程 :(三)使用html5引擎搭建游戏框架
  4. HTTP请求头详解
  5. jquery动画基础
  6. javaIO(三)
  7. UVa 11991:Easy Problem from Rujia Liu?(STL练习,map+vector)
  8. BM串匹配算法
  9. cocos2dx 读取json及解析
  10. MVVM Light 一个窗口承载两个视图
  11. check约束条件
  12. sqlite编译
  13. Centos7 安装keepalived实现高可用
  14. Python并发编程之深入理解yield from语法(八)
  15. 【Matlab&Mathematica】对三维空间上的点进行椭圆拟合
  16. KazaQ's Socks (找规律)
  17. httpd配置
  18. 63.1拓展之纯 CSS 创作一个摇摇晃晃的 loader
  19. Graph-BFS-Fly-图的广度优先遍历-最小转机问题
  20. [Hive]HiveSQL解析原理

热门文章

  1. Vim的强大配置文件
  2. CentOS Config FTP Server with SSL support
  3. JAVA_day1_变量和常量
  4. 计蒜客 —— 字符串p型编码
  5. 【学习笔记】XPath定位总结
  6. hive配置元数据库mysql文件配置
  7. CF444A DZY Loves Physics【结论】
  8. Transformer详解
  9. python标准库之shutil——可操作权限的文件操作库
  10. Python全栈开发之4、迭代器、生成器、装饰器