3.1 名词解释
- 链路(link) :一个结点到相邻结点的一段物理链路。
- 数据链路(data link) :把实现控制数据运输的协议的硬件和软件加到链路上就构成了数据链路。
- 循环冗余检验 CRC(Cyclic Redundancy Check) :为了保证数据传输的可靠性,CRC 是数据链路层广泛使用的一种检错技术。
- 帧(frame) :一个数据链路层的传输单元,由一个数据链路层首部和其携带的封包所组成协议数据单元。
- MTU(Maximum Transfer Uint ) :最大传送单元。帧的数据部分的的长度上限。
- 误码率 BER(Bit Error Rate ) :在一段时间内,传输错误的比特占所传输比特总数的比率。
- PPP(Point-to-Point Protocol ) :点对点协议。即用户计算机和 ISP 进行通信时所使用的数据链路层协议。
- MAC 地址(Media Access Control 或者 Medium Access Control) :意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。在 OSI 模型中,第三层网络层负责 IP 地址,第二层数据链路层则负责 MAC 地址。因此一个主机会有一个 MAC 地址,而每个网络位置会有一个专属于它的 IP 地址 。地址是识别某个系统的重要标识符,“名字指出我们所要寻找的资源,地址指出资源所在的地方,路由告诉我们如何到达该处。
- 网桥(bridge) :一种用于数据链路层实现中继,连接两个或多个局域网的网络互连设备。
- 交换机(switch ) :广义的来说,交换机指的是一种通信系统中完成信息交换的设备。这里工作在数据链路层的交换机指的是交换式集线器,其实质是一个多接口的网桥。
- 以太网(Ethernet):数据链路层有很多分类,以太网是其中最著名的一种。以同轴电缆为传输介质的共享介质型连接方式,这也是以太网的第一种方式,叫做
经典以太网。而现在,随着互联设备的处理能力和传输速度的提高,现在都采用终端和交换机之间连接方式,这也是第二种方式,叫做交换式以太网。以太网使用的是CSMA/CD的总线技术。
3.2 数据链路层概述
3.2.1 数据链路层的主要任务
数据链路层在物理层提供的服务的基础上向网络层提供服务,将来自网络层来的数据可靠地传输到相邻节点。
数据链路层考虑的是在同一个局域网内,数据是怎样从一个主机传输到另一个主机,但没有经过路由器转发。
3.2.2 数据链路层的三个基本问题
3.2.2.1 封装成帧
为什么要封装成帧?
为了向网络层提供服务,数据链路层必须使用物理层提供的服务。而物理层是以比特流进行传输的,这种比特流并不保证在数据传输过程中没有错误,接收到的位数量可能少于、等于或者多于发送的位数量。而且它们还可能有不同的值,这时数据链路层为了能实现数据有效的差错控制,就采用了一种“帧”的数据块进行传输。
采用帧传输方式的好处是:在发现有数据传送错误时,只需将有差错的帧再次传送,而不需要将全部数据的比特流进行重传,这就在传送效率上将大大提高。
什么是封装成帧?
就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
帧的数据部分也不是无限长的,会受到最大传输单元(Maximum Transfer Unit、 MTU)的限制。
帧带来的问题
采用“帧”这种格式进行传输,也带来了两个问题:
- 如何分辨帧的开始和结束。
- 在夹杂着重传的数据帧中,接收方在接收到重传的数据帧时是识别成新的数据帧,还是识别成重传帧呢?
解决这两个问题这就要靠数据链路层的各种“帧同步”技术来识别了。“帧同步”技术不仅可以让接收方能从并不是完全有序的比特流中准确地区分出每一帧的开始和结束,同时还可识别重传帧。
3.2.2.2 透明传输
问题:
帧使用首部和尾部进行定界,如果帧的数据部分含有和首部尾部相同的内容,那么帧的开始和结束位置就会被错误的判定。
解决方法:
在数据部分出现首部尾部相同的内容前面插入转义字符。如果数据部分出现转义字符,那么就在转义字符前面再加个转义字符。在接收端进行处理之后可以还原出原始数据。这个过程透明传输的内容是转义字符,用户察觉不到转义字符的存在。

