1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-02-07 21:04:38 +08:00
Files
CS408/Computer-Network/data-link-layer.md
2021-04-09 00:22:35 +08:00

362 KiB
Raw Blame History

数据链路层

基本概念

  • 结点:主机、路由器。
  • 链路:网络中两个结点之间的物理通道。
  • 数据链路:网络中两个结点之间的逻辑通道。
  • 帧:链路层的协议数据单元。

数据链路层功能:

  1. 为网络层提供服务:无确认无连接服务、有确认无连接服务、有确认面向连接服务。
  2. 链路管理。
  3. 组帧。
  4. 流量控制。
  5. 差错控制。

封装成帧

在一段数据的前后部分添加首部和尾部,构成一个帧。接受端在收到物理层上交的比特流后就可以根据首部和尾部的标记从而识别帧的开始和结束。

透明传输

不管所传数据为什么样的比特组合都能在链路上传输。因此链路层就看不见有什么方案数据传输的东西(控制信息)。

字符计数法

帧首部使用一个计数字段(第一个字节,八位)表明帧内字符数。

字符计数

缺点:如果在某一个帧内,标记位后面的某个字节的数据丢失,那么会影响后面的帧。

比如3 1 1 和 4 2 2 2如果前面的帧丢失变成 3 1那么后面的4就会被补到前面变成 3 1 4导致错误。

字符填充法

帧就是加头加尾分别标记开始结束,而如果数据内某段比特流数据正好与标记字段重复,就会导致误判断的情况。

字符填充法就是在误会的字符前添加转义字符。

字符填充

零比特填充法

当帧开始符和结束符一样且帧定界符中含有5个以上连续的1就可以使用零填充法。

  • 在发送端扫描整个信息字段只要有连续的五个1就立即在第五个1后加上一个0无论后面是1还是0。
  • 在接收端收到一个帧时先找到标志字段确定边界再用硬件对比特流进行扫描发现连续五个1时就把后面的0删除。

违规编码法

使用帧中不会用到的编码来定帧的起始和终止。

违规编码法

由于字节计数法的脆弱性与字符填充实现的复杂性与不兼容性,所以基本上使用零比特填充与违规编码法。

差错控制

噪声来源:

  • 全局噪声:线路本身电气特征所产生的固有的随机噪声(热噪声);可以通过改善传感器调高信噪比来减少。
  • 局部噪声:外界特定短暂的原因所产生的冲击噪声,是产生差错的主要原因;可以通过编码计数来解决。

差错:

  • 位错比特位出错1变为00变为1。
  • 帧错有三种情况假如发送的是1 2 3
    1. 丢失1 2。
    2. 重复1 2 2 3。
    3. 失序3 1 2。

差错控制:

  • 检错编码:
    • 奇偶校验法。
    • 循环冗余码CRC
  • 纠错编码:海明码。

物理层所说的编码是针对单个比特的调制,为了达成同步。

而数据链路层所说的编码是针对一组比特,通过冗余码的计数实现对一串二进制比特率的检查。

奇偶校验码

首先一串数据长度为n-1需要在数据第一位加上一位校验码。

奇校验要选校验码1或0使得n位的总数据里的1为奇数而偶校验要选校验码1或0使得n位的总数据里的1为偶数。

奇偶校验码对于出错的数据仍有对应的奇偶个1则无法检验出是否出错。即出错奇数个位数可以检查出来偶数个位数不能检查出来所以其检错能力为50%。

如字符为1100101原数据有4位1若使用奇校验则需要首位校验位为1让整个数据有奇数5个1从而整个数据变为11100101。若接受方收到11000011、11001010这种数据则能校验因为数据有偶数个111010011则无法校验因为有奇数个1。

CRC循环冗余码

分为三个部分传输数据、生成多项式、FCS帧检验序列/冗余码。

如简单来说在接受端:

传输数据 生成多项式 冗余码
5 ÷ 2 =2 1

所以最终发送的数据就是传输数据冗余码5+1=6。

在接收端:

