文章目录
流水线:提高链路利用率
- 增加n,能提高链路利用率
- 但当达到某个n,其u=100%时,无法再通过增加n,提高利用率
- 瓶颈转移了 ->链路带宽
流水线协议
流水线:允许发送方在未得到对方确认的情况下一次发送多个分组
- 必须增加序号的范围:用多个bit表示分组的序号
- 在发送方/接收方要有缓冲区
- 发送方缓存:未得到确认,可能需要重传;
- 接收方缓存:上层用户取用数据的速率不等于接收数据的速率;接收到的数据可能乱序,排序交付(可靠)
- 两种通用的流水线协议:回退N步(GBN)和选择重传(SR)
通用:滑动窗口(slide window)协议
- 发送缓冲区
- 形式:内存中的一个区域,落得缓冲区的分组可以发送
- 功能:用于存放已发送,但是没有得到确认的分组
- 必要性:需要重发时可用
- 发送缓冲区的大小:一次最多可以发送多少个未经确认的分组
- 停止等待协议=1
- 流水线协议>1,合理的值,不能很大,链路利用率不能超过100%
- 发送缓冲区中的分组
- 未发送的:落入发送缓冲区的分组,可以连续发送出去
- 已经发送出去的,等待对方确认的分组:发送缓冲区的分组只有得到确认才能删除
发送窗口滑动过程-相对表示方法
- 采取相对移动方式表示,分组不动
- 可缓冲范围移动,代表一段可以发送
①绿色部分表示发送缓冲区
滑动窗口(slide window)协议
- 发送窗口:发送缓冲区内容的一个范围
- 那些已发送但是未确认分组的序号构成的空间
- 发送窗口的最大值<=发送缓冲区的值
- 一开始:没有发送任何一个分组
- 后沿=前沿
- 之间为发送窗口的尺寸=0
- 每发送一个分组,前沿前移一个单位
最开始的时候前沿=后沿
发送窗口的移动->前沿移动
- 发送窗口前沿移动的极限:不能够超过发送缓冲区
发送窗口的移动->后沿移动
- 发送窗口后沿移动
- 条件:收到老分组的确认
- 结果:发送缓冲区罩住新的分组,来了分组可以发送
- 移动的极限:不能够超过前沿
红色部分是发送过后得到确认的,发送缓冲区就会向后移动
(1)刚开始发送窗口的前沿和后沿是在一起,这里的的发送缓冲区是占5个
(2)再发送0,1,2,3,4,等待接收端确认
(3)收到0-1的确认
(4)将0,1发送窗口的前沿后移
(5)将发送窗口的后沿后移,缓存区大小不变
就我自己的理解,发送缓存区始终存放的是发送还没有得到确认的分组,得到确认的分组就已将传给了接收方。
滑动窗口(slide window)协议-接收窗口
- 接收窗口(receiving window)= 接收缓冲区
- 接收窗口用于控制哪些分组可以接收;
- 只有收到的分组序号落入接收窗口内才允许被接收
- 若序号在接收窗口之外,则丢弃;
- 接收窗口尺寸Wr=1,则只能顺序接收;
- 接收窗口尺寸Wr>1,则可以乱序接收
- 但是提交给上层的分组,要按序
- 但是提交给上层的分组,要按序
- 接收窗口的滑动和发送确认
- 滑动:
- 低序号的分组的到来,接收窗口移动;
- 高序号分组乱序到,缓存但不交付(因为要实现rdt,不允许失序),不滑动
- 发送确认:
- 接收窗口尺寸=1,发送连续收到的最大的分组确认(累计确认)
- 接收窗口尺寸>1,收到分组,发送那个分组的确认(非累计确认)
- 滑动:
正常情况下的2个窗口互动
- 发送窗口
- 有新的分组落入发送缓冲区范围,发送->前沿滑动
- 来了老的低序号分组的确认->后沿向前滑动->新的分组可以落入发送缓冲区的范围
- 接收窗口
- 收到分组,落入到接收窗口范围内,接收
- 是低序号,发送确认给对方
- 发送端上面来了分组->发送窗口滑动->接收窗口滑动->发确认
异常情况下GBN的2窗口互动
- 发送窗口
- 新分组落入发送缓冲区范围,发送->前沿滑动
- 超时重发机制让发送端将发送窗口中的所有分组发送出去
- 来了老分组的重复确认->后沿不向前滑动->新的分组无法落入发送缓冲区的范围(此时如果缓冲区有新的分组可以发送)
- 接收窗口
- 收到乱序分组,没有落入到窗口范围内,抛弃
- (重复)发送老分组的确认,累计确认
异常情况下SR的2窗口互动
- 发送窗口
- 发送窗口
- 新分组落入发送缓冲区范围,发送->前沿滑动
- 超时重发机制让发送端将超时的分组重新发送出去
- 来了乱序分组的确认->后沿不向前滑动->新的分组无法落入发送缓冲区的范围(此时如果发送缓冲区有新的分组可以发送)
- 发送窗口
- 接收窗口
- 收到乱序分组,落入到接收窗口范围内,接收
- 发送该分组的确认,单独确认
GBN协议和SR协议的异同
- 相同之处
- 发送窗口>1
- 一次能够可以发送多个未经确认的分组
- 不同之处
- GBN:接收窗口尺寸=1
- 接收端:只能顺序接收
- 发送端:从表现来看,一旦一个分组没有发送成功,如:0,1,2,3,4;假如1未成功,234都发送出去了,要返回1再发送:GB1
- SR:接收窗口尺寸>1
- 接收端:可以乱序接收
- 发送端:发送0,1,2,3,4,一旦1未成功,2,3,4已发送,无需重发,选择性发送1
- GBN:接收窗口尺寸=1
流水线协议:总结
Go-back-N:
- 发送端最多在流水线中有N个未确认的分组
- 接收端只是发送累计型确认cumulative ack
- 接收端如果发现gap,不确认新到来的分组
- 发送端拥有对最老的未确认分组的定时器
- 只需设置一个定时器
- 当定时器到来时,重传所有未确认的分组
Selective Repeat:
- 发送端最多在流水线中有N个未确认的分组
- 接收方对每个到来的分组单独确认individual ack(非累计确认)
- 发送方为每一个未确认的分组保持一个定时器
- 当超时定时器到时,只是重发到时的未确认的分组
- 只发送ACK:对顺序接收的最高序号的分组
- 可能会产生重复的ACK
- 只需记住expectedseqnum;接收窗口=1
- 对乱序的分组:
- 丢弃(不缓存) -> 在接收方不被缓存!
- 对顺序接收的最高序号的分组进行确认-累计确认
选择重传
- 接收方对每个正确接收的分组,分别发送ACKn(非累积确认)
- 接收窗口>1
- 可以缓存乱序的分组
- 最终将分组按顺序交付给上层
- 接收窗口>1
- 发送方只对那些没有收到ACK的分组进行重发-选择性重发
- 发送方为每一个未确认的分组设定一个定时器
- 发送窗口的最大值(发送缓冲区)限制发送未确认的分组个数