五层协议之数据链路层
一、数据链路层的基本概念
信道类型有以下两种:
- 点对点信道:使用一对一的通信方式。
- 广播信道:使用一对多的广播通信方式,过程比较复杂,需要专门的共享协议来管理。
链路(link):是一条点到点的物理线路段,中间没有任何其他的交换结点。
数据链路(data link):除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
现最常用的方法是使用适配器(网卡)来实现这些协议的硬件和软件。
一般的适配器(网卡)都包含物理层和数据链路层这两层的功能。
帧:常常在两个对等的数据链路层之间画出一个数字管道,而在这条数字管道上传输的数据单位是帧。
二、数据链路层的三个基本问题
1. 封装成帧
在一段数据的前后分别添加首部和尾部,然后就构成了一个帧,确定帧的界限。
例如:帧首部为0000 0001
,帧尾部为0000 0100
。那么接收方识别帧首后,就知道要开始读取数据了,一直到帧尾,就知道读取完成了。
2. 透明传输
在上个例子中,可能有人会想到,如果数据中有些片段和帧首或帧尾相同咋办,那样不会提前结束吗?这就是所谓的透明传输问题了。
所以解决透明传输的方法就是字节填充法(或字符填充法):当数据部分出现与EOT
或SOH
相同的比特时,前面统一加上一个转义字符
,来表示下面一段不被视为首尾标识
。如果转义字符也出现数据当中,那么应在转义字符前再插入一个转义字符。
3. 差错检测
传输过程中可能会产生比特差错:1 可能会变成 0 而 0 也可能变成 1。
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
在数据链路层传送的帧中,广泛使用了循环冗余检验(CRC)
的检错技术。
下面我简单概述下CRC的处理逻辑:
-
确定要传输的数据,比如
101001
。 -
给这个数据后面加上
m
个0
,比如加上3个0
,就是101001000
。 -
让这个数据跟一个
m + 1
位的数相除,随便选,比如1101
,1011
。 -
除得的余数
001
,就是帧检验序列(FCS)
。 -
得到FCS后,FCS作为
冗余码
拼接在原数据后面,变成101001001
,再发送出去。 -
接收端接收到
101001001
后,再进行一次除法,被除数为101001001
,除数还是1101
,如果余数
为0
,代表数据未出错,否则丢弃数据。
101001001 1101 = 110101 ⋯ ⋯ 0 \dfrac {101001001}{1101} = 110101\cdots\cdots0 1101101001001=110101⋯⋯0
要注意几个点:
-
这个方法不能检测出是哪个比特或哪几个比特出了差错。
-
只要用位数足够多的
除数P
,就能很大程度提高差错检测率。换句话来说,就是CRC检测可能出现失误的。比如数据是500,除数是10,当数据出错了后,如果刚好是10的倍数(比如510、530),那余数依然为0。但增加除数大小,比如除数变成了250,那只有数据刚好出错变成了250的倍数时,余数才为0,检测成功率就提高了许多。
-
CRC只能保证无差错接收,要做到可靠传输,还要加上确认和重传机制。
三、两种情况下的数据链路层
1. 使用点对点信道的数据链路层
现在全世界使用得最多的数据链路层协议是点对点协议
PPP (Point-to-Point Protocol)。
PPP协议的帧格式,标志字段为0x7E
,转为二进制也就是01111110
。
当 PPP 用在异步传输时,就使用一种特殊的字符填充法(我不太理解这个方法(lll¬ω¬)):
- 将信息字段中出现的每一个
0x7E
字节转变成为2字节序列(0x7D, 0x5E)
。 - 若信息字段中出现一个
0x7D
的字节, 则将其转变成为2字节序列(0x7D, 0x5D)
。 - 若信息字段中出现 ASCII 码的控制字符(即数值小于
0x20
的字符),则在该字符前面要加入一个0