数据链路层属于计算机网络的低层,主要的任务是为网络层提供服务,保证数据在链路上传输的有效、可靠(以前)。不必考虑物理层如何实现比特传输的细节。数据链路层使用的信道主要有以下两种类型:
两台主机通过互联网进行通信时数据链路层所处的地位,如下图所示:
本章最重要的内容是:
(1)数据链路层的点对点信道和广播信道的特点,以及这两种信道所使用的协议 (PPP 协议以及 CSMAlCD 协议)的特点。
(2) 数据链路层的三个基本问题:封装成帧、透明传输和差错检测。
(3) 以太网 MAC 层的硬件地址。
(4) 适配器、转发器、集线器、网桥、以太网交换机的作用以及使用场合。
本节讨论使用点对点信道的数据链路层的一些基本问题。其中的某些概念对广播信道也是适用的。
链路(link),也叫物理链路:就是从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有任何其他的交换结点。在进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。
数据链路(data link) ,也叫逻辑链路。若把实现必要的通信协议的硬件和软件加到链路上,就构成了数据链路。也即物理链路加上必要的通信协议。这是因为当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输。
现在最常用的方法是使用网络适配器(既有硬件,也包括软件〉来实现这些协议。一般的适配器都包括了数据链路层和物理层这两层的功能。
帧一一数据链路层的协议数据单元,包括了首部和尾部的控制信息和中间的数据部分。
点对点信道的数据链路层在进行通信时的主要步骤如下(设节点 A 与节点 B 进行通信):
1)节点 A 的数据链路层把网络层交下来的 IP 数据报添加首部和尾部封装成帧。
2)节点 A 把封装好的帧发送给节点 B 的数据链路层。
3)若节点 B 的数据链路层收到的帧无差错,则从收到的帧中提取出 IP 数据报交给上面的网络层:否则丢弃这个帧。
尽管数据链路层协议有许多种,但有三个基本问题则是共同的。这三个基本问题是:封装成帧、透明传输和差错检测。
封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。 接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别每个帧的开始和结束。首部和尾部的控制信息中有个很重要的是帧定界符,即确定帧的界限,从哪开始,到哪结束。这样,接收端才能知道收到的数据是否为一个个完整的帧。
透明传输:表示无论什么样的比特组合的数据,都能够按照原样没有差错地通过数据链路层。 即数据链路层对这些数据来说是透明的。因为封装成帧时,首部和尾部加入了关键的帧定界符,如文本文件组成时的 SOH 或 EOH 都是16进制的编码,但是数据部分可能存在同样的编码,导致传输时,数据链路层会错误找到帧的边界,而导致不能透明传输。
解决方法:发送端的数据链路层在数据中出现控制字符 如”SOH” “EOT” 的前面插入一个转义字符 “ESC” (同样为十六进制编码)。而在接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充(byte stuffing)或字符填充(character stuffing) 。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。
“透明”:某一个实际存在的事物看起来却 好像不存在一样
差错检验:在发送的码序列(码字)中加入适当的冗余度以使得接收端能够发现传输中是否发生差错的技术。由于现实的通信链路是非理想的,比特流在传输中可能出现差错,例如1变成0,0变成1的比特差错。目前在数据链路层广泛使用循环冗余检验CRC的检错技术。
CRC(Cyclic Redundancy Check) :(由硬件完成)发送端为每个分组数据计算出冗余码,并加在数据后面,即尾部处,然后再封装成帧。在接收端经过差错检验,若发生比特差错,即放弃接收该帧,凡是接收端接收的帧均是无差错的。使用CRC能实现无比特差错的传输,但还不是可靠传输,因为还有帧重复、帧丢失和帧失序等情况。
经过多年的通信线路的发展,数据链路层常用的协议由能实现可靠传输的高级数据链路控制 HDLC (High-level Data Link Control)变成了更简单的点对点协议 PPP (Point-to-Point Protocol) 。PPP 协议只支持点对点的链路通信,且只支持全双工链路。
PPP 协议就是用户计算机和 ISP(如移动、联通等运营商) 进行通信时所使用的数据链路层协议。如下图所示:
PPP协议设计的需求:
(1) 简单:对数据链路层的帧,不需要纠错,不理会顺序,也不需要流量控制。(在TCP/IP 协议族中,可靠传输由运输层的 TCP 负责)
(2) 封装成帧:须规定特殊的字符作为帧定界符(即标志一个帧的开始和结束的字符),以便使接收端从收到的比特流中能准确地找出帧的开始和结束位置。
(3) 透明性:须保证数据传输的透明性。如果数据中碰巧出现了和帧定界符一样的比特组合时,就要采取有效的措施来解决这个问题。
(4) 多种网络层协议:须能够在在同一条物理链路上同时支持多种网络层协议(如 IP 和 IPX 等)的运行。
(5) 多种类型链路:须能够在多种类型的链路上运行。如,串行的(一次只发送一个比特)或并行的(一次并行地发送多个比特),同步的或异步的,低速的或高速的,电的或光的,交换的(动态的)或非交换的(静态的)点对点链路。
PPPoE(PPP over Ethernet)是为宽带上网的主机使用的链路层协议。这个协议把 ppp 帧再封装在以太网帧中(当然增加了一些能够识别各用户的功能)。宽带上网时由于数据传输速率较高,因此可以让多个连接在以太网上的用户共享一条到 ISP 的宽带链路。
(6) 差错检测:须能够对接收端收到的帧进行检测(CRC),并立即丢弃有差错的帧。
(7) 检测连接状态:须具有一种机制能够及时(不超过几分钟)自动检测出链路是否处于正常工作状态。当出现故障的链路隔了一段时间后又重新恢复正常工作时,就特别需要有这种及时检测功能。
(8) 最大传送单元:须对每一种类型的点对点链路设置最大传送单元 MTU 的标准默认,超过则丢弃该帧。但 MTU 是数据链路层的帧数据部分的最大长度,而不是帧的总长度。
(9) 网络层地址协商:须提供一种机制使通信的两个网络层 (如两个 IP 层) 的实体能够通过协商知道或能够配置彼此的网络层地址。
(10) 数据压缩协商:须提供一种方法来协商使用数据压缩算法。但 PPP 协议并不要求将数据压缩算法进行标准化。
PPP 协议的组成:
(1) 一个将 IP 数据报封装到串行链路的方法。IP 数据报在 PPP 帧中就是其信息部分。信息部分的长度受最大传送单元 MTU 的限制。
(2) 一个用来建立、配置和测试数据链路连接的链路控制协议 LCP (Link Control Protocol) 。通信的双方可协商一些选项。
(3) 一套网络控制协议 NCP (Network Control Protocol),其中的每一个协议支持不同的网络层协议,如 IP、OSI 的网络层、 DECnet ,以及 AppleTalk 等。
PPP 帧的格式如下所示:
各字段的意义:
ppp 帧的首部和尾部分别为四个字段和两个字段。
首部的第一个字段和尾部的第二个字段都是标志宇段 (Flag),即PPP 帧的定界符,标志宇段表示一个帧的开始或结束。规定为 0x7E (符号” 0x “表示它后面的字符是用十六进制表示的。十六进制的 7E 的二进制表示是 01111110) 。连续两帧之间只需要用一个标志宇段。
首部中的地址字段 A 和控制字段 C 目前并没有携带 PPP 帧的信息。
PPP 首部的第四个字段是2字节的协议字段。当协议字段为 0x0021 时,PPP 帧的信息字段就是 IP 数据报。若为 0xC021,则信息字段是 PPP 链路控制协议 LCP 的数据,而 0x8021 表示这是网络层的控制数据。
信息部分即信息字段,他的长度是可变的,但不超过 1500 字节。
尾部中的第一个字段(2字节)是使用 CRC 的帧检验序列 FCS(即冗余码)
字节填充:
当信息字段中出现和标志字段一样的比特(0x7E)组合时,就必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。如在3.1.2中解决透明传输的例子一样
当PPP使用异步传输(逐个字符地传送)时,采用字节填充。如把某些字节转换为2字节序列,如 0x7E 转为 (0x7D,0x5E)。由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。
零比特填充:
PPP 协议用在 SONET/SDH 链路时,使用同步传输(一连串的比特连续传送)时,采用零比特填充方法来实现透明传输。做法是:在发送端先扫描整个信息字段,只要发现有5个连续1,则立即填入一个0 。因为标志字段为 01111110,故只要不出现连续6个1即不会对帧边界作错误的判断。在接收端再扫描比特流,删掉增加的0,即可还原回原来的比特流。
PPP 链路的工作流程状态图:
当用户拨号接入 ISP 后,就建立了一条从用户个人电脑到 ISP 的物理连接。这时,用户个人电脑向 ISP 发送一系列的链路控制协议 LCP 分组(封装成多个 PPP 帧) ,以便建立 LCP 连接。这些分组及其响应选择了将要使用的一些 PPP 参数。接着还要进行网络层配置,网络控制协议 NCP 给新接入的用户个人电脑分配一个临时的 IP 地址。这样,用户个人电脑就成为互联网上的一个有 IP 地址的主机了。然后可以在链路上发送,包含IP数据报的PPP帧了。
当用户通信完毕时, NCP 释放网络层连接,收回原来分配出去的 IP 地址。接着, LCP 释放数据链路层连接。最后释放的是物理层的连接。
广播信道可以进行一对多的通信,在计算机网络中占有非常重要的地位的局域网使用的就是广播信道。
局域网就是将一定区域内的各种计算机、外部设备和数据库连接起来形成的计算机通信网,可以实现文件管理、应用软件共享等功能。最主要的特点是:网络为一个单位所拥有,且地理范围和站点数目均有限。
局域网的一些主要优点:
计算机与外界局域网的连接是通过适配器(adapter)进行的。适配器本来是在主机箱内插入的一块网络接口板(又称为网络接口卡 NIC (Network Interface Card)或网卡)。适配器装有处理器和存储器(包括 RAM 和 ROM(存有MAC地址)) 。适配器和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的, 而适配器和计算机之间的通信则是通过计算机主板上的 I/0 总线以并行传输方式进行的。 适配器能进行数据串行传输和并行传输的转换,有对数据进行缓存的存储芯片,还要能够实现以太网协议。计算机通过驱动程序指挥适配器工作。
须知,局域网工作的层次跨越了数据链路层和物理层。并且,随着以太网(Ethernet)的发展,几乎所有局域网都使用以太网协议,故现在以太网和局域网已成了同义词。
以太网的主要标准,一个是由IEEE802委员会制定的802.3等,主要把局域网的数据链路层拆成两个子层,即逻辑链路控制 LLC (Logical Link Control) 子层和媒体接入控制 MAC (Medium Access Control)子层。与接入到传输媒体有关的内容都放在 MAC 子层,不管采用何种传输媒体和 MAC 子层的局域网对 LLC 子层来说都是透明的;但目前,使用的最多的局域网只剩下DIX Ethemet V2标准,故后面只考虑MAC子层了。
最初的以太网的网络拓扑以总线网最为传统,即各站直接连接到总线上,如下图(b)©所示,通信时共享总线这个信道,即网络中的各站必须竞争对传输媒体的控制,并且在同一时刻至多只允许一个站发送数据。
后来经过发展,采用星形拓展的以太网采用了集线器。从表面上看,使用集线器的局域网在物理上是一个星形网,但由于集线器使用电子 器件来模拟实际电缆线的工作(如下图所示),所以在逻辑上仍是一个总线网,各站共享逻辑上的总线,使用的还是 CSMA/CD 协议(实质是各站中的适配器执行 CSMA/CD 协议)。
集线器采用了专门的芯片,进行自适应串音回波抵消,避免信号干扰。有许多接口,很像一个多接口的转发器。工作在物理层,它的每个接口仅仅简单地转发比特一一收到0 就转发0,收到1就转发1,不进行碰撞检测。
因为以太网逻辑上的网络拓扑大都是总线型,而总线的特点是:当一台计算机发送数据时,总线上的所有计算机都能检测到这个数据。属于广播通信方式,但我们有时需要借助适配器ROM中的MAC地址来实现一对一通信。
以太网在通信时,采用了以下两种措施:
第一,以太网发送的数据都使用曼彻斯特(Manchester)编码的信号,虽使得频带宽度多一倍,但可防止连续多个1和0,展示如下图:
第二,采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据。 适配器对发送的数据帧不进行编号,也不要求对方发回确认。 而局域网信道的质量很好,因通信质量不好产生差错的概率是很小的。因此,以太网提供的服务是尽最大努力的交付,即不可靠的交付。 当目的站收到有差错的数据帧时(用 CRC ),就把帧丢弃,其他什么也不做,对有差错帧是否需要重传由高层(如TCP)来决定。但以太网井不知道这是重传帧,而是当作新的数据帧来发送。
因为,总线上只要有一台计算机在发送数据,总线的传输资源就被占用。因此,在同一时间只能允许一台计算机发送数据,否则各计算机之间就会互相干扰,使得所发送数据被破坏。因此,如何协调总线上各计算机的工作就是以太网要解决的一个重要问题。其实就是信道的共享问题,技术上有两种方法:(1)静态划分信道,如FDM,TDM,CDM和WDM等,但代价过高不适用于局域网。(2)动态媒体接入控制,特点是信道并非在用户通信时固定分配的。其又分为受控接入和随机接入。
以太网采用最简单的随机接入,但有很好的协议用来减少冲突发生的概率。这好比有一屋子的人在开讨论会,想发言的随时可发言,不需要举手示意。为了防止互相之间的发言干扰,有个规定就是:如果你听见有人在发言,那么你就必须等别人讲完了才能发言。但有时碰巧两个或更多的人同时发言了,那么所有人都必须立即停止发言,等听到没有人发言了才能再发言。以太网采用的协调方法和上面的规定非常像,它使用的协议是 CSMA/CD ,意思是载波监听多点接入/碰撞检测(Carrier Sense Multiple Access with Collision Detection)
载波监听,就是用电子技术检测总线上有没有其他计算机也在发送。就是检测信道,不管在发送前,还是在发送中,每个站都必须不停地检测信道。 ** 碰撞检测也就是边发送边监听**,即适配器边发送数据边检测信道上的信号电压的变化情况,当有站点在总线上发送数据时,总线上的信号电压增大。
因为电磁波在1 km 电缆的传播时延约为 5μs ,故站点在发送数据之前监听到信道为空闲后再发送,也可能发生碰撞。就好比一听见会场安静,我们就立即发言,但偶尔也会发生几个人同时抢着发言而产生冲突的情况。传播时延对载波监昕的影响展示如下图:
由上面分析可知,每一个站在自己发送数据之后的一小段时间内,都存在着遭遇碰撞的可能性。这一小段时间是不确定的,它取决于另一个发送数据的站到本站的距离。以太网的这一特点称为发送的不确定性。在局域网的分析中,常把总线上的单程端到端传播时延记为 t,发送数据的站发送数据后,最迟要经过(也叫争用期)两倍的总线端到端的传播时延(2t) ,才能肯定这次发送不会发生碰撞。
以太网使用截断二进制指数退避(truncated binary exponential backoff)算法来确定碰撞后重传的时机。这种算法让发生碰撞的站在停止发送数据后,等待信道变为空闲后推迟(这叫做退避)一个随机的时间再重新发送。
这个算法(1)首先规定了争用期时间是 51.2us。对于 10 Mbit/s 以太网,在争用期内可发送 512 bit,即争用期是发送 512 bit 所需的时间。(2)然后,每次重传都设{ [0,1,…(2^k-1)],k=Min[重传次数,10] }中随机一个数为 r ,重传时间为 r 倍争用期。(3)最后,当重传达 16 次仍不能成功时,则丢弃该帧,并向高层报告。
以太网规定了最短帧长为64字节,即512比特,因此凡长度小于 64 字节的帧都是由于冲突而异常中止的无效帧。还规定了帧间最小间隔为 96比特时间
强化碰撞:当发送数据的站发现发生了碰撞时,除了停止发送数据外,还要再继续发送 32 比特或 48 比特的人为干扰信号,以便让所有用户都知道现在已经发生了碰撞。
因为以太网上有多个站点在工作,碰撞就避免不了,则信道利用率并不能达到100%。以太网的信道被占用的情况如下图所示:
首先设定发送帧需要的时间是T0,它等于帧长除以发送速率。然后考虑无碰撞的理想状态,可以计算出极限信道利用率SMax= T0/T0+t = 1 / 1+a。而 参数a = t / T0。可以看到,只有当参数a远小于1才能得到尽可能高的极限信道利用率,则以太网的帧长不能太短。据统计,当以太网的利用率达到 30%时就己经处于重载的情况。很多的网络容量被网上的碰撞消耗掉了。
“名字指出我们所要寻找的那个资源,地址指出那个资源在何处,路由告诉我们如何到达该处。”
关于以上的论述,名字应当与所在系统无关,而是与我们的身份证号一样,独一无二的标识。在局域网中,就被称为硬件地址、物理地址或MAC地址。它固化在适配器的ROM中,作为标识计算机全球唯一的标记(实际上标记的是适配器的地址),无关它处在什么系统、什么位置之内。
MAC地址长度为6字节(48位),由RA组织分配,目前使得所有有MAC地址的适配器的地址都不一样,可作为适配器独一无二的标识。当路由器通过适配器连接到局域网时,适配器上的硬件地址就用来标志路由器的某个接口。路由器如果同时连接到两个网络上,那么它就需要两个适配器和两个硬件地址。
适配器有过滤功能。适配器从网络上每收到一个 MAC 帧就先用硬件检查 MAC 帧中的目的地址。如果是发往本站的帧则收下,然后再进行其他的处理。否则就将此帧丢弃,不再进行其他的处理。这里”发往本站 的帧”包括以下三种帧:
所有的适配器都至少能够识别单播和广播地址,多播需要另外设置。以太网适配器还可设置为一种特殊的工作方式,即混杂方式,只要”听到”有帧在以太网上传输就都悄悄地接收下来,而不管这些帧是发往哪个站。有一种很有用的网络工具叫做嗅探 (Sniffer) 就使用了设置为混杂方式的网络适配器。可帮助学习网络的人员更好地理解各种网络协议的工作原理,但也有很多黑客利用这个漏洞。
常用的以太网 MAC 帧格式有两种标准,这里只介绍使用得最多的以太网 V2 MAC 帧格式。下图中假定网络层使用的是 IP 协议。实际上使用其他的协议也是可以的。
以太网 V2 MAC 帧较为简单,由五个字段组成。前两个字段分别为6字节长的目的地址和源地址宇段。第三个字段是2宇节的类型字段,用来标志上一层使用的是什么协议, 以便把收到的 MAC 帧的数据上交给上一层的这个协议。第四个字段是数据字段,其长度在 46~1500 字节之间 (当数据字段少于46字节会自动填充整数字段)。最后一个字段是字节的帧检验序列 FCS (使用 CRC 检验〉。
通过上图可以看到,在传输媒体上实际传送的要比 MAC 帧还多8个字节。第一个字段是7个字节的前同步码(1和0交替码),它的作用是使接收端的适配器在接收 MAC 帧时能够迅速调整其时钟频率,使它和发送端的时钟同步, 也就是”实现位同步” (位同步就是比特同步的意思)。第二个字段是帧开始定界符,定义为 10101011 。
还需注意,在以太网上传送数据时是以帧为单位传送的。以太网在传送帧时,各帧之间还必须有一定的间隙。故以太网不需要使用帧结束定界符,也不需要使用字节插入来保证透明传输。
在许多情况下,我们希望对以太网的覆盖范围进行扩展。
以前的以太网上的主机之间的距离不能太远(如200米),否则主机发送的信号经过铜线的传输就会衰减到使 CSMA/CD 协议无法正常工作,故常使用工作在物理层的转发器来扩展以太网 的地理覆盖范围。
现在,扩展主机和集线器之间的距离的一种简单方法就是使用光纤(通常是一对光 纤)和一对光纤调制解调器,如下图所示
这里光纤调制解调器的作用就是进行电信号和光信号的转换。由于光纤带来的时延很小,并且带宽很宽,因此使用这种方法可以很容易地使主机和几公里以外的集线器相连接。如果使用多个集线器,就可以连接成覆盖更大范围的多级星形结构的以太网
这样做的优点是扩大了以太网覆盖的地理范围,缺点是就把三个碰撞域变成一个碰撞域(范围扩大到三个系),即其中一个通信时,对另外两个都可能发生碰撞,并且由于集线器无缓存功能,拓展后的以太网的数据率由最低的数据率决定。
最初人们使用的是网桥(bridge) 。网桥对收到的帧根据其 MAC 帧的目的地址进行转发和过滤。当网桥收到一个帧时,并不是向所有的接口转发此帧,而是根据此帧的目的 MAC 地址,查找网桥中的地址表,然后确定将该帧转发到哪一个接口,或者是把它丢弃(即过滤)。但后来,交换式集线器替代了网桥,其又称为以太网交换机。
以太网交换机的特点:
以太网交换机的自学习功能:
但有时在两台以上交换机连接时,可能会发生兜圈子现象,因为物理上链路成环了,但IEEE802.1D又制定了生成树协议 STP (Spanning Tree Protocol) 。就是不改变网络的实际拓扑,但在逻辑上则切断某些链路,使得从一台主机到所有其他主机的路径是无环路的树状结构,从而消除了兜圈子现象。
以太网逻辑拓扑从总线到星形:
因为大规模集成电路以及专用芯片的发展,使得星形结构的以太网交换机可以做得既便直又可靠。采用以太网交换机的星形结构又成为以太网的首选拓扑,因为以太网交换机不使用共享总线,没有碰撞问题,因此不使用 CSMA/CD 协议,而是以全双工方式工作。但因为它的帧结构未改变,仍然采用以太网的帧结构,故仍叫以太网。
在主机数量过大的局域网中广播,会耗费较多的资源,当网络配置错误的时候,还可能造成无限兜圈子,造成广播风暴。所以,利用以太网交换机建立虚拟局域网(VLAN),就可以把一个较大局域网分割成一些较小的局域网,也即广播域。
虚拟局域网 VLAN 是由一些局域网网段构成的与物理位置无关的逻辑组,而这些网段具有某些共同的需求。每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的计算机属于哪一个 VLAN。虚拟局域网其实只是局域网给用户提供的一种服务,而并不是一种新型局域网。
虚拟局域网协议允许在以太网的帧格式中插入一个4字节的标识符(见下图) ,称为 VLAN 标记(tag) ,用来指明发送该帧的计算机属于哪一个虚拟局域网。插入 VLAN标记得出的帧称为 802 .1Q 帧。VLAN标识符为12位的VID。
如下图假设,交换机#1连接了7台主机,交换机#2连接了5台,分别处在VLAN-10与VLAN-20中,两台交换机通过汇聚链路链接。
当A向B发送帧时,交换机#1能识别目的B同属VLAN-10内,故像在普通以太网中进行帧的转发。
当A向E发送帧时,交换机#1查到E不在本交换机内,故在给以太网帧加上VLAN标识转成802.1Q再转发给交换机#2,然后交换机知道转发给VLAN-10后,然后转回标准的以太网帧再转发给E。
A发送给C或F都不是数据链路层的交换机可以解决得了了。需要网络层的路由器,或直接给当前交换机实现第三层功能。
本文参考 计算机网络(第8版) / 谢希仁编著. —-北京:电子工业出版社,2021.6
若对你有所帮助,请点个赞,欢迎交流。