TCP--滑动窗口

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。

接收端和发送端通过窗口来实现流量的控制。发送端维护一个发送窗口,接收端维护一个接收窗口。拥塞窗口是一个变量,是发送方通过当前网络拥塞状态计算出来的一个值。

前言

推荐一个可以查看流量控制动图的网站,还有一个滑动窗口动图的网站。

发送窗口–swnd

发送方维护一个发送窗口(swnd)
TCP--滑动窗口_第1张图片


发送窗口就是操作系统开辟出来的一片缓存,如果数据已经发送并且收到确认就从缓存中删除。


TCP--滑动窗口_第2张图片
当发送窗口中的数据都发送出去等待确认的时候,这个时候就不会在发送数据了,因为超出了接收窗口的承受能力了,这时候只能等待收到服务端的确认。




TCP--滑动窗口_第3张图片
我们看到17~19的已经确认,窗口向右移动3格,就会有3个进入窗口,进入就绪状态。


就这样发送窗口一直向右移动,但是要注意的是发送窗口的大小并不是固定的,而是动态变化的

接收窗口–rwnd

接收方维护一个接收窗口
TCP--滑动窗口_第4张图片


中间的窗口可以接收数据,19~2117~18先到达(乱序到达),会先将19~21放到缓存区,然后等待17~18的数据,如果17~18数据到了,那么窗口就会向右移动了。如下图。

TCP--滑动窗口_第5张图片
接收窗口收到17~18并且发出确认,窗口向右移动。

细节

窗口大小由谁决定

TCP头部里面有个Window,用来协商窗口大小的。
这个就是接收方告诉发送方自己缓存区能接受数据的大小,发送方依据接收方的能力发送数据,不会导致接收方缓存爆满。
发送方发送的数据大小不能超过接收方的窗口大小,不然就会产生数据丢失。
但是TCP会根据当前网络拥塞状态计算出一个拥塞窗口(cwnd),TCP比较无私,当网络拥堵的时候会降低自己传输的速率,这时候发送窗口(swnd)=min(接收窗口rwnd,拥塞窗口cwnd)。

当接收窗口从0又有缓存了,发送端如何感知

当发送端知道接收窗口满了,会启动一个零窗口(TCP Zero Window)定时探测器,发送端每隔一段时间就会发送探测包,查看接收端的窗口是否有缓存。如下图所示。
TCP--滑动窗口_第6张图片

你可能感兴趣的:(#,计算机网络,tcp/ip,网络协议,网络)