前言
数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务,数据链路层是对物理层传输原始比特流的功能的加强,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一无差错的线路。为达到这一目的,数据链路必须具备一系列相应的功能。本文就数据链路层具有的功能进行相关介绍。
一、 数据链路的概念以及相关基础知识
上图为两台主机通过互联网进行通信时数据链路层所处的地位。
本文只关心在协议栈中水平防线的各数据链路层。当H1向H2发送数据时,我们可以想象数据就是在数据链路层从左向右水平传送的。于是在数据链路层的层面上,有如下链路:H1链路层→R1链路层→R2链路层→R3链路层→H2链路层
由此,我们引出了一些基本概念:
链路(link):一条无源的物理线路段,中间没有其他的交换结点。一条链路只是一条通路的一个组成部分。
数据链路(date link):除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
现如今,最常用的方法就是使用网络适配器(网卡)来实现这些要求,一般网卡包含了数据链路层和物理层两层的功能。
数据在信道中传输,其在数据链路层中的数据单元叫做帧。
数据链路层把网络层交下来的数据封装成帧发送到链路上,并将收到的帧中的数据取出,交给上层的网络层。
若是只考虑点对点信道的数据链路层协议,我们可以简单的采用下图所示的模型:
点对点信道的数据链路层在进行通信时主要步骤如下:
(1)信源的数据链路层将网络层交下来的IP数据报添加首部和尾部封装成帧。
(2)信源把封装好的帧发送给信宿的数据链路层
(3)若信宿的数据链路层接收到的帧无差错,则将收到的帧取出首部和尾部,还原为IP数据报,交给网络层;若帧存在错误,则丢弃。
二、帧传输的三大问题
数据链路层协议有许多中,但有三个基本问题是共同的,分别为封装成帧、透明传输、差错检验。
1、 封装成帧
封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,这样就构成了帧。接收端在收到物理层上交的比特流后,可以根据首部、尾部的标记,从收到的比特流中识别帧的开始和结束。首部和尾部一个重要的作用就是帧定界,此外,首部和尾部还有许多必要的控制信息。在发送帧时,是从帧的首部开始发送的。各数据链路层对帧首部和帧尾部的格式有明确的规定。为提高帧的传输效率,应当使帧的数据部分长度尽可能大于首部和尾部的长度。当然,数据部分也不能过于庞大,对此,各数据链路层规定了所能传送的帧的数据部分长度上限——最大传输单元MTU(Maximum Transfer Unit)。
封装成帧示意图:
当数据是由可打印的ASCII码组成的文本文件时,帧定界符可以使用特殊的帧定界符。
注:ASCII码是7位编码,一共可组成128个不同的ASCII吗,其中可打印的95个,不可打印的控制字符33个。将控制字符SOH(start of header)放在帧的最前面表示帧的开始;将EOT(end of transmission)放在帧的末尾表示帧的结束。这里SOH和EOT都是控制字符的名称,它们的十六进制编码为01 、04。
在传输过程中出现差错时,帧定界符的作用更加明显。假如发送端在尚未发送完一个帧时出现故障,中断了发送。由于使用了帧定界符,接收端检测不到EOT故判定为不完整的帧,从而丢弃。
2、 透明传输
定义:指不管所传数据是什么样的比特组合,都应当能够在链路上传送。当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使接收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。
解决方法:字节填充(byte stuffing)或字符填充(character stuffing)
发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入转义字符“ESC”,接收端的数据链路层在将数据发往网络层之前删除这个转义字符。如果转义字符也出现在数据中,那么将在转义字符前再插入一个转义字符。
3、 差错检测
现实应用中,数据在传输过程中可能产生错误,比如“1”可能变为“0”等,这种差错叫做比特差错。一段时间内,传输错误的比特占所传输比特综述的比率称为误码率BER(bit error rate)。为了保证数据传输可靠性,在传输数据时必须采用各种各样的差错检测措施,目前数据链路层广泛使用的是循环冗余校验CRC(cyclic redundancy check)。
下面我们通过一个简单的例子来说明循环冗余校验的原理。
在发送端,先把数据划分为组。假定每组 k 个比特。
假设待传送的一组数据 M = 101001(现在 k = 6)。我们在 M 的后面再添加供差错检测用的 n 位冗余码一起发送。
用二进制的模 2 运算进行 2n 乘 M 的运算,这相当于在 M 后面添加 n 个 0。
得到的 (k + n) 位的数除以事先选定好的长度为 (n + 1) 位的除数 P,得出商是 Q 而余数是 R,余数 R 比除数 P 少 1 位,即 R 是 n 位。
将余数 R 作为冗余码拼接在数据 M 后面发送出去。
例:现在 k = 6, M = 101001。
设 n = 3, 除数 P = 1101,
被除数是 2nM = 101001000。
模 2 运算的结果是:商 Q = 110101,余数 R = 001。
把余数 R 作为冗余码添加在数据 M 的后面发送出去。发送的数据是:2nM + R 。即:101001001,共 (k + n) 位。
接收端把接收到的数据以帧为单位进行CRC检验:把收到的每个帧都除以同样的除数P(模二运算),然后检查得到的余数R。
余数R存在的可能性:
若得出的余数 R = 0,则判定这个帧没有差错,就接受。
若余数 R≠0,则判定这个帧有差错,就丢弃。
注:数据链路层若仅使用CRC技术,则只能做到对帧的无差错接收,因为CRC只具有检错能力,不具备纠错能力。
三、点对点协议PPP
在通信线路质量较差的年代,在数据链路层使用可靠传输协议曾是一种好办法。对于点对点的链路,目前使用最广泛的是协议是PPP(point-to-point protocol)。互联网用户通常需要连接到某个ISP才能接入到互联网,PPP协议就是用户与ISP进行通信时所使用的的数据链路层协议。
当然,PPP协议不提供使用序号和确认的可靠传输
在数据链路层出现差错的概率不大时,使用比较简单的 PPP 协议较为合理。
在因特网环境下,PPP 的信息字段放入的数据是 IP 数据报。数据链路层的可靠传输并不能够保证网络层的传输也是可靠的。
帧检验序列 FCS 字段可保证无差错接受。
PPP协议有三个组成部分:
(1) 一个将 IP 数据报封装到串行链路的方法。
(2) 用来建立、配置和测试数据链路连接的链路控制协议 LCP (Link Control Protocol)。
(3) 网络控制协议 NCP (Network Control Protocol)。
PPP协议的帧格式
PPP首部的第四个字段是2字节的协议字段。
当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。
当协议字段为0xC021时,PPP帧的信息字段是PPP链路控制协议的LCP数据。
当协议字段为0x8021时,PPP帧的信息字段为网络层的控制数据。
PPP协议的透明传输
当信息字段中出现和标志字段一样的比特组合(0x7E)时,就必须采取一些措施:
当 PPP 用在同步传输链路时,协议规定采用硬件来完成比特填充(和 HDLC 的做法一样)。
当 PPP 用在异步传输时,就使用一种特殊的字符填充法。
字符填充
将信息字段中出现的每一个 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链路的起始和终止状态一定是链路静止(link dead)。这时用户个人电脑和ISP的路由器之间并不存在物理层的连接。
当用户个人电脑通过调制解调器呼叫路由器时,路由器能够检测到调制解调器发出的载波信号。在双方建立了物理层连接后,PPP就进入链路建立(link establish)的状态,其目的是建立链路层的LCP连接。
建立起LCP连接后即开始发送LCP的配置请求帧(configure-request)。这是PPP帧,其协议字段置为LCP对应的代码,而信息字段包含特定的配置请求。
链路的另一端可以发送以下几种响应中的一种:
配置确认帧(configure-ack):所有选项都接受
配置否认帧(configure-nak):所有选项都理解但不能接受
配置拒绝帧(configure-reject):选项中部分无法识别或不能接受,需要协商
PPPoE
PPPoE (PPP over Ethernet) 的意思是“在以太网上运行 PPP”,它把 PPP 协议与以太网协议结合起来 —— 将 PPP 帧再封装到以太网中来传输。
现在的光纤宽带接入 FTTx 都要使用 PPPoE 的方式进行接入。在 PPPoE 弹出的窗口中键入在网络运营商购买的用户名和密码,就可以进行宽带上网了。
利用 ADSL 进行宽带上网时,从用户个人电脑到家中的 ADSL 调制解调器之间,也是使用 RJ-45 和 5 类线(即以太网使用的网线)进行连接的,并且也是使用 PPPoE 弹出的窗口进行拨号连接的。
使用广播信道的数据链路层
广播信道可以进行一对多的通信。局域网就是使用的广播信道。局域网最主要的优点是:
具有广播功能,从一个站点可以很方便的访问全网。局域网上的主机可共享连接在局域网上的各种硬件和软件资源。
便于系统的扩展和逐渐演变,各设备的位置可灵活调整和改变。
提高了系统的可靠性、可用性和生存性。
局域网可以使用多种传输媒体,其中双绞线最便宜。当然,局域网的工作层次跨越了数据链路层和物理层。因为局域网内的设备都是共用一个信道,共享信道要着重考虑的问题就是如何使众多的用户能够合理而方便的共享通新媒体资源。在技术上有两种方法来解决:
静态划分信道:如在物理层中曾提到的频分复用等技术,用户只要分配到了信道就不会和其他用户产生冲突。但这种划分信道的代价较高,不适合局域网使用。
动态媒体接入控制:又称为多点接入,可分为随机接入和受控接入两类。随机接入的特点是所有的用户可以随机的发送信息。但如果恰巧有两个或更多的用户在同一时刻都发送信息,那么共享媒体上就要产生碰撞(冲突),使得所有的用户发送都失败。受控接入的特点是用户不能随机的发送信息,用户必须服从一定的控制。典型的代表有令牌环网和集中控制的多点线路的轮询。
IEEE 802委员会把局域网的数据链路层拆分成两个子层,即逻辑链路控制LLC(logical link control)和媒体接入控制MAC(medium access control)。与接入到传输媒体有关的内容都放在MAC子层,不管采用何种传输媒体,对于LLC子层来说都是透明的。
现在我们先从一般的概念上讨论计算机是如何接入到局域网上的。
计算机与局域网的连接是通过适配器进行的,适配器又叫网络接口卡NIC(network interface card)。适配器和局域网之间通过电缆或双绞线以串行传输的方式进行通信。当然对于现在的计算机,主板上已经嵌入了这种适配器,不再单独使用网卡了。
适配器的重要功能:
1.进行串行/并行转换。
2.对数据进行缓存。
3.在计算机的操作系统安装设备驱动程序。
4.实现以太网协议。
四、CSMA/CD协议
CSMA/CD 含义:载波监听多点接入 / 碰撞检测 (Carrier Sense Multiple Access with Collision Detection) 。
最早的以太网是将许多计算机连接到总线上,但总线是以广播通信方式。为实现一对一的通信,可以使每台计算机的适配器拥有一个与其他适配器都不同的地址。在发送数据帧时,帧的首部写明接收站的地址,这样可以实现一对一的通信。
下面介绍几个基本概念:
“多点接入”表示许多计算机以多点接入的方式连接在一根总线上。
“载波监听”是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。
总线上并没有什么“载波”。因此, “载波监听”就是用电子技术检测总线上有没有其他计算机发送的数据信号。
碰撞检测
由于电磁波在总线上的传播速率是有限的,当某个站监听到总线是空闲时,也可能总线并非真正是空闲的。
A 向 B 发出的信息,要经过一定的时间后才能传送到 B。
B 若在 A 发送的信息到达 B 之前发送自己的帧 (因为这时 B 的载波监听检测不到 A 所发送的信息),则必然要在某个时间和 A 发送的帧发生碰撞。
碰撞的结果是两个帧都变得无用。
所以需要在发送期间进行碰撞检测,以检测冲突。
“碰撞检测”就是计算机边发送数据边检测信道上的信号电压大小。
当几个站同时在总线上发送数据时,总线上的信号电压摆动值将会增大(互相叠加)。
当一个站检测到的信号电压摆动值超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。
所谓“碰撞”就是发生了冲突。因此“碰撞检测”也称为“冲突检测”
每一个正在发送数据的站,一旦发现总线上出现了碰撞,就要立即停止发送,免得继续浪费网络资源,然后等待一段随机时间后再次发送
使用 CSMA/CD 协议的以太网不能进行全双工通信而只能进行双向交替通信(半双工通信),因为了碰撞了帧就无效了。
当发送数据的站一旦发现发生了碰撞时:
(1) 立即停止发送数据;
(2) 再继续发送若干比特的人为干扰信号 (jamming signal),以便让所有用户都知道现在已经发生了碰撞。
工作过程:
(1) 准备发送。但在发送之前,必须先检测信道。
(2) 检测信道。若检测到信道忙,则应不停地检测,一直等待信道转为空闲。若检测到信道空闲,并在 96 比特时间内信道保持空闲(保证了帧间最小间隔),就发送这个帧。
(3) 检查碰撞。在发送过程中仍不停地检测信道,即网络适配器要边发送边监听。
这里只有两种可能性:
①发送成功:在争用期内一直未检测到碰撞。这个帧肯定能够发送成功。发送完毕后,其他什么也不做。然后回到 (1)。
②发送失败:在争用期内检测到碰撞。这时立即停止发送数据,并按规定发送人为干扰信号。适配器接着就执行指数退避算法,等待 r 倍 512 比特时间后,返回到步骤 (2),继续检测信道。但若重传达 16 次仍不能成功,则停止重传而向上报错。
五、局域网中的集线器与交换机
集线器
传统以太网最初使用的是粗同轴电缆,后来演进到使用比较便宜的细同轴电缆,最后发展为使用更便宜更灵活的双绞线。这种以太网采用星型拓扑,并在拓扑的中心使用了可靠性非常高的集线器。
需要说明的几点:
集线器是使用电子器件来模拟实际电缆线的工作,因此整个系统仍然像一个传统的以太网那样运行。
使用集线器的以太网在逻辑上仍是一个总线网,各工作站使用的还是 CSMA/CD 协议,并共享逻辑上的总线。
集线器很像一个多接口的转发器,工作在物理层,它的每个接口只是简单地转发比特,不进行碰撞检测。
集线器采用了专门的芯片,进行自适应串音回波抵消,减少了近端串音。
交换机
使用多个集线器可连成更大的、多级星形结构的以太网。
优点:
使原来属于不同碰撞域的以太网上的计算机能够进行跨碰撞域的通信。
扩大了以太网覆盖的地理范围。
缺点:
碰撞域增大了,但总的吞吐量并未提高。
如果不同的碰撞域使用不同的数据率,那么就不能用集线器将它们互连起来。
扩展以太网更常用的方法是在数据链路层进行。
早期使用网桥,现在使用以太网交换机
当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧的目的 MAC 地址,然后再确定将该帧转发到哪一个接口,或把它丢弃。
交换机特点:
以太网交换机实质上就是一个多接口的网桥,通常都有十几个或更多的接口。
每个接口都直接与一个单台主机或另一个以太网交换机相连,并且一般都工作在全双工方式。
以太网交换机具有并行性。能同时连通多对接口,使多对主机能同时通信。
相互通信的主机都是独占传输媒体,无碰撞地传输数据。
以太网交换机是一种即插即用设备,其内部的帧交换表(又称为地址表)是通过自学习算法自动地逐渐建立起来的。转发速率要比使用软件转发的网桥快很多。
六、以太网的MAC层
MAC层的硬件地址
在局域网中,硬件地址又称为物理地址,或 MAC 地址。
MAC地址组成:
IEEE 802 标准规定 MAC 地址字段可采用 6 字节 ( 48位) 或 2 字节 ( 16 位) 这两种中的一种。
IEEE 的注册管理机构 RA 负责向厂家分配地址字段 6 个字节中的前三个字节 (即高位 24 位),称为组织唯一标识符。
地址字段 6 个字节中的后三个字节 (即低位 24 位) 由厂家自行指派,称为扩展唯一标识符,必须保证生产出的适配器没有重复地址。
生产适配器时,6 字节的 MAC 地址已被固化在适配器的 ROM,因此,MAC 地址也叫做硬件地址 (hardware address)或物理地址。
“MAC地址”实际上就是适配器地址或适配器标识符 EUI-48。
我们知道适配器有过滤功能。当适配器从网络每收到一个MAC帧就先用硬件检查MAC帧中的目的地址。如果是发往本站的则收下,然后再进行其他处理。若不是发往本站的,则将此MAC帧丢弃。这样不会浪费主机处理器和内存资源。
“发往本站”包括以下三种帧:
单播帧(一对一):即收到的帧的MAC地址与本站的硬件地址相同。
广播帧(一对全体):即发送给本局域网上所有站点的帧(全1地址)。
多播帧(一对多):即发送给本局域网上一部分站点的帧。
所有的适配器都至少能够识别前两种帧,即能够识别单播地址和广播地址。
以混杂方式 (promiscuous mode) 工作的以太网适配器只要“听到”有帧在以太网上传输就都接收下来。
MAC帧的格式
常用的以太网 MAC 帧格式有两种标准 :
DIX Ethernet V2 标准(最常用)
IEEE 的 802.3 标准
MAC帧结构示意图:
无效的MAC帧
数据字段的长度与长度字段的值不一致;
帧的长度不是整数个字节;
用收到的帧检验序列 FCS 查出有差错;
数据字段的长度不在 46 ~ 1500 字节之间。
有效的 MAC 帧长度为 64 ~ 1518 字节之间。
无效的帧会被直接丢弃掉,以太网不负责重传丢弃的帧。