数据链路层概述
数据链路层使用的信道主要分为以下两种:
- 点对点信道,使用一对一的点对点的通信方式
- 广播信道,使用一对多的广播通信方式,广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。
0.1. 数据链路
当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是使用网络适配器来实现这些协议。一般适配器都包括了数据链路层和物理层这两层功能。
网络适配器的功能包括:
- 数据封装 网络适配器的主要功能之一是数据封装。当计算机需要发送数据时,适配器会接收来自高层协议的数据,并在数据前面添加物理层的头部信息,构成完整的数据帧。这个过程称为数据封装。
- 数据编码和解码 适配器还负责将数字数据编码成可在网络介质上传输的形式,如通过调制将数据编码为电子信号。接收数据时,适配器会对接收到的编码过的信号进行解码,恢复出原始数字数据。
- 介质访问控制 当多台设备同时尝试在共享介质(如以太网)上发送数据时,就会出现冲突。适配器利用介质访问控制(MAC)机制来协调设备对网络的访问,避免冲突。常见的MAC机制有CSMA/CD(载波监听多路访问/冲突检测)。PS:现代交换机的出现已经不会出现冲突。
- 地址识别 每个网络适配器都有一个唯一的物理地址(MAC地址),用于在局域网中识别和定位设备。适配器会检查接收到的数据帧的目标MAC地址,只接收发往自己的数据,避免不必要的处理。
- 错误检测和纠正 适配器通常会对接收到的数据进行循环冗余检验(CRC),检测数据在传输过程中是否发生错误。某些适配器还支持纠正少量的比特错误。
0.2. 基本问题
数据链路层使用物理层提供的服务在通信信道上发送和接收比特。数据链路层解决的主要问题包括:
- 封装成帧
- 透明传输
- 差错控制
0.2.1. 封装成帧
封装成帧(帧同步)就是在将网络层的IP数据报的前后分别添加首部和尾部。不同数据链路层协议的帧首部和尾部包含的信息有明确规定,帧的首部和尾部有帧开始符和帧结束符,称之为帧界定符。每一种数据链路层协议都规定了所能够传输的帧的数据部分的上限,即MTU(Maximum Transmission Unit),以太网的MTU为1500字节。
1500字节是考虑到传输效率以及传输时间而折中选择的一个值

0.2.2. 透明传输
透明表示一个实际存在的事物看起来好像不存在一样,该层上传输的数据的内容、格式及编码没有限制,也没有必要解释信息结构的意义。
比如使用SOH(Start Of Header)--0x01和EOT(End Of Transmission)--0x04来表示,这样数据链路层就可以识别出帧的开始和结束。如果数据部分出现SOH或EOT,则采用字节填充的方式,比如在SOH和EOT前面分别插入一个转义字符ESC--0x1B,在接收端的数据链路层将数据交递给网络层之前删除这个插入的转义字符。

0.2.3. 差错控制
现实的通信链路并不是理想的,比特在传输过程中可能会产生差错(1变0,0变1),这就叫做比特差错。为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)的差错检验技术来判定一帧是否在传输过程中发生了错误,一旦发生错误就可以采用反馈重传的方法来纠正。发送数据前先计算帧的数据部分得出FCS添加在数据部分后,接收端收到数据后进行同样的CRC计算与接收到的FCS字段进行比较,判断数据有无差错。
在数据链路层,发送端帧检验序列FCS的生成和接收端的CRC检验都是用硬件完成的,处理很迅速,因此并不会延误数据的传输。
这里需要强调下数据链路层提供的查错控制仅仅是无比特差错,无法处理帧丢失、帧重复、帧失序。
我们知道,过去 OSI 的观点是:必须让数据链路层向上提供可靠传输。因此在CRC检错的基础上,增加了帧编号、确认和重传机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。这种方法在历史士兽经起到很好的作用。但现在的通信线路的质量已经大大提高了,因通信链路质量不好引起差错的概率已经大大降低。因此,现在互联网就采取了区别对待的方法:
- 对于通信质量良好的有线传输链路,数据链路层协议不使用确认和业传机制,即不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出现了差错并且需要进行改正,那么改正差错的任务就由上层协议(例如,运输层的 TCP 协议)来完成。目前数据链路层广泛使用的以太网就不提供可靠性保证。
- 对十通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,数据链路层向上提供可靠传输的服务
0.3. 点到点信道的数据链路
在通信线路质量较差的年代,在数据链路层使用可靠传输协议曾经是一种好办法。因此,能实现可靠传输的高级数据链路控制HDLC (High-level Data Link Control)就成为当时比较流行的数据链路层协议。但现在HDLC已很少使用了。对于点对点的链路,简单得多的点对点协议 PPP (Point-to-Point Protocol)则是目前使用得最广泛的数据链路层协议。IETF 在设计互联网体系结构时把其中最复杂的部分放在 TCP 协议中,而网际协议 IP 则相对比较简单,它提供的是不可靠的数据报服务。在这种情况下,数据链路层没有必要提供比 IP 协议更多的功能。因此,对数据链路层的帧,不需要纠错,不需要序号,也不需要流量控制。IETF 把“简单”作为首要的需求。
点到点信道指的是一条链路上就一个发送端和接收端的信道,通常用在广域网链路。点到点的信道不会发生碰撞,因此比较简单,使用PPP协议控制。