3.2.2.3 差错检测
传输差错
可分为两大类,一类就是最基本的比特差错,另一类就是收到的帧并没有出现比特错误,但却出现了帧丢失、帧重复或帧失序。
- 比特差错:就是比特在传输过程中可能会产生差错,即1可能会变成0,0可能会变成1。
- 帧丢失:传输了[1、2、3]三个帧,却只收到了[1、2]两个帧。
- 帧重复:传输了[1、2、3]三个帧,却收到了[1、2、2、3]四个帧。
- 帧丢失:传输了[1、2、3]三个帧,收到了[3、1、2]三个帧,后发的帧先到了。
误码率(Bit Error Rate、BER)
一段时间内,错误传输的比特数占比特总数的比值。例如,误码率为10^(-10),表示平均没传输10^10个比特会出现一个错误比特。
误码率和信噪比有很大关系,提高信噪比就能降低误码率。
循环冗余检测(Cyclic Redundancy Check、CRC)
在实际的通信链路中,误码率不可能为0。为了保证数据传输的可靠性,在传输时必须采用一定的检测手段,目前在数据链路层广泛使用的就是 CRC。
注:CRC 只能做到没有 比特差错,不能解决另一类问题,因此还不是可靠传输。
事实上,数据链路层协议都不适应确认-重传机制,即不提供可靠服务,原因是这样付出的代价太高,不划算。更合理的操作是交给上层协议(比如运输层 TCP 协议)来完成,实验结果表明这样可以提高效率。
OSI的观点是必须把数据链路层做成是可靠传输的。因此在CRC检测基础上,增加了帧编号、确认和重传机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。 这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。
3.2.3 信道分类
3.2.3.1 广播信道
一对多通信,一个节点发送的数据能够被广播信道上所有的节点接收到。
所有的节点都在同一个广播信道上发送数据,因此需要有专门的控制方法进行协调,避免发生冲突(冲突也叫碰撞)。
主要有两种控制方法进行协调,一个是使用信道复用技术,一是使用 CSMA/CD 协议。信道复用技术在上一节已经介绍了,这里介绍一下CSMA/CD协议。
CSMA/CD协议 (Carrier Sense Multiple Access with Collision Delection、载波监听、多点接入、碰撞检测)
向局域网中所有的主机发送数据(发送的数据是MAC帧),只有当地址是自己的时候,才收下,否则丢弃。
- 载波监听:不管在发送前还是在发送中,每个站都必须不停的检测信道。如果检测到已经有其他站在发送,则自己就暂时不能发送数据,必须要等到信道边为空闲时才能发送数据。在发送中检测信道,是为了及时发现有没有其他站在发送和本站发送的碰撞。
- 多点接入:总线型网,许多计算机以多点接入的方式连接在一根总线上。
- 碰撞检测:在发送中,如果监听到信道已有其它主机正在发送数据,就表示发生了碰撞。虽然每个主机在发送数据之前都已经监听到信道为空闲,但是由于电磁波的传播时延的存在,还是有可能会发生碰撞。
假设端到端的传播时延为 τ,最先发送的站点最多经过 2τ (这一头到另一头的往返时间)就可以知道是否发生了碰撞,称 2τ 为 争用期 。只有经过争用期之后还没有检测到碰撞,才能肯定这次发送不会发生碰撞。
当发生碰撞时,站点要停止发送,等待一段时间再发送。这个时间采用 截断二进制指数退避算法 来确定。从离散的整数集合 {0, 1, .., (2k-1)} 中随机取出一个数,记作 r,然后取 r 倍的争用期作为重传等待时间。
CSMA/CD 协议的要点归纳如下:
- 准备发送:适配器从网络层获得一个分组,加上以太网的首部和尾部,组成以太网帧,放入适配器的缓存中。但在发送之前,必须先检测信道。
- 检测信道:若检测到信道忙,则应不停地检测,一直等待信道转为空闲。若检测到信道空闲,并在96比特时间内信道保持空闲(保证了帧间最小间隔),就发送这个帧。
- 在发送过程中仍不停地检测信道,即网络适配器要边发送边监听。这里只有两种可能性:
- 发送成功:在争用期内一直未检测到碰撞。这个帧肯定能够发送成功。发送完毕后,其他什么也不做。然后回到(1)。
- 发送失败:在争用期内检测到碰撞。这时立即停止发送数据,并按规定发送人为干扰信号。适配器接着就执行指数退避算法,等待r倍512比特时间后,返回到步骤(2),继续检测信道。但若重传达16次仍不能成功,则停止重传而向上报错。
以太网每发送完一帧,一定要把已发送的帧暂时保留一下。如果在争用期内检测出发生了碰撞,那么还要在推迟一段时间后再把这个暂时保留的帧重传一次。
3.2.3.2 点对点信道
一对一通信,不会发生碰撞,因此也比较简单,使用 PPP 协议进行控制。
PPP协议
首部:
字段F:表示一个PPP帧的开始或者结束。其16进制值为 7E。
字段A、C:暂时没有意义。其16进制值为:FF 03。
协议字段:表明信息部分是什么协议的数据报。为0x0021时,信息部分就是IP数据报;为0xC021时,信息部分就是PPP链路控制协议LCP的数据;为0x8021时表示网络层的控制信息。
尾部:
FCS:使用CRC计算得到的校验码。
字段F:表示帧的结束。
注:互联网用户通常需要连接到某个 ISP 之后才能接入到互联网,PPP 协议是用户计算机和 ISP 进行通信时所使用的数据链路层协议。
3.2.4 MAC帧
计算机与外部局域网的连接是通过适配器(也就是常说的“网卡”)进行的。适配器是嵌入到计算机的主板中,计算机的硬件地址,就存适配器的ROM中。
硬件地址,又称为物理地址、MAC地址。固定在适配器中的ROM中的地址,不随着地址的改变而改变。注意和 IP 地址进行区别。每一个适配器都有一个硬件地址,如果一个计算机上有多个适配器,那么这个计算机也就有多个硬件地址。
MAC用在MAC帧中,CSMA/CD协议传输的就是这种帧。常见的MAC帧格式有两种标准,这里介绍使用最多的以太网V2的MAC帧格式。
MAC帧由五个字段组成:
- 目的地址:目标主机的硬件地址。
- 源地址:自己的硬件地址。
- 类型字段:说明上一层使用的是什么协议,这里使用的是 IP 协议,其它协议也可以。
- 数据字段:长度在 46 - 1500 字节之间。 其中46是由帧最小长度64字节 - 首部尾部的18字节得到的。当数据长度小于46字节时,会填充到64字节。其本身的46字节长度的信息存储在上一层的协议中。
- FSC字段:帧检验序列,使用的是CRC。
实际上,在MAC帧传送之前,在帧前面还加了8个字节的信息:7个字节的前同步码,用来进行位同步;1个字节的帧开始定界符,用来告诉接收端适配器准备接收MAC帧。
3.2.5 交换机
扩展以太网常常在数据链路层进行,使用的设备就是交换机。以太网交换机是一种即插即用的设备,其内部有一个帧交换表(地址表),通过自学习算法逐步建立起来的。
举个例子:
最开始,交换机的交换表是空的。
- A向B发送一帧,从接口1进入交换机。交换机拿到帧以后,在交换表中找不到MAC地址为B的项目。交换机就把A的MAC地址和接口1写入交换表,并向除了接口1之外的所有接口进行广播。
- C、D即使收到这个帧,也进行丢弃,因为地址不是自己的。只有拥有正确MAC地址的B才能收下这个帧。
- B向A发送一帧,从接口3进入交换机。交换机拿到帧以后,在交换表中找到MAC地址为A的项目,交换机就通过接口1把这个帧发送给A。在交换表中增加B的MAC地址和接口3的信息。
- 如果后面C、D也发送消息,是同样的道理。交换机这种自学习的方式,让交换机的使用非常方便,不再需要人工配置。
另外,通过交换机也能实现虚拟局域网。
虚拟局域网可以建立与物理位置无关的逻辑组,只有在同一个虚拟局域网中的成员才会收到链路层广播信息。
例如下图中 (A1, A2, A3, A4) 属于一个虚拟局域网,A1 发送的广播会被 A2、A3、A4 收到,而其它站点收不到。
使用 VLAN 干线连接来建立虚拟局域网,每台交换机上的一个特殊接口被设置为干线接口,以互连 VLAN 交换机。IEEE 定义了一种扩展的以太网帧格式 802.1Q,它在标准以太网帧上加进了 4 字节首部 VLAN 标签,用于表示该帧属于哪一个虚拟局域网。
参考
- https://www.cnblogs.com/hansermukk/p/11138558.html
- https://blog.csdn.net/cainv89/article/details/50603646
- https://blog.csdn.net/zhuoya_/article/details/80949279
- https://blog.csdn.net/chengw315/article/details/98758913
- https://snailclimb.gitee.io/javaguide/#/docs/network/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E7%9F%A5%E8%AF%86%E6%80%BB%E7%BB%93
- https://github.com/crisxuan/bestJavaer/blob/master/computer-network/network-datalink.md
- 《计算机网络(第7版)》
