1.数据链路层基本知识
数据链路层位于物理层之上,网络层之下,他属于计算机网络的低层。
1.1 数据链路层的主要功能
为网络层提供服务:
- 链路管理 :数据链路的建立、维持和释放。
- 寻址:保证每一帧都能正确到达目的站。
保证数据传输的有效、可靠:
- 帧定界:将物理层的比特封装成帧,确定帧的开始和结束。
- 透明传输 :指丌管数据是什么样的比特组合,都应当能在链路上传输。
- 差错检测:能对物理信道传输的比特流检测出差错。
- 流量控制:控制发送方的发送数据速率使接收方来得及接收。
1.2 数据链路层简单模型
在下图中,我们可以看到数据流动的方向。
1.3 基本术语
链路link
- 链路(link)是从一个结点到相邻结点的一段物理线路(有线或无线),中间没有任何其他的交换结点。
- 进行数据通信时,两个计算机之间的通信路径往往要经过许多段这样的链路;
- 链路只是一条路径的一个组成部分。
数据链路data link
- 数据链路(data link) 除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议 的硬件和软件加到链路上,就构成了数据链路。
- 现在最常用的方法是使用网络适配器(即网卡)来实现这些协议的硬件和软件。
- 一般的适配器都包括了数据链路层和物理层这两层的功能。
数据链路层传输数据单元-帧
- 数据链路层的协议数据单元—帧。
- 常常在两个对等的数据链路层之间画出一个数字管道,而这条数字管道上传输的数据单位是帧。
封装成帧
封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。
首部和尾部的一个重要作用就是进行帧定界(确定帧的界限) 。
1.4 常用成帧方法
- 带字节/字符填充的首尾定界符法 ,让每一帧用一些特殊的字节作为开始和结束标志。
- 使用比特填充的标志法(也称零比特填充法)
1.4.1 用控制字符进行帧定界的方法
特殊的帧定界符: SOH(Start of Head) ASCII码值 0x01
EOT(End of Tail) ) ASCII码值 0x04
透明传输
透明:某一个实际存在的事物看起来却是好像不存在一样 。
解决透明传输问题
- 发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是 1B)。
- 字节填充(byte stuffing)或字符填充(character stuffing)——接收端的数据链路层在将数据送往网络层之前删除插入的转义字符。
- 如果转义字符也出现数据当中,那么应在转义字符前面插入一个转义字符。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
字节填充的标志字节法的特点
缺点: 容易造成帧定界混淆 ,依赖于8位字符
解决方法:在出现的特殊控制字符前插入转义字符,称为字节/字符填充的标志字节法。
位填充标志法(零比特插入法)
1.4.2 零比特填充法
- 以01111110作为一帧的开始和结束标志F字段。
- 在发送端的数据链路层当碰到一串比特流数据中有 5 个连续 1 时,就立即在该比特流后填入一个 “0” 。
- 在接收帧时,先找到 F 字段以确定帧的边界。接着再对比特流进行扫描。每当发现 5 个连续 1 时, 就将其后的一个“0 ” 删除,以还原成原来的比特流。
- 零比特填充法使一帧中两个 F 字段之间不会出现 6 个连续 1。
透明传输
- 采用零比特填充法就可传送任意组合的比特流,或者说,就可实现数据链路层的透明传输。
- 当连续传输两个帧时,前一个帧的结束标志字段 F 可以兼作后一帧的起始标志字段。
- 当暂时没有信息传送时,可以连续发送标志字段,使收端可以一直和发端保持同步。
1.5小结
- 数据链路层位亍物理层之上、网络层之下。
- 数据链路层为网络层提供有效、可靠的帧传输。
- 常用的封装成帧实现透明传输的方法 【字节/字符填充的标记法 、零比特填充的标记法 】
2.差错检测
2.1 设计数据链路层的原因
- 在传输过程中可能会产生比特差错:1 可能会变成 0 而 0 也可能变成 1。
- 在原始物理传输线路上传输数据信号是有差错的。
- 在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率 BER (Bit Error Rate)。
- 误码率与信噪比有很大的关系。【提高信噪比,误码率会减少】
差错产生的原因和差错类型
- 差错控制 — 检查接收到的数据是否出现差错以及如何纠正差错;
- 通信信道的噪声分为两类:热噪声和冲击噪声;
- 热噪声引起的差错是随机差错,或随机错;
- 冲击噪声引起的差错是突发差错,或突发错;
- 起突发差错的位长称为突发长度;
- 在通信过程中产生的传输差错,是由随机差错与突发差错共同构成的。
- 为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
2.2 差错控制编码
2.2.1 差错控制编码的基本思想
在发送端被传输的信息位上附加一些冗余位,这些冗余位与信息位之间以某种确定的规则相互关联(约束),接收端按照既定的规则检验信息位与冗余位之间的关系。
2.2.2 差错控制编码的原理
信息位:发送端要发送的数据
冗余位:发送端在向信道发送信息位之前,先按照某种关系加上一定的冗余位
发送与接收的过程:
发送时:信息位+冗余位构成码字发送;
接收时:收到码字后查看信息位和冗余位,并检查它们之间的关系 (校验过程),以发现传输过程中是否有差错发生。
2.2.3 差错控制编码分类
纠错码:
- 每个传输的分组带上足够的冗余信息;接收端能发现并自动纠正传输差错。
- 纠错码需要较多的冗余位,信道利用率不高。
检错码(局域网中主要使用的是检错码)
- 分组仅包含足以使接收端发现差错的冗余信息;接收端能发现出错,但 不能确定哪一比特是错的,并且自己不能纠正传输差错。
- 目前在数据链路层广泛应用了循环冗余检验CRC (Cyclic Redundancy Check)的检错技术。
2.3 循环冗余检验CRC
2.3.1 循环冗余检验CRC的原理
- 在计算机网络和数据通信中用得最广泛的检错码是一种漏检率低得多也便于实现的循环冗余码CRC(Cyclic Redundancy Code)
- CRC码又称为多项式码。任何一个由二进制数位串组成的代码都可以和一个只 含有0和1两个系数的多项式建立一一对应的关系。
CRC运算就是在发送数据M后面添加供差错检测用的r位冗余位,构成 一个由k位信息位加上r位冗余位组成的n=k+r位码字发送出去。
一个要发送的k位的帧对应于一个(k-1)次多项式 K(x) (k项k-1阶多项式)
选定一个多项式编码生成多项式G(x)为除数,G(x)为r阶
设待发送的k位的帧为M(x),k>r,即发送帧M(x)比G(x)长
2.3.2 模2运算
在二进制运算中,加减法做模2运算,采用“加法不进位,减法不借位”的规则,即相当于异或操作,“相同得0,相异得1”。
2.3.3 CRC码的计算举例
- 如发送一帧信息位 M = 101001(k=6)。
- 设 r = 3, 除数 P = 1101,
- 被除数是
M = 101001000。
- 模 2 运算的结果是:商 Q = 110101, 余数 R = 001。
- 把余数 R 作为冗余码添加在数据 M 的后面发送出去。发送的数据是:
M + R
- 即:101001001,共 (k + r) 位。
- 因为:
M(x)/G(x)=Q(x)+R(x)
- 所以:
M(x)+R(x)一定能被G(x)整除,余数为0
- 编码后发送的CRC码:101001001 当码字到达接收方时:
- 若CRC码在接收端能被除数1101整除,即余数为0,则说明接收正确
- 若CRC码不能被除数整除,即余数不为0,则检测到出错。
2.3.4 CRC校验码的检错能力
- CRC校验码能检查出全部单个错;
- CRC校验码能检查出全部离散的二位错;
- CRC校验码能检查出全部奇数个错;
- CRC校验码能检查出全部长度小于或等于K位的突发错;
- CRC校验码能以[1-
]的概率检查出长度为(K+1)位的突发错;
- 如果K=16,则该CRC校验码能全部检查出小于或等于16 位的所有的突发差错, 并能以1-
=99.997%的概率检查出长度为17位的突发错,漏检概率为 0.003%;
2.3.5 帧检验序列 FCS
- 在数据后面添加上的冗余码称为帧检验序列 FCS (Frame Check Sequence)。
- 循环冗余检验 CRC 和帧检验序列 FCS并不等同。
- CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。
- FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方 法。
接收端对收到的每一帧进行 CRC 检验
- 若得出的余数 R = 0,则判定这个帧没有差错,就接受(accept)。
- 若余数 R 不等于0,则判定这个帧有差错,就丢弃。
- 但这种检测方法并不能确定究竟是哪一个或哪几个比特出现了差错。
- 只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小。
请注意:无差错接受与可靠传输的不同
- 仅用循环冗余检验 CRC 的差错检测技术只能做到“无差错接受”,即凡是接 收端接受的帧(不包括丢弃的帧),都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错,有差错的帧就丢弃而不接受)。
- 在数据链路层使用CRC检验,只能够实现无比特差错的传输。
- “可靠传输”:数据链路层的发送端发送什么,在接收端就收到什么。
- “传输差错”可能是比特差错,或是出现帧丢失、帧重复或帧失序。
- 要做到“可靠传输” 就必须再加上帧编号、确认和重传机制。
2.4 小结
- 目前数据链路层广泛使用循环冗余检验CRC的检错技术。
- 采用CRC校验码的系统,需要约定一个生成多项式(除数)。
- 发送方:信息位+冗余位=发送码字
- 接收方:用收到的CRC码字除以生成多项式,判定余数是否为零?为零:接收正确,接受数据帧不为零:接收有错,丢弃数据帧