0.3.1. 组成部分
PPP协议主要分成三个部分:
- 高级数据链路控制协议(HDLC):将IP数据报封装到串行链路,支持同步传输和异步传输。因为计算机内的I/O通信是并行的,而链路传输则是按比特流的串行,因此需要协议的封装转换,一般由网络适配器完成。
- 链路控制协议(LCP):建立、配置和测试链路连接,用来协商一些选项。
- 网络控制协议(NCP):用于支持上层的不同的网络协议。
!!! note 同步传输与异步传输
同步传输(Synchronous Transmission)以数据帧为单位传输数据,可采用字符形式或位组合形式的帧同步信号,在短距离的高速传输中,该时钟信号可由专门的时钟线路传输,由发送端或接收端提供专用于同步的时钟信号。计算机网络采用同步传输方式时,常将时钟同步信号(前同步码)植入数据信号帧中,以实现接收端与发送端的时钟同步。异步传输(Asynchronous Transmission)以字符为单位传输数据,发送端和接收端具有相互独立的时钟(频率相差不能太多),并且两者中任一方都不向对方提供时钟同步信号。
0.3.2. 工作过程
- 用户的PC机通过调制解调器呼叫路由器,路由器就能够检测到调制解调器发出的载波信号,在双方建立了物理层的连接之后,PPP协议就进入“链路建立”状态,其目的是建立链路层的LCP连接。
- LCP开始发送配置请求帧,进行协商一些配置选项,包括链路上的最大帧长、所使用的鉴别协议,以及不适用的PPP帧中的地址和控制字段等。LCP的配置请求帧依旧是一个PPP帧,其协议字段置为LCP对应的代码,而信息字段包含特定的配置请求。链路的另一端可以发送以下几种响应中的一种:(一)配置确认帧:所有选项都接受;(二)配置否认帧:所有选项都理解但不能接受;(三)配置拒绝帧:选项有的无法识别或不能接受,需要协商
- 协商结束后双方建立了LCP链路,接着就进入鉴别阶段,在这一状态下,只允许传送LCP协议的分组、鉴别协议的分组以及监测链路质量的分组。若鉴别失败,则转到“链路终止”状态,成功则进入“网络层协议”状态。
- 在“网络层协议”状态,PPP链路两端的网络控制协议NCP根据网络层的不同协议互相交换网络层特定的网络控制分组,总之也许PPP协议两端的网络层可能运行不同的网络层协议,但是都可以使用一个PPP协议进行通信。

0.3.3. PPP协议帧格式
- F:PPP协议帧界定符0x7E
- A:在PPP协议中,因为进行通信的只有两方,因此一方发送的数据总是另一方接收,这一点PPP协议不像以太网协议一样,必须使用MAC地址来表明数据帧的发送者和接收者。PPP协议中的Address字段取值固定为0xff
- C:字段的值为0x03,无实际意义
- 协议:数据中的协议类型,0x0021-IP数据报;0xC021-LCP数据;0x8021-NCP数据等
- FCS: 长度16bit,用于帧校验。一个设备在收到PPP帧后会进行PPP帧校验,如果发现PPP在传输过程中出错,该帧会被立即丢弃。PPP协议没有纠错和重传机制。

