五层协议之数据链路层
一、数据链路层的基本概念
信道类型有以下两种:
- 点对点信道:使用一对一的通信方式。
- 广播信道:使用一对多的广播通信方式,过程比较复杂,需要专门的共享协议来管理。
链路(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,代表数据未出错,否则丢弃数据。
要注意几个点:
-
这个方法不能检测出是哪个比特或哪几个比特出了差错。
-
只要用位数足够多的
除数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的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。
PPP 协议用在 SONET/SDH 链路时,是使用同步传输(一连串的比特连续传送)。这时 PPP 协议采用零比特填充方法来实现透明传输:
-
在发送端,只要发现有 5 个连续
1,则立即填入一个0。接收端对帧中的比特流进行扫描。每当发现 5 个连续1时,就把这 5 个连续1后的一个0删除。
以上就是两种透明传输处理方法。
PPP不提供确认或序号机制,主要出于以下几点考虑:
- 在数据链路层出现差错的概率不大时,使用比较简单的 PPP 协议较为合理。
- 数据链路层的可靠传输并不能够保证网络层的传输也是可靠的。(这点我觉得有点牵强,比如你问海关检查人员,为什么不能保证货物安全入关,他说:”我这里保证安全入关,到国内也有可能被偷啊,没必要“。)
- 帧检验序列 FCS 字段可保证无差错接收。
2. 使用广播信道的数据链路层
1)局域网的数据链路层
局域网最主要的特点是:网络为一个单位所拥有,且地理范围和站点数目均有限。主要优点是具有广播功能。
常见的局域网拓扑结构:
2)CSMA/CD
全拼:Carrier-Sense Multiple-Access with Collision-Detection。
翻译:载波监听 多点接入 与 碰撞检测。
- 多点接入:表示多台计算机连接到一个总线上
- 载波监听:是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。
- 碰撞检测:就是计算机边发送数据边检测信道上的信号电压大小。
前面两个好理解,碰撞检测可能难以理解些。举个例子,如果B在发送数据时,C也在发送数据(不管它们发给谁,反正要经过总线),那么这两股数据会撞在一起,撞到一起的数据电压会变大,变得一个超过规定的阈值。所以当接收方收到数据后,会根据数据的电压大小来判断这个数据是否发生过碰撞。
所以使用CSMA/CD协议的以太网不能进行全双工通信,只能双向交替通信(半双工通信),使得以太网的通信量远小于预期。
3)时延对载波监听的影响
假设A点到B点的传播时延为t。
如果A和B同时发送数据,那么在AB中点会发生碰撞(此过程耗时0.5t),碰撞后的波传递或反射到A点需要的时间是0.5t,从发送到接受碰撞波一共耗时1t。
那么,这个过程最大耗时是多少呢?简单一想,肯定是当A发的波无限接近B点时,B再发了个波,刚好在B点碰撞,然后传回来,一共耗时2t。
上面的例子说明了:最先发送数据帧的站,在发送数据帧后至多经过时间2t(两倍的端到端往返时延)就可知道发送的数据帧是否遭受了碰撞。这个时期,也叫做争用期。
经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞。
通常,以太网取51.2 us作为争用期的长度。
对于10MB/S的以太网,在争用期内可以发送512bit的数据,也就是64字节。
只要发出去的前64字节不出问题,后面的就不会发生冲突了。也就是说,如果发生了冲突,一定是在前64位。
发送站点检测到冲突时会停止继续发送,这时发送的数据一定小于64字节。
所以,以太网规定,最短有效帧的长度为64字节,凡是小于64字节的帧都被视为无效帧。
思考一:这个64字节能通过什么来提升?
答:带宽,10MB/S的以太网在争用期内能发出64字节的数据,100MB/S就能发出640字节的数据。
思考二:以太网网线能无限长吗?
答:不能,网线变长后,传播时延
t也会变大,在争用期2t内,会发送出更多的数据,最短有效帧就会更大。当它大到一定地步时,比如1G,那么凡是小于1G的帧都是无效帧,这是不合理的。
当站点检测到碰撞后,会立刻终止当前数据的发送,再继续发送若干比特的人为干扰信号(jamming signal),以便让所有用户都知道现在已经发生了碰撞。 然后推迟一段时间后再发送数据。
四、以太网
1. 概念
DIX Ethernet V2 是世界上第一个局域网产品(以太网)的规约。严格说来,“以太网”应当是指符合 DIX Ethernet V2 标准的局域网。
最初的以太网是将许多计算机都连接到一根总线上。当初认为这样的连接方法既简单又可靠,因为总线上没有有源器件。
如果B要向D发送数据,B向总线发送数据后,总线上的每一个工作的计算机都能检测到 B 发送的数据信号。
由于只有计算机 D 的地址与数据帧首部写入的地址一致,因此只有 D 才接收这个数据帧。
其他所有的计算机(A, C 和 E)都检测到不是发送给它们的数据帧,因此就丢弃这个数据帧。
- 以太网采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据。
- 以太网对发送的数据帧不进行编号,也不要求对方发回确认。(理由是局域网信道质量很好,出错的概率很小)。
- 以太网发送数据使用
曼彻斯特编码。
2. 集线器
集线器是使用电子设备来模拟实际电缆线的工作,因此整个系统仍然像一个传统的以太网那样运行。
使用集线器的以太网在逻辑上仍是一个总线网,各工作站使用的还是CSMA/CD协议,并共享逻辑上的总线。
集线器是一个很傻的设备。它会平分带宽;而且一个站要给另一个站发信息时,所有站都会收到,即占用总线;只支持半双工通信;搬运消息的工具人。
3. 信道利用率
一个帧从开始发送,经可能发生的碰撞后,将再重传数次,到发送成功且信道转为空闲(即再经过时间t使得信道上无信号在传播)时为止,是发送一帧所需的平均时间。
上图的 指的传播时延,代表发送时延。所谓的信道利用率,就是在占用期内,传播时延和发送时延的比值,这个比值越小,说明利用率越高。
所以在以太网中定义参数a,它是以太网传播时延 与帧的发送时间 之比:。
a越大,说明争用期所占比例越大,每次碰撞浪费更多的信道资源,降低信道利用率。
那么,信道利用率的最大值是什么呢?
首先想一想什么情况下会出现最大值,当然是信道永远不会发生碰撞,而且一直保持占用状态(一个数据发完了,另一个数据马上接着发),就是上图左边的碰撞器抹掉,信道才能最极限地被利用。
在这种理想情况下,信道极限利用率 。
4. MAC层
在局域网中,硬件地址又称为物理地址,或MAC地址。
MAC地址为48位二进制数,通常使用十六进制数来表示。
在Win系统下,使用ipconfig /all命令可以查看自己电脑的MAC地址。
前面介绍的CSMA/CD协议的局域网,都是”一发多收“的,那接收方怎么知道这个数据是给自己的呢?就是根据MAC地址来看,也就是下图的目的地址。
如果目的地址(MAC地址)是自己,那就接收,否则扔掉。
当然,发往本站的帧有三种:
单播帧(一对一)
多播帧(一对多)
广播帧(一对全体)
广播帧使用的特殊地址ff-ff-ff-ff-ff-ff,识别到直接接收。
上面的图就是MAC帧的格式:
6字节的目的地址 + 6字节的源地址 + 2字节类型标识 + 46 ~ 1500字节的数据 + 4字节的FCS。
这里的数据大小最低为46字节,因为要凑齐64字节(最小有效帧)。如果数据量低于46字节,还会在其后添加填充字段来补满。
五、以太网的拓展
常规的以太网结构,是一个集线器连接多台计算机。但如果计算机数量变多,就得用多个集线器分别连接并整合到一起,就是一个中大型的以太网。
缺点很明显展现出来了,其中任意两台计算机通信时,总线占线使得其他计算机无法通信。也就是碰撞域增大了。
所以在数据链路层拓展局域网是使用网桥。
它不同于傻傻的集线器,它具有自学习特性,能识别目标地址在哪片区域,再进行指定转发。
下面通过这个图举个例子(、是两个网桥):
-
A发送了信号给B,信号通过总线传到了。
此时检测到了A发来的信号,在它的小本本上记上“A在我左边”。
然后信号通过,也记上“A在我左边”。
-
然后F发送信号给C,信号通过总线传到了。
此时检测到了F发来的信号,在它的小本本上记上“F在我右边”。
然后信号通过,也记上“F在我右边”。
-
然后B发送信号给A,那么B发出的消息在总线上经过时,就从小本本里一查,诶,A在我左边,那就把这个消息往左边传,就不会继续往右边传递了。