滑动窗口
因为序号是模2的m次方,所以从0至2的m次方-1的序号可以表示为一个环。
缓存被表示为一组小格子,称为滑动窗口(sliding window),在任何时候它们都占据了圆的一部分。在发送方,当一个分组被发送出去,相应的小片就被标记。当所有的小片都被标记后,就表示缓存已满,不允许从应用层接收更多的报文。当一个确认达到后,相应的小片的标记就被取消。如果这个窗口前端连续多个小片都没有标记,那么这个窗口就向后滑动到相应的序号范围上,以允许窗口后端有更多空间的小片。下图描述了发送方的滑动窗口。序号是模16(m=4)的,且窗口大小为7.请注意,滑动窗口只不过是一种抽象,而实际上它是通过计算机变量来保存下一个要发送的分组的编号以及刚刚发送出去的最后一个分组的编号来实现的。
大多数协议使用条形来表示滑动窗口。其思想完全一样,只不过通常这样做可以节约纸张空间。下图用条形表示法。这两张图告诉我们的是同一回事。如果我们捏住下图的两端分别向上弯曲,就可以得到圆形的滑动窗口。
TCP为每个方向的数据传送各使用两个窗口(发送窗口和接收窗口),也就是说,对于双向通信总共有四个窗口。
发送窗口
我们使用的这个窗口大小为100字节(通常应该有几千个字节),但是稍后我们会看到,发送窗口大小是由接收方(流量控制)以及底层网络的拥塞程度(拥塞控制)来决定的。图中描述了一个发送窗口是如何打开、关闭和收缩的。
TCP的发送窗口类似于选择重传协议的发送窗口,但是有几点区别
1、窗口所关联的实体本质不同。SR的窗口为分组编号,而TCP中的窗口要为字节编号。虽然TCP的传输实际上也是一个报文段一个报文段的,但用于控制窗口的变量以字节为单位。
2、某些实现中TCP可以保存从进程哪里接收到的数据,并稍后再发送出去。不过,我们假设发送TCP能够从它的进程哪里接收到数据就发送该数据的报文段。
3、计数器数量不同,理论上,选择重传协议可以为每个发送的分组使用数个计数器,但是TCP协议只使用一个计时器。
接收窗口
我们使用的这个窗口大小为100字节(通常应该有几千个字节),图中描述该窗口是如何打开和关闭的,实际中,接收窗口永远不会收缩。
TCP中使用的接收窗口与SR的接收窗口有两点区别:
1、TCP允许接收进程按照自己的节奏来拉取数据。也就是说,分配给接收方的缓存中可能有一部分被已经接收和确认,但正在等待接收进程来拉取的数据所占用。因此,接收窗口大小总是小于或等于缓存大小,如上图所示,接收窗口大小决定了接收窗口在溢出之前能够从发送方哪里接收字节数。通常被称为rwnd的接收窗口大小可以用以下公式计算:rwnd=缓存大小-正在等待被拉取的字节数
2、TCP协议中使用的确认的方式不同,在SR中,确认是选择性的,它指向已经被接收的未损坏的分组,而TCP的主流确认机制是累计确认,它宣布的是下一个希望接收的字节(从这方面看,TCP有点像GBN)。不过在TCP的新版本中,既使用了累积确认,也使用了选择确认。