zoukankan      html  css  js  c++  java
  • 计算机网络基础 之三:数据链路层

    前言

    数据链路层与物理层组合起来对应实际广泛应用的 TCP/IP 协议中的网络接口层,数据链路层不必考虑物理层如何实现比特传输的细节。

    数据链路层定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。并提供功能上和规程上的方法,以便建立、维护和释放网络实体间的数据链路 。

    数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。为达到这一目的,数据链路必须具备一系列相应的功能,主要有:

    1. 如何将数据组合成数据块,在数据链路层中称这种数据块为帧(frame),帧是数据链路层的传送单位;
    2. 如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;
    3. 以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。

    而本文将着重介绍以上知识,对于谢老师书中的4(拓展的以太网)、5(高速以太网)小节略去,有需要的请自行阅读书籍。

    数据链路和数据帧

    物理链路(物理线路)

    是由传输介质与设备组成的。原始的物理传输线路是指没有采用高层差错控制的基本的物理传输介质与设备。当采用复用技术时,一条物理链路上可以有多条数据链路。

    这里要再强调一下,为什么物理链路是属于数据链路层里,而不属于物理层。因为物理层是为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的,电子的,功能的和规范的特性。简单的说,就是“信号和介质”。

    数据链路(逻辑线路)

    在一条物理线路之上,通过一些规程或协议来控制这些数据的传输,以保证被传输数据的正确性。实现这些规程或协议的硬件和软件加到物理线路,这样就构成了数据链路。从数据发送点到数据接收点(点到点 point to point)所经过的传输途径。

    数据帧

    是数据链路层的协议数据单位。它包括三部分:帧头,数据部分,帧尾。其中,帧头和帧尾包含一些必要的控制信息,比如同步信息、地址信息、差错控制信息等;数据部分则包含网络层传下来的数据,比如IP数据包。

    在发送端,数据链路层把网络层传下来得数据封装成帧,然后发送到链路上去;在接收端,数据链路层把收到的帧中的数据取出并交给网络层。不同的数据链路层协议对应着不同的帧,所以,帧有多种,比如PPP帧、MAC帧等,其具体格式也不尽相同。

    为了把主要精力放在点对点信道的数据链路层协议上,可以采用如下图所示的三层模型。在这种三层模型中,不管在哪一段链路上的通信(主机和路由器之间或两个路由器之间),我们都看成是结点和结点的通信(如图中的结点A和B),而每个结点只有下三层——网络层、数据链路层和物理层。

    三个基本问题

    数据链路层协议有许多种,但有三个基本问题则是共同的。这三个基本问题是:封装成帧、透明传输和差错检测。下面分别讨论这三个基本问题。

    封装成帧

    封装成帧(framing)就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。下图表示用帧首部和帧尾部封装成帧的一般概念。

    一个帧的帧长等于帧的数据部分长度加上帧首部和帧尾部的长度。首部和尾部的一个重要作用就是进行帧定界(即确定帧的界限)。当数据是由可打印的ASCII码组成的文本文件时,帧定界可以使用特殊的帧定界符。我们知道,ASCII码是7位编码,一共可组合成128个不同的ASCII码,其中可打印的有95个,而不可打印的控制字符有33个。下图的例子可说明帧定界的概念。控制字符SOH (Start Of Header)放在一帧的最前面,表示帧的首部开始。另一个控制字符EOT (End Of Transmission)表示帧的结束。请注意,SOHEOT都是控制字符的名称。它们的十六进制编码分别是01(二进制是00000001)和04(二进制是00000100)。SOH(或EOT)并不是S, O, H(或E, O, T)三个字符。由于使用了帧定界符,接收端就知道前面收到的数据是否是个不完整的帧,进而判定是否丢弃。

    透明传输

    但当帧的数据部分是非ASCII码的文本文件时(如二进制代码的计算机程序或图像等),情况就不同了。如果数据中的某个字节的二进制代码恰好和SOHEOT这种控制字符一样,数据链路层就会错误地“找到帧的边界”,把部分帧收下(误认为是个完整的帧),而把剩下的那部分数据丢弃。

    透明是一个很重要的术语。它表示:某一个实际存在的事物看起来却好像不存在一样(例如,你看不见在你前面有块100%透明的玻璃的存在)。在数据链路层透明传送数据表示无论什么样的比特组合的数据,都能够按照原样没有差错地通过这个数据链路层。因此,对所传送的数据来说,这些数据就“看不见”数据链路层有什么妨碍数据传输的东西。或者说,数据链路层对这些数据来说是透明的。

    为了解决透明传输问题,就必须设法使数据中可能出现的控制字符SOHEOT在接收端不被解释为控制字符。具体的方法是:发送端的数据链路层在数据中出现控制字符SOHEOT的前面插入一个转义字符ESC(其十六进制编码是1B,二进制是00011011)。而在接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充(byte stuffing)字符填充(character stuffing)。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。下图表示用字节填充法解决透明传输的问题。

    明白了吗,字节填充的ESC对于发送及接收双方就像玻璃一般,实际存在,但又不被觉察。这就是透明传输。

    差错检测

    现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错1可能会变成0,而0也可能变成1。这就叫做比特差错。比特差错是传输差错中的一种。本小节所说的“差错”,如无特殊说明,就是指“比特差错’。在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER (Bit Error Rate)。例如,误码率为10^-10时,表示平均每传送10^10个比特就会出现一个比特的差错。误码率与信噪比有很大的关系。如果设法提高信噪比,就可以使误码率减小。实际的通信链路并非是理想的,它不可能使误码率下降到零。因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛使用了循环冗余检验CRC (Cyclic Redundancy Check)的检错技术。有兴趣的话可以进行查阅。

    点对点协议PPP

    我们知道,互联网用户通常都要连接到某个ISP才能接入到互联网。PPP协议就是用户计算机和ISP进行通信时所使用的数据链路层协议,如下图

    主要是用来通过拨号或专线方式在两个网络节点之间建立连接、发送数据。PPP是各类型主机、网桥和路由器之间简单连接的一种解决方案。PPP协议在RFC1661中有详细的描述。 PPP协议是目前广域网上应用最广泛的协议之一,它的优点在于简单、具备用户验证能力、可以解决IP分配等。

    PPP特征

    PPP协议应满足的需求:

    1. 简单

      数据链路层没有必要提供比IP协议更多的功能,IETF把“简单”作为首要的需求。协议非常简单:接收方每收到一个帧,就进行CRC检验。如CRC检验正确,就收下这个帧;反之,就丢弃这个帧,其他什么也不做。

    2. 封装成帧。如上文。

    3. 透明传输。如上文。

    4. 多种网络层协议。

      PPP协议必须能够在在同一条物理链路上同时支持多种网络层协议(如IPIPX等)的运行。当点对点链路所连接的是局域网或路由器时,PPP协议必须同时支持在链路所连接的局域网或路由器上运行的各种网络层协议。

    5. 多种类型链路

      除了要支持多种网络层的协议外,PPP还必须能够在多种类型的链路上运行。例如,串行的(一次只发送一个比特)或并行的(一次并行地发送多个比特),同步的或异步的,低速的或高速的,电的或光的,交换的(动态的)或非交换的(静态的)点对点链路。

    6. 差错检测。如上文。

    7. 检测连接状态

      PPP协议必须具有一种机制能够及时(不超过几分钟)自动检测出链路是否处于正常工作状态。

    8. 最大传送单元

      PPP协议必须对每一种类型的点对点链路设置最大传送单元MTU的标准默认值。这样做是为了促进各种实现之间的互操作性。如果高层协议发送的分组过长并超过MTU的数值,PPP就要丢弃这样的帧,并返回差错。需要强调的是,MTU是数据链路层的帧可以载荷的数据部分的最大长度,而不是帧的总长度。

    9. 网络层地址协商

      PPP协议必须提供一种机制使通信的两个网络层(例如,两个IP层)的实体能够通过协商知道或能够配置彼此的网络层地址。协商的算法应尽可能简单,并且能够在所有的情况下得出协商结果。这对拨号连接的链路特别重要,因为如果仅仅在链路层建立了连接而不知道对方网络层地址,则还不能够保证网络层可以传送分组。

    10. 数据压缩协商

      PPP协议必须提供一种方法来协商使用数据压缩算法。但PPP协议并不要求将数据压缩算法进行标准化。

    PPP协议有三个组成部分:

    1. 一个将IP数据报封装到串行链路的方法。

      PPP既支持异步链路(无奇偶检验的8比特数据),也支持面向比特的同步链路。IP数据报在PPP帧中就是其信息部分。这个信息部分的长度受最大传送单元MTU的限制。

    2. 一个用来建立、配置和测试数据链路连接的链路控制协议LCP (Link Control Protocol)

      通信的双方可协商一些选项。在RFC 1661中定义了11种类型的LCP分组。

    3. 一套网络控制协议NCP (Network Control Protocol)

      其中的每一个协议支持不同的网络层协议,如IP, OSI的网络层、DECnet,以及AppleTalk等。

    PPP协议的帧格式

    1. 各字段意义

      PPP的帧格式如下图:

      • 首部中的标志字段 F(Flag) ,规定为0x7E(符号0x表示它后面的字符是用十六进制表示的。十六进制7E二进制表示是01111110),标志字段表示一个帧的开始。
      • 首部中的地址字段A规定为0xFF(即11111111)。
      • 首部中的控制字段C规定为0x03(即00000011)。
      • 首部中的2字节的协议字段
        • 当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。
        • 当协议字段为0xC021时,PPP帧的信息字段就是PPP链路控制协议LCP的数据。
        • 当协议字段为0x8021时,PPP帧的信息字段就是网络层的控制数据。
      • 尾部中的第一个字段(2字节)是使用CRC的帧检验序列FCS 。
    2. 字节填充

      当信息字段中出现和标志字段一样的比特(0x7E)组合时,就必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。

      当PPP使用异步传输时,它把转义符定义为0x7D(即01111101),并使用字节填充,

      RFC 1662规定了如下所述的填充方法:

      1. 把信息字段中出现的每一个0x7E字节转变成为2字节序列(0x7D,0x5E) 。
      2. 若信息字段中出现一个0x7D的字节(即出现了和转义字符一样的比特组合),则把0x7D转变成为2字节序列(0x7D, 0x5D)。
      3. 若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。例如,出现0x03(在控制字符中是“传输结束”ETX)就要把它转变为2字节序列(0x7D, 0x23) 。

      由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。

    3. 零比特填充

      PPP协议用在SONET/SDH链路时,使用同步传输(一连串的比特连续传送)而不是异步传输(逐个字符地传送)。在这种情况下,PPP协议采用零比特填充方法来实现透明传输。如下图:

    PPP协议的工作状态

    使用广播信道的数据链路层

    广播信道可以进行一对多的通信。下面要讨论的局域网使用的就是广播信道。局域网是在20世纪70年代末发展起来的。局域网技术在计算机网络中占有非常重要的地位。

    局域网的数据链路层

    局域网最主要的特点是:网络为一个单位所拥有,且地理范围和站点数目均有限。在局域网刚刚出现时,局域网比广域网具有较高的数据率、较低的时延和较小的误码率。但随着光纤技术在广域网中普遍使用,现在广域网也具有很高的数据率和很低的误码率。

    局域网具有如下一些主要优点:

    1. 具有广播功能,从一个站点可很方便地访问全网。局域网上的主机可共享连接在局域网上的各种硬件和软件资源。
    2. 便于系统的扩展和逐渐演变,各设备的位置可灵活调整和改变。
    3. 提高了系统的可靠性(reliability)、可用性(availability)和生存性(survivability).

    常见的局域网拓朴结构如下:

    局域网经过了四十年的发展,尤其是在快速以太网(100 Mbit/s)和吉比特以太网((1 Gbit/s)。 10吉比特以太网(10 Gbit/s)相继进入市场后,以太网已经在局域网市场中占据了绝对优势。现在以太网几乎成为了局域网的同义词,因此本文从此节开始都是讨论以太网技术。

    必须指出,局域网工作的层次跨越了数据链路层和物理层。由于局域网技术中有关数据链路层的内容比较丰富,因此我们就把局域网的内容放在数据链路层这一章中讨论。但这并不表示局域网仅仅和数据链路层有关。

    在实际工作中,经常会遇到多个用户(计算机或终端)要同时与一个主机相连。若每个用户都用独立的信道与主机相连,则往往要消耗很多的通信线路资源。因此,只要有可能,就应尽量采用信道共享。信道共享可以提高信道资源的利用率。但却有一个严重的问题,当多个站点同时发送数据时将会产生冲突。为了解决这个问题,目前已有多种技术。大致分为两类:

    1. 静态划分信道

      上一篇文章已经介绍过的频分复用、时分复用、频分复用和码分复用等。用户只要分配到了信道就不会和其他用户发生冲突。但这种划分信道的方法代价较高,不适合于局域网。

    2. 动态媒体接入控制

      它又称为多点接入(multiple access),其特点是信道并非在用户通信时固定分配给用户。这里又分为以下两类:

      1. 随机接入

        随机接入的特点是所有的用户可随机地发送信息。但如果恰巧有两个或更多的用户在同一时刻发送信息,那么在共享媒体上就要产生碰撞(即发生了冲突),使得这些用户的发送都失败。因此,必须有解决碰撞的网络协议。

      2. 受控接入

        受控接入的特点是用户不能随机地发送信息而必须服从一定的控制。这类的典型代表有分散控制的令牌环局域网和集中控制的多点线路探询(polling),或称为轮询

      属于随机接入的以太网将被重点讨论。受控接入则由于目前在局域网中使用得较少,不再讨论。

    以太网

    上文提到,现在以太网几乎成为了局域网的同义词,由于以太网的数据率己演进到每秒吉比特或甚至高达100吉比特,因此通常就用“传统以太网”来表示最早流行的10 Mbit/s速率的以太网。为了讨论原理,下面我们就从传统以太网开始。

    1. 以太网的两个标准

      以太网的两个标准DIX Ethernet V2IEEE802.3标准只有很小的差别,因此很多人也常把802.3局域网简称为“以太网”(严格说来,“以太网”应当是指符合DIX Ethernet V2标准的局域网)。

      然而到了20世纪90年代后,以太网在局域网市场中己取得了垄断地位,并且几乎成为了局域网的代名词。由于互联网发展很快而TCP/IP体系经常使用的局域网只剩下DIX Ethernet V2而不是IEEE 802.3标准中的局域网,因此之前IEEE 802委员会为了使数据链路层能更好地适应多种局域网标准而制定的逻辑链路控制子层LLC(即IEEE 802.2标准)的作用已经消失了,很多厂商生产的适配器上就仅装有MAC协议而没有LLC协议。后面在介绍以太网时就不再考虑LLC子层。这样对以太网工作原理的讨论会更加简洁。

    2. 适配器的作用

      其实这里提到的适配器就是网卡。由于现在计算机主板上都己经嵌入了这种适配器,不再使用单独的网卡了,因此
      使用适配器这个更准确的术语。适配器是工作在数据链路层的网络组件,是局域网中连接计算机和传输介质的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉及帧的发送与接收、帧的封装与拆封、介质访问控制、数据的编码与解码以及数据缓存的功能等。

      请注意,虽然我们把适配器的内容放在数据链路层中讲授,但适配器所实现的功能却包含了数据链路层及物理层这两个层次的功能。现在的芯片的集成度都很高,以致很难把一个适配器的功能严格按照层次的关系精确划分开。

    3. CSMA/CD协议

      CSMA/CD(Carrier Sense Multiple Access/collision detection,带有冲突检测的载波侦听多路存取)是IEEE 802.3使用的一种媒体访问控制方法。从逻辑上可以划分为两大部分:数据链路层的媒体访问控制子层(MAC)和物理层。它严格对应于ISO开放系统互连模式的最低两层。LLC子层和MAC子层在一起完成OSI模式的数据链路层的功能。

      为什么要采用CSMA/CD协议:

      最早的以太网是将许多计算机都连接到一根总线上。当初认为这种连接方法既简单又可靠,因为在那个时代普遍认为:“有源器件不可靠,而无源的电缆线才是最可靠的”。而总线的特点是当一台计算机发送数据时,总线上的所有计算机都能检测到这个数据。这种就是广播通信方式。总线上只要有一台计算机在发送数据,总线的传输资源就被占用。因此,在同一时间只能允许一台计算机发送数据,否则各计算机之间就会互相干扰,使得所发送数据被破坏。因此,如何协调总线上各计算机的工作就是以太网要解决的一个重要问题。因此采用CSMA/CD协议来解决这一问题。

      CSMA/CD的基本原理是:

      1. 多点接入

        所有节点都共享网络传输信道。

      2. 载波监听

        不管在发送前,还是在发送中,每个站都必须不停地检测信道。

        在发送前检测信道,是为了获得发送权。如果检测出已经有其他站在发送,则自己就暂时不许发送数据,必须要等到信道变为空闲时才能发送。在发送中检测信道,是为了及时发现有没有其他站的发送和本站发送的碰撞。这就称为碰撞检测。关于碰撞的计算若有兴趣请自行查阅。

    使用集线器的星型拓扑

    集线器的英文称为“Hub”。“Hub”是“中心”的意思,集线器的主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上,使用集线器的以太网在逻辑上仍是一个总线网,各站共享逻辑上的总线。

    它工作于“物理层”。集线器与网卡、网线等传输介质一样,属于局域网中的基础设备,采用CSMA/CD(即带冲突检测的载波监听多路访问技术)介质访问控制机制。集线器每个接口简单的收发比特,收到1就转发1,收到0就转发0,不进行碰撞检测。

    集线器(hub)属于纯硬件网络底层设备,基本上不具有类似于交换机的”智能记忆”能力和”学习”能力。它也不具备交换机所具有的MAC地址表,所以它发送数据时都是没有针对性的,而是采用广播方式发送。也就是说当它要向某节点发送数据时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节点,如图所示,简单明了。

    以太网的信道利用率

    信道利用率就是信道平均被占用的程度。如果信道利用率是10%,就表示这个信道平均在10%的时间是被成功利用的(处于忙的状态),而平均在90%的时间是不被成功利用的(处于空闲或冲突状态)。

    上图为一帧发送平均时间的简单图示。据统计,当以太网的利用率达到30%时就己经处于重载的情况。很多的网络容量被网上的碰撞消耗掉了。信道利用率的计算若有兴趣请自行查阅。

    以太网的MAC层

    1. MAC层的硬件地址

      在局域网中,硬件地址又称为物理地址MAC地址(因为这种地址用在MAC帧中)。大家知道,在所有计算机系统的设计中,标识系统(identification system)都是一个核心问题。在标识系统中,地址就是识别某个系统的一个非常重要的标识符。

      在讨论地址问题时,很多人常常引用著名文献[SHOC78]给出的如下定义:名字指出我们所要寻找的那个资源,地址指出那个资源在何处,路由告诉我们如何到达该处。这个非形式的定义固然很简单,但有时却不够准确。严格地讲,名字应当与系统的所在地无关。这就像我们每一个人的名字一样,不随我们所处的地点而改变。IEEE 802标准为局域网规定了一种48位的全球地址(一般都简称为“地址”),是指局域网上的每一台计算机中固化在适配器的ROM中的地址。严格地讲,局域网的“地址”应当是每一个站的“名字”或标识符[PERLOO] 。不过计算机的名字通常都是比较适合人记忆的不太长的字符串,而这种48位二进制的“地址”却很不像一般计算机的名字。现在人们还是习惯于把这种48位的“名字”称为“地址”,尽管这种说法并不太严格。

    2. MAC帧的格式

      常用的以太网MAC帧格式有两种标准,一种是DIX Ethernet V2标准(即以太网V2标准),另一种是IEEE802.3标准。这里只介绍使用得最多的以太网V2的MAC帧格式。如下图,图中假定网络层使用的是IP协议。实际上使用其他的协议也是可以的。

      以太网V2的MAC帧较为简单,由五个字段组成。前两个字段分别为6字节长的目的地址源地址字段。第三个字段是2字节的类型字段,用来标志上一层使用的是什么协议,以便把收到的MAC帧的数据上交给上一层的这个协议。例如,当类型字段的值是0x0800时,就表示上层使用的是IP数据报。若类型字段的值为0x8137,则表示该帧是由Novell IPX发过来的。第四个字段是数据字段,其长度在46到1500字节之间(46字节是这样得出的:最小长度64字节减去18字节的首部和尾部就得出数据字段的最小长度)。最后一个字段是4字节的**帧检验序列**FCS(使用CRC检验)。当传输媒体的误码率为1x10^-8时,MAC子层可使未检测到的差错小于1x10^-14。

      从上图可看出,在传输媒体上实际传送的要比MAC帧还多8个字节。这是因为当一个站在刚开始接收MAC帧时,由于适配器的时钟尚未与到达的比特流达成同步,因此MAC帧的最前面的若干位就无法接收,结果使整个的MAC成为无用的帧。为了接收端迅速实现位同步,从MAC子层向下传到物理层时还要在帧的前面插入8字节(由硬件生成),它由两个字段构成。第一个字段是7个字节的前同步码((1和0交替码),它的作用是使接收端的适配器在接收MAC帧时能够迅速调整其时钟频率,使它和发送端的时钟同步,也就是“实现位同步”(位同步就是比特同步的意思)。第二个字段是帧开始定界符,定义为10101011。它的前六位的作用和前同步码一样,最后的两个连续的1就是告诉接收端适配器:”MAC帧的信息马上就要来了,请适配器注意接收”。MAC帧的FCS字段的检验范围不包括前同步码和帧开始定界符。顺便指出,在使用SONET/SDH进行同步传输时则不需要用前同步码,因为在同步传输时收发双方的位同步总是一直保持着的。

      IEEE 802.3标准规定凡出现下列情况之一的即为无效的MAC帧:

      1. 帧的长度不是整数个字节
      2. 用收到的帧检验序列FCS查出有差错
      3. 收到的帧的MAC客户数据字段的长度不在46一1500字节之间.考虑到MAC帧省部和尾部的长度共有18字节,可以得出有效的MAC帧长度为64一1518字节之间。

      对于检查出的无效MAC帧就简单地丢弃。以太网不负责重传丢弃的帧。

    参考

    1. PPP协议的帧格式 —— Cainv89
    2. 数据链路层 —— 百度百科
    3. 网卡 —— 百度百科
    4. CSMA/CD协议 —— 百度百科
    5. 集线器 —— 百度百科
  • 相关阅读:
    C# 文字转声音
    Parameter配置文件获取
    反射动态创建不同的Processor
    程序代码记Log
    Dictionary序列化和反序列化
    HQueue:基于HBase的消息队列
    Angular系列----AngularJS入门教程05:双向绑定(转载)
    Angular系列----AngularJS入门教程04:迭代器过滤(转载)
    Angular系列---- AngularJS入门教程03:AngularJS 模板(转载)
    Angular系列----AngularJS入门教程02:静态模板(转载)
  • 原文地址:https://www.cnblogs.com/Sherlock-J/p/12925953.html
Copyright © 2011-2022 走看看