数据链路层的基本问题概述
数据链路层是用来实现相邻节点之间的数据传输,其中要用到物理层的0-1比特流传输能力
什么叫相邻?就是不需要经过第三方
什么叫第三方?就是数据链路层以下的东西
下面首先介绍数据链路层的几个基本问题
怎么传——数据链路层的信道利用方式
点对点信道
广播信道
无线广播信道
因为技术差异比较大所以从3.1.2分出来讲
往哪传——地址问题
通信的主体都有自己的标识,人们都可以通过这个找到他,称作地址
分配方式
随机分配——管理员分配配置
固化设置——将地址固化到物理器械中——以太网卡
传什么——封装成帧
要把01比特数据流变成一个个小块分出去
为什么呢?因为一个个小块作为基本单位比较好控制
那么怎么封装呢?我们要给帧加上帧头和帧尾
物理层编码违例法
使用非数据编码信号来表示帧的边界
如以太网用曼彻斯特编码方式传输数据
我们可以使用其他编码方式用作帧的边界,比如高电平或者低电平
字符计数法
在头部中的一个域指定该帧中的字符数
可是出错了就惨兮兮了
字节填充法
使用特殊的字符作为帧的开始和结束标志
新的问题来了,如果我们要传的数据出现了flag怎么办?
转义字节技术
这么牛B了还有什么缺陷呢?
必须紧紧依赖于8位字符模式
位填充法
帧开始和结束都有一个特殊的位模式01111110
当传输数据中有01111110如何处理?
碰到连续5连续的位“1”的时候,自动填充一位0
两边如何“平起平坐”——流量控制
发送方疯狂输出,速度超过了接受方能够接受这些帧的速度,what should I do?
基于反馈的流控制
定义规则,规范发送者什么时候可以发送帧,我告诉你什么时候你可以发你再发
基于速率的流控制
限制发送方的速率,我能受得了多少我提前告诉你
犯错了怎么办——出错处理
犯错了?!?!?!什么是错误?
凡是接收到的数据和发送的数据不一致就是错误
怎么会不一致呢?
编码本身存在的缺陷,噪音的影响会导致——错误数据、丢失数据、数据乱序
那怎么应对犯错呢?
纠错
使用纠错码——包含m个数据位和r个校验位的n-位单元,通常称为n位码字(n=m+r)
举例 海明码
纠正d位错误——假设传输过程中,最多d位出错
扩大表示原数据的01比特数
保证每两个n位码间的海明距离至少为2d+1
何谓海明距离?两个长度相等的字符串的海明距离是在相同位置上不同的字符的个数
接收到数据A时,与所有的n位合法码字求解海明距离,海明距离小于d的,就是传输的数据
例如:
接收到数据00000 00111,与上面的码字计算海明距离,和码字2距离最小,为2,因此该数据有两位出错了,原始数据应该是00000 11111
好笨的方法,好费事
检错
老子能看出来就行了
奇偶检错
在数据后面加上一个奇偶位,如果码字中的“1”的位为偶数,则填0,如果是奇数,则填1
针对突发性长错误
校验和
TCP/IP协议中使用的一种校验方法
检错码 CRC
- Step 1:选择生成多项式G(x) (r 阶-多项式表示)
- Step 2:在数据帧末尾加r个0,形成多项式:
M(x) (m+r阶)
- Step 3:求余数:[
M(x) / G(x)] 以2为模的除法
- Step 4:生成编码数据: T(x) =
M(x) - [
M(x)/ G(x)] 以2为模的减法
- Step 5:接收方检测:判断余数[T(x) / G(x)]是否为零?
是不是看不懂,咱来解释一下
什么是生成多项式?
发送和接收方协商好的多项式 最高位和最低位必须为 1
将多项式的系数罗列拼接而成的一个二进制0/1串,也就是未来的除数
检错能力很牛
但仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受(accept)
换句话说就是凡是接收端数据链路层接收的帧都没有传输差错”(有差错的帧就丢弃而不接受)
要做到“可靠传输”(即发送什么就收到什么)就必须再加上确认和重传机制