接受数据 生成多项式 冗余码
6 ÷ 2 =3 0

余数为0判断无错就接受。

其中正式的计算方法如下并给出例题发送数据为1101 0110 11采用CRC校验生成多项式为10011其最终发送数据是

原数据加0

假设生成多项式G(x)的阶为r则需要在原数据后面加r个0多项式有N位那么阶就是N-1位

如题目中生成多项式10011表示为多项式是$x^4+x^1+x^0$所以阶就是4。

最后数据就是1101 0110 1100 00。

模二除法

在数据加0后使用模二除法除以多项式余数就是冗余码CRC校验码的比特序列。

模二除法就是异或同0异1。

模二除法

所以就得到了帧检验序列FCS为1110。

所以要发送的数据就是要发送的数据加上帧检验序列1101 0110 1111 10。

检错过程

把接收到的每一个帧都除以相同的生成多项式然后检查得到除数R如果R=0则接受否则丢弃。

FCS的生成与接收端CRC检验都是由硬件完成所以处理很快因此不会延误数据的传输。

海明码

能发现双比特错,但是只能纠正单比特错。

确定校验码位数r

海明不等式:$2^r\geqslant k+r+1$其中r为冗余信息位k位信息位。

假如传输的数据D=1011 01为6位即信息位k为6就可以一个个代入得到最小的r为4所以海明码的校验码为4位传输数据为6+4=10位。

确定校验码和数据的位置

假设4位校验码分别为$P_1$、$P_2$、$P_3$、$P_4$,数据从左到右为$D_1$、$D_2$……$D_6$。

校验码$P_n$需要插入到原数据之中作为传输数据,且只能插入到$2^n$的位置即1、2、4……

然后在其他位置按需填入$D_n$

数据位 1 2 3 4 5 6 7 8 9 10
代码 P_1 P_2 D_1 P_3 D_2 D_3 D_4 P_4 D_5 D_6
实际值 1 0 1 1 0 1

求出校验码的值

需要将数据位置的十进制先用二进制表示。

然后根据二进制中校验码$P_n$位置的1来判断其可以校验哪些位因为第一步校验位的插入规定$P_n$的位置使用二进制表示一定只有一个1那么就要根据这个1所在的位置找到所有同样这个位置是1的位置所在的数据位就是可以被校验码校验的原数据位。同一位可以被不同的校验码同时校验。

$P_1$是第一位即0001位所以1在二进制位置的第四个地方找到10个位置中所有二进制位置的第四个位为1的数据位即00113$D_1$01015$D_2$01117$D_4$10019$D_5$。所以$P_1$可以校验这4个数据。

要使其能校验就要令所有要校验的位异或等于0。

即令$P_1\oplus D_1\oplus D_2\oplus D_4\oplus D_5=0$。从而$P_1\oplus1\oplus0\oplus1\oplus0=0$根据同0异1得到$P_1=0$。

同理$P_2$的位置用二进制表示是0010所以它可以校验二进制位置第三位是1的所有数据位即可以校验$D_1$、$D_3$、$D_4$、$D_6$。

即令$P_2\oplus D_1\oplus D_3\oplus D_4\oplus D_6=0$。从而$P_1\oplus1\oplus1\oplus1\oplus1=0$根据同0异1得到$P_2=0$。

同理$P_3$的位置用二进制表示是0100所以它可以校验二进制位置第二位是1的所有数据位即可以校验$D_2$、$D_3$、$D_4$。

即令$P_3\oplus D_2\oplus D_3\oplus D_4=0$。从而$P_1\oplus0\oplus1\oplus1=0$根据同0异1得到$P_3=0$。

同理$P_4$的位置用二进制表示是1000所以它可以校验二进制位置第一位是1的所有数据位即可以校验$D_5$、$D_6$。

即令$P_4\oplus D_5\oplus D_6=0$。从而$P_4\oplus0\oplus1=0$根据同0异1得到$P_4=1$。

数据位 1 2 3 4 5 6 7 8 9 10
二进制 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
代码 P_1 P_2 D_1 P_3 D_2 D_3 D_4 P_4 D_5 D_6
实际值 0 0 1 0 0 1 1 1 0 1

