tags: 计算机网络, title: 计算机网络第三篇【数据链路层】
数据链路的概念以及相关基础知识
数据链路层使用的信道主要有以下两种类型:
- 点对点信道。这种信道使用一对一的点对点通信方式。
- 广播信道。这种信道使用一对多的广播通信方式,因此过程比较复杂。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。
数据链路层只关注数据在链路层流通的情况:
数据链路和帧
数据链路 (data link) 除了物理线路外,还必须有通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
- 现在最常用的方法是使用适配器(即网卡)来实现这些协议的硬件和软件。
- 一般的适配器都包括了数据链路层和物理层这两层的功能。
也有人采用另外的术语。这就是把链路分为物理链路和逻辑链路。
- 物理链路就是上面所说的链路。
- 逻辑链路就是上面的数据链路,是物理链路加上必要的通信协议。
数据链路层传送的是帧
数据链路层不必考虑物理层如何实现比特传输的细节。甚至还可以更简单地设想好像是沿着两个数据链路层之间的水平方向把帧直接发送到对方。
数据链路层的三个基本问题
- 封装成帧
- 透明传输
- 差错控制
封装成帧
封装成帧 (framing) 就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧
首部和尾部的一个重要作用就是进行帧定界。
对于定界而言,我们可以使用控制字符进行帧定界
当数据是由可打印的 ASCII 码组成的文本文件时,帧定界可以使用特殊的帧定界符。
例子:
控制字符 SOH (Start Of Header) 放在一帧的最前面,表示帧的首部开始。另一个控制字符 EOT (End Of Transmission) 表示帧的结束。
透明传输
当然了,我们有可能会想到当我们的首部和尾部在数据中就已经出现的时候,那么我们的帧怎么定界呢???
解决方法:字节填充 (byte stuffing) 或字符填充 (character stuffing)。
- 发送端的数据链路层在数据中出现控制字符**“SOH”或“EOT”的前面插入一个转义字符“ESC” (其十六进制编码是 1B)。**
- 接收端的数据链路层在将数据送往网络层之前删除插入的转义字符。
- 如果转义字符也出现在数据当中,那么应在转义字符前面插入一个转义字符 ESC。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
差错检测
在传输过程中可能会产生比特差错:1 可能会变成 0 而 0 也可能变成 1。在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率 BER (Bit Error Rate)
- 误码率与信噪比有很大的关系
- 为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
循环冗余检验
在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC 的检错技术。
- 在发送端,先把数据划分为组。假定每组 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 检验
- (1) 若得出的余数 R = 0,则判定这个帧没有差错,就接受 (accept)。
- (2) 若余数 R 0,则判定这个帧有差错,就丢弃。
但这种检测方法并不能确定究竟是哪一个或哪几个比特出现了差错。
只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的差错的概率就很小很小。
帧检验序列 FCS
在数据后面添加上的冗余码称为帧检验序列 FCS (Frame Check Sequence)。
循环冗余检验 CRC 和帧检验序列 FCS 并不等同。
- CRC 是一种常用的检错方法,而 FCS 是添加在数据后面的冗余码。
- **FCS 可以用 CRC 这种方法得出,但 CRC 并非用来获得 FCS 的唯一方法。 **
差错检测只是保证在传输过程中帧无差错
仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受 (accept)。
“无差错接受”是指:“凡是接受的帧(即不包括丢弃的帧),我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错”
在数据链路层使用 CRC 检验,能够实现无比特差错的传输,但这还不是可靠传输。
要做到“可靠传输”(即发送什么就收到什么)就必须再加上确认和重传机制。
PPP协议
上面也已经说了,数据链路使用的信道主要有以下两种类型,一种是广播,一种就是点对点。
对于点对点的链路,目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。
用户使用拨号电话线接入互联网时, 用户计算机和 ISP 进行通信时所使用的数据链路层协议就是 PPP 协议。
PPP 协议有三个组成部分:
- (1) 一个将 IP 数据报封装到串行链路的方法。
- (2) 链路控制协议 LCP (Link Control Protocol)。
- (3) 网络控制协议 NCP (Network Control Protocol)。
PPP协议帧的格式
PPP 帧的首部和尾部分别为 4 个字段和 2 个字段。 标志字段 F = 0x7E (符号“0x”表示后面的字符是用十六进制表示。十六进制的 7E 的二进制表示是 01111110)。 地址字段 A 只置为 0xFF。地址字段实际上并不起作用。 控制字段 C 通常置为 0x03。 PPP 是面向字节的,所有的 PPP 帧的长度都是整数字节。
PPP协议透明传输的问题
与上面在信道传输的数据一样、PPP协议也是要解决透明传输的问题,来确保我们的帧的定界。
- 当 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 协议较为合理。
- 在因特网环境下,PPP 的信息字段放入的数据是 IP 数据报。数据链路层的可靠传输并不能够保证网络层的传输也是可靠的。
- 帧检验序列 FCS 字段可保证无差错接受。
PPP工作状态
- 当用户拨号接入 ISP 时,路由器的调制解调器对拨号做出确认,并建立一条物理连接。
- PC 机向路由器发送一系列的 LCP 分组(封装成多个 PPP 帧)。
- 这些分组及其响应选择一些 PPP 参数,并进行网络层配置,NCP 给新接入的 PC 机分配一个临时的 IP 地址,使 PC 机成为因特网上的一个主机。
- 通信完毕时,NCP 释放网络层连接,收回原来分配出去的 IP 地址。接着,LCP 释放数据链路层连接。最后释放的是物理层的连接。
可见,PPP 协议已不是纯粹的数据链路层的协议,它还包含了物理层和网络层的内容。
适配器(网卡)作用
网络接口板又称为通信适配器 (adapter) 或网络接口卡 NIC (Network Interface Card),或“网卡”。
适配器的重要功能:
- 进行串行/并行转换。
- 对数据进行缓存。
- 在计算机的操作系统安装设备驱动程序。
- 实现以太网协议。
局域网拓扑结构
CSMA/CD协议
CSMA/CD 含义:载波监听多点接入 / 碰撞检测 (Carrier Sense Multiple Access with Collision Detection) 。
- “多点接入”表示许多计算机以多点接入的方式连接在一根总线上。
- “载波监听”是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。
- 总线上并没有什么“载波”。因此, “载波监听”就是用电子技术检测总线上有没有其他计算机发送的数据信号。
- 总线上的每一个工作的计算机都能检测到 B 发送的数据信号。
- 由于只有计算机 D 的地址与数据帧首部写入的地址一致,因此只有 D 才接收这个数据帧。
- 其他所有的计算机(A, C 和 E)都检测到不是发送给它们的数据帧,因此就丢弃这个数据帧而不能够收下来。
- 在具有广播特性的总线上实现了一对一的通信。
碰撞检测
由于电磁波在总线上的传播速率是有限的,当某个站监听到总线是空闲时,也可能总线并非真正是空闲的。
- A 向 B 发出的信息,要经过一定的时间后才能传送到 B。
- B 若在 A 发送的信息到达 B 之前发送自己的帧 (因为这时 B 的载波监听检测不到 A 所发送的信息),则必然要在某个时间和 A 发送的帧发生碰撞。
- 碰撞的结果是两个帧都变得无用。
所以需要在发送期间进行碰撞检测,以检测冲突。
“碰撞检测”就是计算机边发送数据边检测信道上的信号电压大小。
当几个站同时在总线上发送数据时,总线上的信号电压摆动值将会增大(互相叠加)。 当一个站检测到的信号电压摆动值超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。 所谓“碰撞”就是发生了冲突。因此“碰撞检测”也称为“冲突检测”
每一个正在发送数据的站,一旦发现总线上出现了碰撞,就要立即停止发送,免得继续浪费网络资源,然后等待一段随机时间后再次发送
使用 CSMA/CD 协议的以太网不能进行全双工通信而只能进行双向交替通信(半双工通信),因为了碰撞了帧就无效了。
当发送数据的站一旦发现发生了碰撞时:
- (1) 立即停止发送数据;
- (2) 再继续发送若干比特的人为干扰信号 (jamming signal),以便让所有用户都知道现在已经发生了碰撞。
工作过程:
- (1) 准备发送。但在发送之前,必须先检测信道。
- (2) 检测信道。若检测到信道忙,则应不停地检测,一直等待信道转为空闲。若检测到信道空闲,并在 96 比特时间内信道保持空闲(保证了帧间最小间隔),就发送这个帧。
- (3) 检查碰撞。在发送过程中仍不停地检测信道,即网络适配器要边发送边监听。这里只有两种可能性:
- ①发送成功:在争用期内一直未检测到碰撞。这个帧肯定能够发送成功。发送完毕后,其他什么也不做。然后回到 (1)。
- ②发送失败:在争用期内检测到碰撞。这时立即停止发送数据,并按规定发送人为干扰信号。适配器接着就执行指数退避算法,等待 r 倍 512 比特时间后,返回到步骤 (2),继续检测信道。但若重传达 16 次仍不能成功,则停止重传而向上报错。
集线器与交换机
集线器
采用双绞线的以太网采用星形拓扑,在星形的中心则增加了一种可靠性非常高的设备,叫做集线器 (hub)。
- 集线器是使用电子器件来模拟实际电缆线的工作,因此整个系统仍然像一个传统的以太网那样运行。
- 使用集线器的以太网在逻辑上仍是一个总线网,各工作站使用的还是 CSMA/CD 协议,并共享逻辑上的总线。
- 集线器很像一个多接口的转发器,工作在物理层。
- 集线器采用了专门的芯片,进行自适应串音回波抵消,减少了近端串音。
交换机
使用多个集线器可连成更大的、多级星形结构的以太网。
优点
- 使原来属于不同碰撞域的以太网上的计算机能够进行跨碰撞域的通信。
- 扩大了以太网覆盖的地理范围。
缺点
- 碰撞域增大了,但总的吞吐量并未提高。
- 如果不同的碰撞域使用不同的数据率,那么就不能用集线器将它们互连起来。
扩展以太网更常用的方法是在数据链路层进行。
- 早期使用网桥,现在使用以太网交换机
- 当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧的目的 MAC 地址,然后再确定将该帧转发到哪一个接口,或把它丢弃。
交换机特点:
- 以太网交换机实质上就是一个多接口的网桥。
- 通常都有十几个或更多的接口。
- 每个接口都直接与一个单台主机或另一个以太网交换机相连,并且一般都工作在全双工方式。
- 以太网交换机具有并行性。
- 能同时连通多对接口,使多对主机能同时通信。
- 相互通信的主机都是独占传输媒体,无碰撞地传输数据。
- 以太网交换机是一种即插即用设备,其内部的帧交换表(又称为地址表)是通过自学习算法自动地逐渐建立起来的。
- 转发速率要比使用软件转发的网桥快很多。
交换机的交换方式
存储转发方式
- 把整个数据帧先缓存后再进行处理。
直通 (cut-through) 方式
- 接收数据帧的同时就立即按数据帧的目的 MAC 地址决定该帧的转发接口,因而提高了帧的转发速度。
- 缺点是它不检查差错就直接将帧转发出去,因此有可能也将一些无效帧转发给其他的站。
以太网交换机运行自学习算法自动维护交换表
具体过程:
A 先向 B 发送一帧,从接口 1 进入到交换机。 交换机收到帧后,先查找交换表,没有查到应从哪个接口转发这个帧。 交换机把这个帧的源地址 A 和接口 1 写入交换表中,并向除接口1以外的所有的接口广播这个帧。 C 和 D 将丢弃这个帧,因为目的地址不对。只 B 才收下这个目的地址正确的帧。这也称为过滤。 从新写入交换表的项目 (A, 1) 可以看出,以后不管从哪一个接口收到帧,只要其目的地址是A,就应当把收到的帧从接口1转发出去。 B 通过接口 3 向 A 发送一帧。 交换机查找交换表,发现交换表中的 MAC 地址有 A。表明要发送给A的帧(即目的地址为 A 的帧)应从接口1转发。于是就把这个帧传送到接口 1 转发给 A。显然,现在已经没有必要再广播收到的帧。 交换表这时新增加的项目 (B, 3),表明今后如有发送给 B 的帧,就应当从接口 3 转发出去。 经过一段时间后,只要主机 C 和 D 也向其他主机发送帧,以太网交换机中的交换表就会把转发到 C 或 D 应当经过的接口号(2 或 4)写入到交换表中。
归纳:
- 交换机收到一帧后先进行自学习。查找交换表中与收到帧的源地址有无相匹配的项目。
- 如没有,就在交换表中增加一个项目(源地址、进入的接口和有效时间)。
- 如有,则把原有的项目进行更新(进入的接口或有效时间)。
- 转发帧。查找交换表中与收到帧的目的地址有无相匹配的项目。
- 如没有,则向所有其他接口(进入的接口除外)转发。
- 如有,则按交换表中给出的接口进行转发。
- 若交换表中给出的接口就是该帧进入交换机的接口,则应丢弃这个帧(因为这时不需要经过交换机进行转发)。
以太网交换机的这种自学习方法使得以太网交换机能够即插即用,不必人工进行配置,因此非常方便。
PPPoE是什么意思
- PPPoE (PPP over Ethernet) 的意思是“在以太网上运行 PPP”,它把 PPP 协议与以太网协议结合起来 —— 将 PPP 帧再封装到以太网中来传输。
- 现在的光纤宽带接入 FTTx 都要使用 PPPoE 的方式进行接入。在 PPPoE 弹出的窗口中键入在网络运营商购买的用户名和密码,就可以进行宽带上网了。
- 利用 ADSL 进行宽带上网时,从用户个人电脑到家中的 ADSL 调制解调器之间,也是使用 RJ-45 和 5 类线(即以太网使用的网线)进行连接的,并且也是使用 PPPoE 弹出的窗口进行拨号连接的。
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
所有的适配器都至少能够识别前两种帧,即能够识别单播地址和广播地址。
以混杂方式 (promiscuous mode) 工作的以太网适配器只要**“听到”有帧在以太网上传输就都接收下来。**
MAC 帧的格式
常用的以太网 MAC 帧格式有两种标准 :
- DIX Ethernet V2 标准(最常用)
- IEEE 的 802.3 标准
无效的MAC帧
- 数据字段的长度与长度字段的值不一致;
- 帧的长度不是整数个字节;
- 用收到的帧检验序列 FCS 查出有差错;
- 数据字段的长度不在 46 ~ 1500 字节之间。
- 有效的 MAC 帧长度为 64 ~ 1518 字节之间。
无效的帧会被直接丢弃掉,以太网不负责重传丢弃的帧。
如果您觉得这篇文章帮助到了您,可以给作者一点鼓励