网络基本功:滑动窗口

TCP的滑动窗口主要有两个作用,一是提供TCP的可靠性,二是提供TCP的流控特性。同时滑动窗口机制还体现了TCP面向字节流的设计思路。

滑动窗口:
(一)、“窗口”对应的是一段可以被发送者发送的字节序列,其连续的范围称之为“窗口”;
(二)、“滑动”则是指这段“允许发送的范围”是可以随着发送的过程而变化的,变化的方式就是按顺序“滑动”。

滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的速度,从而达到防止发送方发送速度过快导致网络故障的目的

滑动窗口的基本原理是:

             TCP使用窗口机制进行流量控制。当连接建立后,发送方和接收方都要分配一块自己的缓冲区来存储接收的数据,为了防止就收方已经没有缓冲区进行接收而发送方在在继续发送,出现网络拥塞和故障。所以用滑动窗口进行了流控。
            具体实现:接收方将缓冲区剩余的尺寸和期待接收的下一个字节序号在确认信息中发送给发送方,发送方根据接收方剩余的大小空间来定量的发送合适的数据给接收方。它也是建立在“确认重传”的基础之上。

滑动窗口的原理图如下所示:

滑动窗口动态效果演示: https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/selective-repeat-protocol/index.html

对ACK的认识:ACK通常被理解为收到数据或某种请求后发送一个ACK确认信息,其实ACK包含两个重要的信息:

              一、期望接收到的下一个字节的序号n,该n代表接收方已经接收到了前n-1个字节,此时如果接收到的是n+1而不是n个字节,接收方式不会发送n+2的ACK的。如上图所示,如果收到发送端发来的5,6,7两个字节,而没有收到4这个字节接收端是不会发送ACK=8的,而依旧发送ACK=4,因为这样就会激活超时消息重传功能,确保4能正常的接收。
              二、当前的窗口大小m,如此发送方在接收到ACK包含的这两个数据后就可以计算出还可以发送多少个字节给对方,假定当前发送方已经发送到第n个字节,期待下一个要发送的字节的序号为X,则发送端可以发送的字节数为:
                                                                         send=m-(n-X);

窗口的大小属性:

TCP的window是一个16bit位字段,它代表的是窗口的字节容量,也就是TCP标准窗口最大为2^16-1=65535个字节;另外在TCP的选项字段中还包含了一个TCP窗口的扩展因子,option-kind为3,option-length为3个字节,option-data取值范围0-14。窗口扩大因子用来扩大TCP窗口,可把原来的16bit的窗口,扩大为31bit。

发送窗口和接收窗口:
                 TCP是双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。其中各自的“接收窗口”大小取决于应用、系统、硬件的限制,但是tcp的传输速率不能大于应用的数据处理能力,否则就会缓冲区淹没。各自的“发送窗口”则取决于对端通告的“接收窗口”,也就是取决于接收的缓冲区的大小。

发送窗口只有在收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。

接收窗口只有在前面的所有数据确认收到的情况下,才会移动左边的窗口。当在前面还有未接受的字节,而后面的字节已接收的情况下,窗口也不会移动,并不会对后续的字节进行确认。一次确保对端会对这些未收到的数据进行重传。主要涉及到接收端的累积确认接收机制

 

参考资料:

《TCP/IP详解》卷一

http://blog.chinaunix.net/uid-20778955-id-539945.html

http://my.oschina.net/xinxingegeya/blog/485650?fromerr=1kVOrzpE

http://blog.sina.com.cn/s/blog_48ebca64010003t0.html

http://www.cnblogs.com/woaiyy/p/3554182.html

在此感谢各位博主的分享!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值