谈谈滑动窗口协议吧
滑动?窗口?
为什么会有窗口的概念,因为TCP不允许发送方一次发送太多数据,这个“窗口”的概念,在TCP中通过“窗口字段”来表示。从这个角度看,滑动窗口协议像是用来控制发送流量的。
窗口字段是TCP报文段中的一个标准字段,窗口字段表示接收方的接收缓存还可以接受多少字节的数据。接收方通过窗口值字段对发送方的发送速率进行控制
滑动?什么时候滑动?TCP滑动窗口协议中把窗口具体分为发送方窗口和接收方窗口,发送方窗口中又可以分为已发送但未确认和未发送的数据(字节),接收方窗口表示可以接收但是未达到的数据。一旦数据全部发送完毕,那么发送方必须等待接收方的确认报文。而一旦发送方报文到达接收方,接收方将接收报文中的数据,存入接收缓冲区并给出确认,此时接收方的接收窗口左边界右移。而当发送方接收到接收方的确认报文,他将释放相应的缓冲区,同时发送窗口左边界右移。从这个角度来看,滑动窗口协议有具有一定可靠传输的意义。(保存未确认分组不滑动,是为了进行重传)
如果让我谈谈滑动窗口协议,我会从“滑动”和“窗口”方面引出其“流量控制”和“可靠传输”层面的意义。
滑动窗口协议不是某个具体协议,它是一类协议,或者说具有某种思想的协议族。它的两个特征就是:窗口——限制发送速率/流量控制,滑动——传输控制/可靠传输。其中ARQ(停等)可以看作单窗口、一应一答的滑动窗口协议,GBN(回退N步)和SR(选择重传)也是多单位窗口、流水线发送和累加确认的滑动窗口协议。TCP像是GBN与SR的混合体。
因此当解释滑动窗口协议时,应该更注重理解“滑动”和“窗口”的意义,而不是回答具体有哪些实现。
聊聊可靠传输
可靠传输?这里的可靠没有加任何限定词,那么请自问一下:绝对的可靠,或者说理想的可靠传输是一个怎么样的传输过程?一句话:字节流从一端发出,一模一样的到达另一端。
再拆解一下,从两端发出去的肯定不能是一条长字节,字节组合为分组,分组加上控制首部作为报文段。绝对的可靠:报文有序到达、报文无差错、报文不重复、报文不丢失
我们不是神,只能尽量让报文传输达到“可靠”。
【1】报文有序到达可能保证(ARQ),但是吞吐量太低了。我们可以退一步,不要求传输过程的有序,但是要求有序的接收——序号机制+累加确认
【2】我们无法做到传输过程中无差错,但是我们让接收方主动丢弃出错的包,然后发送方重传出错报文,就可以达到“接收无差错”——校验和+重传机制
【3】同理,对于不重复、我们无法做到传输的过程不产生重复的包,但是我们可以保证不接收重复的包——序号机制
【4】我们无法保证过程中不丢包,但是我们通过重传或者冗余ACK感知丢包事件,从而触发重传行为,另一方面,通过滑