从而最后海明码就是0010 0111 01。

检错并纠错

已知海明码就是0010 0111 01。假如第五位出错从而变为0010 1111 01。

令所有要校验的位进行异或运算:

$P_1\oplus D_1\oplus D_2\oplus D_4\oplus D_5=0\oplus1\oplus1\oplus1\oplus0=1$。

$P_2\oplus D_1\oplus D_3\oplus D_4\oplus D_6=0\oplus1\oplus1\oplus1\oplus1=0$。

$P_3\oplus D_2\oplus D_3\oplus D_4=0\oplus1\oplus1\oplus1=1$。

$P_4\oplus D_5\oplus D_6=1\oplus0\oplus1=0$。

从$P_1$进行的运算开始将所有计算结果组成为1010这个数字即表示出错的位置即第五位出错。

流量控制

较高的发送速度和较低的接受能力不匹配时传输会出错。

数据链路层流量控制与传输层的流量控制的区别:

  • 数据链路层流量控制是点到点的,而传输层的流量控制是端到端的。
  • 数据链路层流量控制是相邻两个结点的,而传输层的流量控制是两个主机的。
  • 数据链路层流量控制是收不下就不回复确认(确认控制帧),而传输层的流量控制是接收端发送发送端一个窗口公告。

流量控制协议分为停止等待协议与滑动窗口协议滑动窗口协议又分为两种后退N帧协议与选择重传协议。其实停止等待协议也是一种特殊的滑动窗口协议。

滑动窗口可以解决流量控制和可靠传输两个部分的功能。

数据链路层协议的滑动窗口在同一次发送与接受中都是固定的。

窗口大小 停止等待协议 后退N帧协议 选择重传协议
发送 =1 >1 >1
接受 =1 =1 >1

停止等待协议Stop-and-Wait

每发送完一个帧就停止发送并等待对方确认如果收到确认就再发送下一个帧。因为是停止等待所以只用一位以1、0来对帧编号就可以了。虽然同样是0帧但是是不同的帧。

无差错情况

ACK表示确认acknowledge。

无差错停止等待协议

有差错情况

帧丢失或帧出错:

有差错停止等待协议帧丢失出错情况

  1. 发送完一个帧后,必须保存其副本,传输完毕才能丢失该副本。
  2. 数据帧与确认帧必须编号。
  3. 超时计时器:每次发送一个帧就启动一个计时器。
  4. 超时计时器设置的重传事件应该比帧传输的平均RTT更长。

ACK确认丢失

有差错停止等待协议帧确认丢失情况

ACK确认迟到

有差错停止等待协议帧确认迟到情况

信道利用率=数据帧长度/(数据帧长度+往返时延RTT+确认帧长度)。

信道利用率=(单位时间内发送数据的比特数/发送发发送数据传输率)/发送周期。

当确认帧忽略时可以用下面的公式。

例题 如一个信道的数据传输速率为4kb/s单向传播时延为30ms若使用停止等待协议的信道最大利用率为80%,则数据帧长度至少为多少?

解析令数据帧长度为Lkb利用公式信道利用率=(单位时间内发送数据的比特数/发送发发送数据传输率)/发送周期。

得到:0.8=\dfrac{\dfrac{L}{4}}{\dfrac{L}{4}+2\times0.03}

最后得到L=960b。

信道吞吐率=信道利用率×发送方的发送速率。

停止等待协议特点

  • 简单。
  • 信道利用率低。

后退N帧协议GBN

  • 发送窗口:发送方维持一组连续的允许发送的帧的序号。
  • 接受窗口:接受方维持一组连续的允许接受的帧的序号。

GBN会一次性将在发送窗口内的n个帧一个个全部发送完然后再移动受确认的帧的个数个窗口如果一直收不到确认信息则一直不移动发送窗口并不断依次重传。

帧类型

