TCP窗口协议

来源:互联网 发布:上海网络整合营销公司 编辑:程序博客网 时间:2024/06/08 12:10

什么是滑动窗口win?

可能以下这张图更容易理解点。横轴代表的是发送端待发送的数据字节,从图中可以看出有8192个字节要进行传输。而图中最显眼的绿色区域,就代表窗口。窗口分为两部分,左边是发送端已经发送数据包出去,但是未收到接收端返回的ack,右边是可以发送的区域,这样是目前我们数据可以用武之地的地方。窗口是从左到右移动的(也只能这么移动),可以看到窗口左边竖条两边的差异,就是有没有收到ack,所以一旦发送方收到接收端返回的ack后,窗口就往右移动,移动的幅度就要依据ack携带的序列,如ack 2048,那么窗口往右移动两格。
这里写图片描述
通过上述图像化的初步了解,可能你已经有点眉目了,窗口实际上代表的是接收端的最大缓冲区。注意,这里是接收方的缓冲大小,但我们一直以发送端的角度去看待,这就需要接收端在建立tcp连接后,返回win=4096,发送端就知道了窗口大小。
从以下说法中,有两个结论:一,发送方的窗口一般由接收方通告;二,窗口表明发送方现在可以发送的数据量大小,也是接收方的缓存大小。通告这种机制,我们发送数据的速度就被限制了,这也是tcp实现流量控制的一种方式。

MSS

但是注意,图中我们每次发送的数据大小都是1024,这个不是硬规定,而跟win一样,同样是由接收方返回来的,标志是mss,代表每次发送的数据单元大小,可以简单理解为,mss再加上tcp和ip的头部这些,就是MTU了。

不对称的两端

但发送端发送速度很快,而接收方速度很慢时候,通过接收方返回的win大小,发送方动态更新窗口大小(注意窗口不是一次就定死的)。如返回win=0,那么发送方就要停止继续发送数据了,等待再来一条ack信息,携带更大的win大小实现的窗口更新,发送端才能继续发送数据。这就是上述“流量控制”的原理。

标志push

如图,展示了tcp传输中的主要标识,有syn,psh和fin。

这里写图片描述

图中在传输数据,总共要发送8192个字节的数据,而mss为1024,那么发送端分为8次来发送,过程为4,5,6,7,10,11,12,13。这八次传输中,不是每一次都有psh标识的。psh代表的是写数据后已经发送,意味着不在发送方中缓存久留,到接收方后也理解将数据往上层(应用进程)传输。4567数据跟服务器可能是一些交互数据,这些数据立马就要push,而不是在缓存中推挤后再发送。一般最后一次,也清空缓存了,也一般会有psh,如13。而我们看到都是每4个一组发,这是跟win大小的返回有关。

慢启动与拥塞窗口cwnd

tcp的窗口其实有两个,除了上述的滑动窗口,还有一个成为拥塞窗口
上图中,我们的win是4096,mss是1024,所以在4567时候连续发送了4个报文段,这个如果在局域网中可能没什么,但是如果在互联网上,两端之间可能存在一些慢的链路和路由,那么在一些中间路由器上,可能就会缓存很多分组了,最严重是将互联网上的路由器缓存占满了。tcp的解决方式是一种称为慢启动的算法(slow start),使用的原理就是拥塞窗口cwnd

拥塞窗口在初始化大小就是一个报文段大小,由接收方返回,然后每次返回一个ack,就+1,所以在某种情况下,可能的增长轨迹是1,2,4,8,16。。。。指数型增长。发送方会比较拥塞窗口和滑动窗口哪个小,来作为发送数据的上限。上述的指数增长有点疯狂,不过在中间路由分组太多时候回丢弃分组,从而会通知到cwnd开得过大而重新调增,丢弃的分组也通过超时和重传机制再次发送。

原创粉丝点击