TCP/IP详解卷1 读书笔记:第二十二章 TCP坚持定时器

 

坚持定时器解决的问题


发送端不断往接收端发送数据,但是是快的发送和慢的接收文,导致接收方接收窗口很快就满了,发送方收到接收方通告窗口大小为0(第8个报文)。随着接收方应用程序不断地提取数据,接收方的接收窗口增大,可以再接收报文了。于是接收方向发送方发送了第9个报文,告诉发送方我的接收窗口为4096,现在又可以接收数据了。

在TCP协议中,只会对数据包进行超时重传,但对ACK包并没有任何保证。所以接收方发送的第9个报文,可能会丢包,导致发送方一直收不到该报文。这样的话,就导致了双方互相等待(你等我,我等你):发送方一直以为接收方的通告窗口为0(因为其最后收到的接收方的通告窗口大小为0);而接收方由于回复了窗口大小不为0了,但仍未收到数据,就认为发送端没有数据需要发送了。

如何解决这个问题呢?

这就需要坚持定时器,发送端在接收到接收端通告窗口大小为0的报文后,会启动一个定时器,即坚持定时器,在一定时间内未收到接收端通告窗口大小的报文,发送方将主动发送一个查询报文,向接收端查询通告窗口大小,接收端收到该报文后,回复窗口大小的报文(如第9个报文)。

 





其中,第13个报文,是接收方告诉发送方其接收窗口大小为0了,不能接收更多的数据。

从第14个报文开始,发送方开始发出查询报文,接收方接收到查询报文后,回复自己当前的接收窗口大小。

请注意客户发出的窗口探查之间的时间间隔。在收到一个大小为 0的窗口通告后的第 1个(报文段1 4)间隔为4 . 9 4 9秒,下一个(报文段 1 6)间隔是4 . 9 9 6秒,随后的间隔分别约为 6, 12,24, 48和6 0秒。间隔随指数增长,即 1.5 * 2^n

 

糊涂窗口综合症

糊涂窗口综合症,SWS,Silly Window Syndrome

糊涂窗口综合症是指,接收方发送的通知窗口很小,导致发送方每次只能发送较小的报文段(远不到一个MSS,比如一次发送1Byte的数据),这样会导致整个TCP的效率非常低(因为TCP头,IP头等的封装,使得有效数据所占的比率非常低)。

该现象可发生在两端中的任何一端:接收方可以通告一个小的窗口(而不是一直等到有大的窗口时才通告),而发送方也可以发送少量的数据(而不是等待其他的数据以便发送一个大的报文段)。可以在任何一端采取措施避免出现糊涂窗口综合症的现象。

1) 接收方不通告小窗口。 通常的算法是接收方不通告一个比当前窗口大的窗口 (可以为0),除非窗口可以增加一个报文段大小(也就是将要接收的 M S S)或者可以增加接收方缓存空间的一半,不论实际有多少。

2) 发送方避免出现糊涂窗口综合症的措施是只有以下条件之一满足时才发送数据: ( a )可以发送一个满长度的报文段; ( b )可以发送至少是接收方通告窗口大小一半的报文段; ( c )可以发送任何数据并且不希望接收 A C K(也就是说,我们没有还未被确认的数据)或者该连接上不能使用N a g l e算法(见第1 9 . 4节)。

条件( b )主要对付那些总是通告小窗口(也许比 1个报文段还小)的主机,条件 ( c )使我们在有尚未被确认的数据(正在等待被确认)以及在不能使用 N a g l e算法的情况下,避免发送小的报文段。如果应用进程在进行小数据的写操作(例如比该报文段还小),条件( c )可以避免出现糊涂窗口综合症。

这三个条件也可以让我们回答这样一个问题:在有尚未被确认数据的情况下,如果 N a g l e算法阻止我们发送小的报文段,那么多小才算是小呢?从条件 ( a )中可以看出所谓“小”就是指字节数小于报文段的大小。条件 ( b )仅用来对付较老的、原始的主机。

步骤2中的条件( b )要求发送方始终监视另一方通告的最大窗口大小,这是一种发送方猜测对方接收缓存大小的企图。虽然在连接建立时接收缓存的大小可能会减小,但在实际中这种情况很少见。

 

避免糊涂窗口综合症举例



注意,第14个报文,发送方发送了509字节,可能是由于程序一直没有往发送缓存提交新的待发送数据,发送方在等待了足够长时间长,将目前发送缓冲区中不到一个报文段的数据509字节发出去了。

报文段 11段通告了一个大小为 1 5 3 3字节的窗口,而发送方只使用了其中的 1 0 2 4字节。如果在报文段 1 3中的A C K通告其窗口为0,就会违反窗口的右边沿不能向左边沿移动而导致窗口收缩的 T C P原则(见第 2 0 . 3节)。这就是为什么必须通告一个5 0 9字节的窗口的原因。

接下来我们看到发送方没有立即向这个小窗口发送数据。这就是发送方采取的糊涂窗口避免策略。相反,它等待另一个坚持定时器在时刻 2 0 . 1 5 1到时间,并在该时刻发送 5 0 9字节的数据。尽管它最终还是发送了一个长度为 5 0 9字节的小数据段,但在发送前它等待了 5秒钟,看是否会有一个A C K到达,以便可以将窗口开得更大。这 5 0 9字节的数据使得接收缓存仅剩下7 6 8字节的有效空间,因此接收方通告窗口为 0(报文段1 5)。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值