1.数据链路层:可靠传输
笔记来源:
湖科大教书匠:可靠传输的基本概念
湖科大教书匠:可靠传输的实现机制–停止等待协议SW
声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考
1.1 可靠传输的基本概念
接收方检测到帧中出现误码,之后可以选择重传全部帧或仅丢弃检测到误码的帧,具体选择哪种方式,需要看数据链路层向上层提供什么样的服务类型。
不可靠传输服务:仅丢弃含有误码的帧
可靠传输服务:实现发送端发送什么,接收端就收到什么(并不局限于数据链路层,其他各层均可选择实现可靠传输)
下面介绍可靠传输的实现机制(不局限于数据链路层,也可应用到其他层)
1.2 可靠传输的实现机制–停止等待协议SW
正常情况下发送方与接收方的行为
若发送方发出的数据在传输过程中丢失,接收方就无法收到数据也就不会对发送方回应,使用超时计时器解决这个问题
若接收方在收到发送方发出的信息后发出确认信息,该信息在传输过程中丢失,使得发送方执行超时重传,造成接收方重复收到分组,将数据分组编号,接收方遇到重复数据分组就将其丢弃
确认分组是否需要编号?若只在数据链路层实现停止等待协议,则无需给确认分组编号,因为在数据链路层一般不会出现确认迟到的问题。其他层可能需要对确认分组编号
停止-等待协议的信道利用率
当(往返时延) R T T ≫ T d RTT\gg T_d RTT≫Td(发送时延)如使用卫星链路,信道利用率非常低,为了解决此问题,引出另外两种协议
1.3 可靠传输的实现机制–回退N帧协议GBN(滑动窗口协议)
累积确认:接收方不一定对收到的数据分组逐个发送确认,而可以在收到几个数据分组后对按序到达的最后一个数据分组发送确认,表明包括当前分组及其前面发送的分组接收方已经收到。
发送方在收到ACK确认后发送窗口向右移动,发送方继续发送。若其中有ACK确认未收到也不影响,因为GBN协议采用累积确认的方式,例如:收到ACK2代表0-2号分组已确认收到,其中就包含了1号分组,故ACK1丢失也不影响。
将发送窗口内(数字代表分组编号)的分组依次发出
若在传送过程中5号分组出现误码,则需要丢弃5号分组
为什么要回退后序分组?因为在接收方的接收窗口中,当丢弃5号分组,接下来需要接收6号分组,但目前接收窗口是5号分组,无法与6号匹配,造成了发送与接收的错位,所以需要将5号分组及其后序分组丢弃,发送方全部重传这些分组。(即由发送方回退N帧)
以上也是GBN的缺点之一,这是由于GBN中接收窗口等于1造成的。
对之前按序接收的最后一个分组(即4号分组)进行确认,目的是让发送方知道4号分组之前的分组都已经收到了,现在可以发送4号分组的后序分组了。每丢弃一个分组都要发送一个ACK分组(丢弃了1076四个分组)
假设4个ACK分组没有触发立刻重传,而是重传计时器超时触发重传,则发送方重新发送这些分组(回退N帧)
发送窗口不能太大也不能太小,若
W
T
=
1
W_T=1
WT=1则回退N帧协议变为了逐个确认,而不是累积确认,若
W
T
=
2
n
−
1
W_T=2^n-1
WT=2n−1则接收方无法辨认新旧分组,产生分组重复
假设发送窗口为8(超过
2
3
−
1
2^3-1
23−1)
接收方正确接收0-7号分组
接收方发出累积确认ACK7,表明包括7号分组在内的之前的分组已经接收,发送方可以发送7号分组之后的分组了
若ACK7在传输过程中丢失,则导致发送方超时重传这些分组,接收方在接收这些新分组时发现和旧分组的分组序号一致,导致重复接收分组
个人理解:我们看到分组编号每0-7一个循环,但第一次用编号0-7传送的数据和用后面编号0-7传送的数据可能是不一样的数据,但由于编号是相同的,所以接收方无法分清楚是新发送来的数据(称作新分组)还是重新发送来的数据(称作旧分组)
1.4 可靠传输的实现机制–选择重传协议SR
GBN接收窗口等于1时,一个数据分组的误码导致后序多个分组不能被接收方按序接收而丢弃,造成发送方对这些数据分组的超时重传,这是对通信资源的极大浪费。可设法只重传出现误码的数据分组,将接收窗口设置为大于1,以便接收方先收下失序到达但没有误码且序号落在接收窗口内的那些数据分组,等到所缺分组收齐后再一并送交上层。
SR不支持累积确认
若分组2丢失
接收方接收分组0和1,并发送ACK0和ACK1,接收窗口向右滑动2个位置,接收分组3并发送ACK3,等待发送方重新发送分组2
接收ACK0和ACK1,发送窗口向右滑动2个位置
分组4号和5号落到发送窗口中,现发送分组4和5
发送方将分组0和1缓存删除,接收方接收到的分组0和1移交上层
接收ACK3并标记分组3。接收方收到分组4和5,并发送ACK4和ACK5,发送方接收ACK4和5并标记分组4和5。标记的目的是防止重复发送
分组2触发超时重传,发送方重新发送分组2
接收方接收分组2并发送ACK2,至此接收窗口内包含的分组全部收到
接收窗口向右滑动4个位置
发送方接收到ACK2并进行标记,发送窗口向右滑动4个位置