写在前面
以下笔记是我观看湖南科技大学高军老师的计算机网络课程得到的,
大家可以去慕课和哔哩哔哩上看看,讲的很棒
封装成帧
封装成帧是指数据链路层给上层交付的协议数据单元添加帧头帧尾使之成为帧,这里的上层是网络层,网络层的协议数据单元为package包
帧定界
这是PPP帧的格式与以太网v2的mac帧
我们知道物理层是以比特流的形式发送数据的
面对一连串的比特流,接收方如何从一连串的比特流中取出一个个帧呢?即如何对帧进行定界呢?
帧头和帧尾中包含有许多重要的控制信息,其中的作用之一便是帧的定界
给每个帧的开始部分和结束部分加上特殊的一串比特流,这样接收方在接收的时候就可以根据这些特殊的字符来区分一个帧的开始与结束了
当时并不是所有的帧中都具有这种开始于2结束标志,那么他们是怎么区分的一个帧的开始与结束的呢?
答案是物理层会给帧加上一个前导码来进行控制
MAC帧不需要结束定界符
透明传输
透明传输是指数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样
如果帧的数据内容中包含帧的定界符,那么帧还如何区分帧的开始与结束呢?
如下图
答案是使用转义字符,在数据中包含的定界符之前加上一个转义字符,如果数据中还包含转义字符则再加上一个转义字符
面向字节的链路使用字节填充,的方法实现透明传输
面向比特的物理链路使用比特填充的方法使用透明传输
物理层对来自数据链路层的数据进行扫描,在数据部分对每连续的5个1后面加上一个0.这样就保证了数据中不会出现帧定界符
差错控制
实际的通信链路都不是理想的,比特在传输的过程中可能会出现差错,1可能变成0,0可能变成1.这就是比特差错
所以需要对传输过程中的数据进行校验。
奇偶校验
循环冗余校验
举例
以太网帧和PPP帧都在帧中加上FCS来对帧进行校验
注意
可靠传输
上节我们知道使用差错检测技术接收方可以检测出所发送的帧有没有出现错误。
如下图如果帧出项的错误接收方可以通过帧中的校验码来检测出差错
服务类型
不可靠的传输服务:仅仅丢弃该帧什么也不做
可靠的传输服务:想办法发送端发送什么,接受端就接收什么
一般情况下,有限链路的误码率比较低,为了减小开销并不要求数据链路层提供可靠的传输服务。即使出现了误码,可靠传输的问题由其上层处理。
无线链路易受干扰,误码率比较高,因此要求数据链路层必须向上层提供可靠的传输服务
差错类型
比特差错只是传输差错中的一种
从整个计算机往网络的体系结构来看,传输差错还包括分组丢失,分组失序以及分组重复。
可靠传输不仅仅局限于数据链路层,其他各层都可以实现可靠传输
可靠传输的实现比较复杂,开销比较大,是否使用可靠传输取决于应用需求。
停止等待协议
通信双方基于互联网进行通信而不是点对点的通信链路
概述
停止等待协议就是发送方每发送一个分组就停止发送,等待对方确认,在等待对方确认收到分组后再发送下一个分组。全双工通信的双方即是通信方也是发送方。我们仅考虑 A 发送数据,而 B 接收数据并发送确认。
因此 A 叫做发送方,而 B 叫做接 收方。但是这种情况也存在许多问题,下面一一列举。
发送方发送的数据丢失
接收方接收不到数据分组,就不会发送ACK或NAK,如果不采取其他措施,发送方就会一直处于等待的状态。
那么怎么办呢?
为了解决该问题可以发送方启动一个超时计时器,若超时计时器超时,而发送方仍然没有收到ACK,那么发送方就会启动超时重传机制。重传该报文。一般可将重传时间选为略大于从接收方到发送方的平均往返时间
在数据链路层点对点的往返时间比较容易确认,重传时间比较好设定
而在运输层,由于端到端往返时间非常不确定,设置合适的重传时间并不容易
接收方的确认报文丢失
如图接收方的确认报文在传输过程中丢失了,接收方在超时计时器超时后重传了该报文,那么接收方就会认为这是一个新的报文把他接收了。导致了分组重复问题
为了避免分组重复问题,必须给每个分组带上序号,对于停止等待协议,只要保证每发送一个新的数据分组,其发送序号与上次发送的数据分组序号不一样就可以了。因此使用一个比特编码即可
确认报文迟到
数据链路层一般不会出现分组迟到的情况,因此在数据链路层不需要给ACK分组编号
信道利用率低
回退N帧协议
上面我们提到停止等待协议的信道利用率很低。所以这节我们来用流水线的方式来对数据进行传输。
流水线方式即接收方一次性发送多个分组给接受端,而不是发一个就等待确认分组,在发送下一个。
具体实现:
1.我们使用n比特的分组编序号
2.发送窗口的尺寸Ws的取值:1<W<=2^n-1,
3.接收方窗口的尺寸为Wr=1;
4.发送方一次可以向接收方发送多个分组,接收方只对在接收窗口内的数据进行接收
无差错情况
1.我们使用三个比特的分组编序号,即序号0-7
2.发送窗口的尺寸Ws的取值:1<W<=2^3-1,这里我们取Ws=5
3.接收方窗口的尺寸为Wr=1;
如图接收方一次性向接收方发送了5个分组。这五个分组按序到达了接受端接受端每接收到一个分组就将接收窗口向前移动一位。这样就可以将这五个分组依次接收下来。
接收到对应的分组后,就可以向发送方发送确认报文
接收方不一定需要对分组逐个确认,可以使用累计确认的方法,具体接收到几个分组后进行确认按照具体使用场景确定。ACKn表示序号n和之前的分组全部都被接收了。
比如下图发送方接收到了5个分组,只需发送一个ACK4确认报文即可,表示前面的01234五个包都已经被正确接收
使用累计确认可以减少接收方的开销,减少对网络资源的占用。还可以解决部分ACK报文丢失的情况,比如ACK4丢失了,ACK8被接收到了,就表示ACK4已经被正确接收到了。
缺点是发送方不能及时知道接收方的情况
有差错的情况
如下图,接收方向发送发发送了10765五个分组,而5号分组出现了误码的情况。
那么接收方对后序的报文也不会继续接收,直接将报文丢弃,因为发送报文并不存在于接收窗口内。那么接收方就会向发送方发送最近一次接收到报文的ACK信号,这里是ACK4。
为了加快重传的速度,接收方可以不等待超时计时器超时就发送该分组,可以在接收到几个重复的ACK报文后就重传分组。具体几个由具体实现决定。
在本例中,尽管序号为6,7,0,1的数据分组都正确的到达了接收方,但由于5号分组误码不被接收,他们也会受到牵连而不被接受,发送方还要重传这些数据分组,这就是所谓的GO-BACK-N(回退N帧协议),可将在通信链路质量不好的时候,回退N帧协议并不比停止等待协议高。
发送窗口过大的情况
1.我们使用n比特的分组编序号
2.发送窗口的尺寸Ws的取值:1<W<=2^n-1,
3.接收方窗口的尺寸为Wr=1;
4.发送方一次可以向接收方发送多个分组,接收方只对在接收窗口内的数据进行接收
如果发送方的发送窗口Ws的取值大于2^n-1会怎么样?
会导致接收方不发区别新旧分组。
如下图我们使用3个比特来对分组进行遍历,理论上发送窗口的大小最大只可以为7,我们来看看我们取8会出现什么情况
发送方向接收方发送8个分组,八个分组都被正确接收了,但是接收方向发送发发送的ACK7的累计确认报文丢失了。
由于发送方没有接收到ACK,就启动超时重传机制,此时接收方就无法区别这是新报文还是旧报文。导致出现差错。
小总结
选择重传协议
在学习选择重传协议之前我们先来思考回退N帧协议存在什么缺点
回退N帧协议的接收窗口尺寸的大小只可以等于1,因此接收方只可以按序接收正确到达的分组
一个分组的误码会导致其后面的正确到达接收方的分组也会被丢弃,这会导致这些原本正确到达的分组也被丢失,这是对通信资源的极大浪费。
为了进一步提高性能,可以设法只重传出现误码的分组,因此接收窗口的尺寸应该大于1而不再为1,以便接收方先收下失序到达但是无误码而且落在接收窗口内的分组,等待所缺的分组到达再一并移交给上一层。
**注意: **
选择重传协议不可以使用累计确认机制,需要逐一确认。因为他要使发送方只重传出现错误的分组
具体实现流程:
1.采用N个比特给分组编号
2.发送窗口的尺寸Ws<=2(N-1)
3.接收创库的尺寸Wr=Ws
正确传输的情况
发送方一次性向发送方发送4个分组,这些分组都落在接收方的接收窗口内,所以这些分组可以一并被接收
失序传输的情况
发送方向接收方发送4个分组
其中2号分组丢失了
接收方会将正确到达的1.2.3号分组接收,不会丢弃,因为他们都落在接收窗口内,
接收方会向发送方发送已经正确接收的1,2,3号分组的ACK确认报文,并将接收
窗口向前移动两位。注意接收窗口的移动条件是接收窗口前面的分组都已经被正确
接收,这里的2号未被正确接收,所以接收窗口仅仅移动2位而不是4位。
接收方在接受到ACK确认报文后
发送方窗口向前也是移动两位,因为2号分组的确认报文没有接收到
发送方的超时计时器超时后,会重发未接收到的2号报文
接受方接收到2号报文后,可以将所有接收到的报文都交给上一层。
窗口过大的情况
我们前面说到窗口的大小必须在1<W<=2(N-1)之间,如果过大会发送什么情况呢?
举例:
采用3个比特位对分组编号,窗口理论只能取4,我们取5
发送方一次向接收方发送5个分组,接收方正确接收五个报文
但是0号分组的ACK报文在回来的途中丢失了,等超时重传计时器超时后,发送方重传该报文。
由于正确接收到5个报文后接收方已经向前移动了5个报文,此时接收方就会认为发送方
重传的0号报文是新的报文,导致接收方无法区分新旧报文的情况出现