假设发送窗口一次一共有N个帧且帧开始的索引值为0帧的类型分为

  1. 发完被确认的帧h发送窗口已经发送过的且已经被接收端发送确认消息且被接受的帧个数。此时从0到h-1都是已经发送且被确认的帧发送窗口的开始索引为h。已经移动发送窗口h次。
  2. 已经发送但仍等待确认的帧n在发送窗口中已经被发送但是因为确认信息在路上所以等待确认的此时h到h+n-1都是已经发送但仍等待确认的帧。
  3. 还能发送的帧即在发送窗口中还没有被发送的帧。还能发送的帧个数为N-n个。开始的索引为h+n结束的索引为h+N-1。
  4. 还不能发送的帧在发送窗口后面的不能被发送的帧开始的索引为h+N。

GBN发送方必须响应的事件

  1. 上层调用:上层发送数据,发送方必须检查发送窗口是否已满,未满则产生帧并发送,若已满则先缓存数据,等窗口不满时再发送。
  2. 收到一个ACK对n号帧采取累积确认偶尔捎带确认的方式标明接收方已经收到n号帧和其之前的全部帧。
  3. 超时事件:如果出现超时,则发送方重传所有已发送但是未被确认的帧。接收方只按顺序接受帧,对于其非期待的确认帧则丢弃。

GBN接收方要做的事件

  1. 如果正确收到n号帧且顺序一致则接收方位n帧发送一个ACK并将该帧中的数据部分上交上层。
  2. 其余情况都丢弃帧并为最近按序接收的帧重新发送ACK向发送方表面要重传帧。接收方无需缓存任何失序帧只用维护下一个按序接收的帧序号。

采用n个比特对帧编号则发送窗口的尺寸$W_T$应满足$1\leqslant W_T\leqslant 2^n-1$,如果帧太大会让接收方无法确认新帧旧帧。

例题 数据链路层采用了GBN协议发送方已经发送了编号为0到7的帧当计时器超时时若发送方只收到了0、2、3号帧的确认则发送方需要重新发送的帧数为

A.1 B.2 C.3. D.4

解析请注意的是GBN是累计确认的所以最后收到了3号帧的确认代表0、1、2、3号帧都确认收到了没有收到1号的确认也无所谓所以这时候就应该从4号帧开始重发所以是D。

GBN协议特点

  • 因连续发送数据帧而提高了信道利用率。
  • 在重传时必须把原来已经正确传送的数据帧重传,从而令传送速率降低。

选择重传协议SR

累计确认会导致批量重传问题所以SR为了实现只重传出错的帧解决的办法就是设置单个确认而非累计确认同时加大接收窗口缓存乱序到达的帧。

发送窗口中分为已经发送被确认的帧、已经发送但等待确认的帧、还能发送的帧三种,其中这三种帧不一定是连续的,而只有发送窗口的第一个帧是已经发送被确认的帧发送窗口才能移动一格或多格。

接收窗口分为希望收到但是没有收到的帧、希望收到且已收到的帧、等待接收的帧三种,其中这三种帧不一定是连续的,接收窗口中收到且确认的帧位于缓存之中,而只有接收窗口的第一个帧是希望收到且已收到的帧接收窗口才能移动一格或多格。

SR发送方必须响应的事件

  1. 上层调用:上层发送数据,发送方必须检查发送窗口是否已满,未满则产生帧并发送,若已满则先缓存数据,等窗口不满时再发送。
  2. 收到一个ACK如果收到ACK对应的帧序号在窗口内则SR发送方将那个被确认的帧标记为已接收。如果该帧序号是窗口的下界最左边在窗口向前移动到具有最小序号的未确认帧处。如果窗口移动且有序号在窗口内未发送的帧则发送这些帧。
  3. 超时事件:每一个帧都具有自己的计时器,一个超时事件发生后只重传一个帧。

SR接收方要做的事件

  1. 确认一个正确接收的帧而不管是否按序。失序的帧将被缓存,并返回发送方一个该帧的确认帧,直到所有比其序号更小的帧都被接收为止,这时才能将这一批帧交付上层,然后向前移动接收窗口。

[]