为了实现透明传输,还需要对PPP协议进行帧填充,同步传输和异步传输由于机制不同,采用的填充方法也不同。
- 同步传输。数据以帧为单位,PPP协议采用零比特填充。PPP协议的帧界定符0x7E对应的二进制为01111110,即有6个连续的1。为了避免在数据字段出现帧界定符,因此在每当发送方的数据链路层在数据中遇到连续的5个1,便自动在插入一个比特0,接收方将5个连续1后面的0自动去除。
011011111111111010转换为01101111101111101010->还原为011011111111111010 - 异步传输:数据传输以字节为单位,使用0x7D作为PPP帧的转义符,并使用字节填充。把信息字段中出现的每一个0x7E字节转变成为2字节序列(0x7D,0x5E),每一个0x7D的字节(即出现了和转义字符一样的比特组合),则把0x7D转变成为2字节序列(0x7D,0x5D)。
ppp协议本身无法直接跨交换机或路由器通信,ppp协议设计上为点对点链路层协议。可以通过PPPoE协议在以太网上传输。
0.4. 广播信道
广播信道是指一对多通信,一个节点发送的数据能够被广播信道上所有的节点接收到。所有的节点都在同一个广播信道上发送数据,因此需要有专门的控制方法进行协调,避免发生冲突(冲突也叫碰撞)。主要有两种控制方法进行协调,一个是使用信道复用技术,一是使用 CSMA/CD 协议。现在以太网已经成为了事实的局域网标准,采用CSMA/CD协议。
CSMA/CD(Carrier Sense Multiple Access/Collision Detection,载波多重访问/碰撞检测)工作原理:
- 【开始】如果线路空闲,则启动传输,否则跳转到第4步。
- 【发送】如果检测到冲突,继续发送数据直到达到最小回报时间(min echo receive interval)以确保所有其他转发器和终端检测到冲突,而后跳转到第4步。
- 【成功传输】向更高层的网络协议报告发送成功,退出传输模式。
- 【线路繁忙】持续等待直到线路空闲。
- 【线路空闲】在尚未达到最大尝试次数之前,每隔一段随机时间转到第1步重新尝试。
- 【超过最大尝试传输次数】向更高层的网络协议报告发送失败,退出传输模式。
!!! note 以太网为什么不采用信道复用
主要还是为了降低成本。通常局域网的物理层的传输主要是基于基带传输,CSMA/CD其实可以某种程度上认为是时分复用的技术,而频分复用则需要考虑频谱带宽问题,需要用到调制解调器。如今的以太网其实已经不怎么需要CSMA/CD协议了,交换机的出现取代了集线器。集线器中每一个端口都在同一个冲突域,所有数据包都跑在一条物理链路上,因此需要CSMA/CD协调,而交换机可以隔离冲突域(路由器可以隔离广播域),每一个端口都是独立的冲突域,现在的交换机都采用双绞线作为媒介,发送信道和接收信道独立,工作在全双工模式下,因此不会出现冲突。
0.5. MAC子层和LLC子层
由于广域网采用点对点通信方式,不存在介质冲突问题,而局域网是共享介质的,因此局域网内的数据链路层需要分为MAC(Media Access Control,媒体访问控制)子层和LLC(Logic Link Control,逻辑链路控制)子层。其中MAC子层的一项重要功能就是仲裁介质的使用权(CSMA/CD)。
0.5.1. MAC子层
MAC子层是局域网中数据链路层的下层部分,主要功能有:
- 提供定址及媒体访问的控制方式,使得不同设备或网络上的节点可以在多点的网络上通信,而不会互相冲突
- 数据帧的封装/解封装,帧的寻址和识别,帧的接收与发送,链路的管理,帧的差错控制等。MAC子层的存在屏蔽了不同物理链路种类的差异性。MAC子层作为LLC子层及物理层之间沟通的介质,提供了一种寻址的方法,即MAC地址。MAC地址是唯一的,每个网络适配器的MAC地址都不一样,因此可以在同一子网中发送数据包到特定的目的设备。
!!! note MAC地址
Mac地址是数据链路层地址,长度为6字节(48)位,用于唯一标识网络适配器。一台主机拥有多少个网络适配器就有多少个Mac地址。Mac地址通常使用6组,每组2位16进制数表示,每组之间冒号隔开。如82:17:0d:2d:9d:00
MAC帧格式

我们发现MAC帧没有帧开始界定符,那么我们如何区分不同帧呢。其实以太网发送的数据使用了物理层编码违禁法,利用曼彻斯特编码(从高到低跳变表示“1”,从低到高跳变表示“0”),每个码元正中间一定有一次电压转换,当发送方把一个以太网帧发送完毕后,就不在发送其他码元了,因此发送方网络适配器的接口上的电压也就不再变换了。这样接收方就可以知道以太网帧的结束位置了。
0.5.2. LLC子层
逻辑链路控制子层是局域网中数据链路层的上层部分,用户的数据链路服务通过LLC子层为网络层提供统一的接口。该子层通过在IP包上加了8位的源服务存取点和目的服务存取点(用于标识以太网帧所携带的上层数据类型)来保证在不同网络类型中传输。另外,有一个8或16位的控制字段用于像流控制的辅助功能。
LLC子层提供了两种无连接和一种面向连接的操作方式:
- 无回复的无连接方式:它允许发送帧时:给单一的目的地址(单点传输)、给相同网络中的多个目的地址(多点传输)、给网络中的所有地址(广播传输)。多点和广播传输在同一信息需要发送到整个网络的情况下可以减少网络流量。单点传输不能保证接收端收到帧的次序和发送时的次序相同。发送端甚至无法确定接收端是否收到了帧。
- 面向连接的操作方式。给每个帧进行编号,接收端就能保证它们按发送的次序接收,并且没有帧丢失。利用滑动窗口控制协议可以让快的发送端也能流到慢的接收端。
- 有回复的无连接方式。它仅限于点到点通信。