--- title: 计算机网络-数据链路层复习 mathjax: true date: 2019-06-28 21:33:54 tags: [计算机网络] --- 网桥在数据链路层进行互连。 # 数据链路层研究的问题 在同一个局域网中,**分组**怎么从一台主机传送到另一台主机上(不经过路由器转发)。 **分组是网络层的协议数据单元**,数据链路层的协议数据单元是**帧**。 # 链路和数据链路 ## 链路 也叫物理链路。 一个结点到相邻结点的一段**物理线路**,而没有其他的交换结点。 ## 数据链路 也叫逻辑链路。 **链路**加上实现协议的**硬件**和**软件**形成数据链路。 常用方法: 网络适配器,即网卡,既有软件,又包括硬件,其一般包括物理层和数据链路层两层的功能。 ## 链路和数据链路有什么区别?“电路接通了”和“数据链路接通了”的区别在哪? 所谓**链路就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换结点**。在进行数据通信时,两个计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。 数据链路则是另外一个概念。这是因为**当需要在一条线路上传输数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路**。现在最常用的方法是使用网络适配器(如拨号上网使用拨号适配器,以及通过以太网上网使用局域网适配器)来实现这些协议的硬件和软件。一般的适配器都包括了数据链路层和物理层这两层的功能。 也可以把链路分为物理链路和逻辑链路。物理链路就是上面说的链路,而逻辑链路就是上面的数据链路,是物理链路加上必要的通信协议。 **“电路接通了”表明物理连接已经能够传输比特流了**。 **而“数据链路接通了”是指在物理连通的基础上,建立数据链路,实现封装成帧、透明传输、差错检测等功能**。 # 帧 数据链路层的**协议数据单元**。 # 数据链路层三个基本问题 ## 封装成帧 数据链路层在网络层交下来的IP数据报(即分组)前后分别添加**首部**和**尾部**形成**帧**。(OSI的数据链路层把传输的比特流划分成帧。) **只有数据链路层会添加尾部,除物理层外,即应用层、传输层、网络层、数据链路层都会为上边传下来的数据添加首部**。 首部和尾部包括许多必要的控制信息(如同步信息、地址信息、差错控制等), ### 问题来源 为使接收端能从收到的比特流中准确地找到帧的开始和结束位置。 ### 解决问题 首部和尾部的一个重要作用就是**帧定界**(即确定帧的界限): SOH(Start Of Header),放在帧的最前边,表示帧的开始。 EOT(End Of Transmission),放在帧的最后边,表示帧的结束。 ## 透明传输 ### 问题来源 由于帧开始和结束的标记使用专门指明的控制字符,所传输的数据中不能出现8比特的组合和用作帧定界的控制字符的比特编码一样,否则会出现**帧定界错误**。 ### 解决问题 - 解决方法:**字节填充** 发送端的数据链路层在**数据中控制字符和转义字符**的前边插入一个**转义字符**ESC; 接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符ESC。 简单来说,(要注意:添加和删除ESC是对于**数据中的**ESC、SOH、EOT来说的) **发送端的数据链路层在数据中的ESC、SOH、EOT前添加ESC**, **接收端的数据链路层把数据中ESC、SOH、EOT前的ESC去掉** ## 差错检测 ### 问题来源 - **比特差错** 现实的通信链路不是理想的,传输过程中可能出现**比特差错**(1变成0,或0变成1)。 **比特差错并不是传输差错**。 为保证数据传输的可靠性,必须进行差错检测。 ### CRC 数据链路层广泛使用了**循环冗余校验码CRC**的检错技术。 若数据链路层**仅仅**使用CRC,则只能实现**无差错接受**、**无比特差错**的传输,这并不是**可靠传输**。 ==CRC可参考计组复习笔记,超链接== - CRC和FCS不同 **帧检验序列FCS**,是数据后边的**冗余码**;而CRC是一种检错方法。 - 编码方法 数据左移几位(P的位数-1)后模2除以生成多项式P,则得应在数据后添加的余数 - 检错方法 拿到的数据加冗余码,模2除生成多项式P,求得余数 若余数为0,则无误,接受; 若不为0,则有误,就**丢弃**。 ## 为什么三个问题必须加以解决 **封装成帧就是在一段数据的前后分别添加首部和尾部**(在首部和尾部里面有许多必要的控制信息),这样就构成了一个帧。接收端在收到物理层上交的比特流,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。**首部和尾部的一个重要作用就是帧定界,如果不进行封装成帧,那么数据链路层在收到一些数据时,就无法知道对方传输的数据中哪些是数据,哪些是控制信息,甚至数据中有没有差错也不知道,也无法知道数据传送结束了没有,因此不知道应该在什么时候把收到的数据给上一层。** **上层交下来的数据,不管是什么形式的比特组合,都必须能够正确传送**。由于帧的开始和结束的标记是使用专门指明的控制字符,因此,所传输的数据中的任何比特组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误。**数据链路层不应对传送的数据提出限制,即不应当规定某种形式的比特组合不能够传送。如果没有透明传输,就可能会出现帧定界错误**。 如果数据链路层没有**差错检测**,那么当目的主机收到其他主机发送来的数据时,在交给高层后,**如果应用程序要求收到的数据必须正确无误**,那么目的主机的高层软件可以对收到的数据进行差错检测。如果发现数据中有差错,就可以请求源主机**重传**这些数据。这样做就可以达到正确接收数据的目的。但这种工作方式有一个很大的缺点,就是**一些在传输过程中出现了错误的数据(这些已经是没有用处的数据)还会继续在网络中传送,这样就浪费了网络的资源**。 # 点对点协议PPP PPP协议**面向连接**。 PPP控制字符:`0x7E` ## 主要特点 简单 ## 字节填充 PPP使用异步传输时,转义符定义为`0x7D`,使用字节填充 | 处理情况 | 填充前 | 填充后 | | :-----------------------: | :----: | :---------: | | 控制字符 | 0x7E | (0x7D,0x5E) | | 转义字符 | 0x7D | (0x7D,0x5D) | | ASCII码控制字符(小于0x20) | 0x03 | (0x7D,0x23) | ## 零比特填充 PPP使用同步传输时 保证**信息字段中**不会出现连续6个1,方法如下 - 发送端 扫描**信息字段**,发现**连续5个1**,在其后边添1个0 - 接收端 扫描**信息字段**,发现**连续5个1**,则删除其后边的1个0 # 局域网的数据链路层 **局域网的协议结构一般不包括网络层**。 ## 以太网 以太网是典型的局域网,几乎成了局域网的同义词。 为了通信的简便,以太网采取了以下两种措施: - **无连接、不可靠** - 以太网发送的数据都使用**曼彻斯特编码** ## 截断二进制指数退避算法 以太网使用截断二进制指数退避算法来确定碰撞后重传的时机。 设碰撞次数为$k$,则$k=Min[重传次数,10]$,重传时间为$0$到$2^k-1$个时间片 ## 局域网主要特点 - 网络为一个单位所拥有 - 地理范围和站点数目均有限 ## 网络拓扑 ### 星形网 现在主要用这个, **集线器星型拓扑**: - 易维护,物理上是星形,逻辑上是总线型 - **集线器工作在物理层** ### 环形网 一个电脑出问题,会影响整个局域网。 ### 总线网 所有的主机都连在一根总线上。 - 广播 一台计算机发送数据,总线上所有计算机都能检测到这个数据 - 一对一 给每个适配器一个独一无二的MAC地址,在发送数据帧时,在帧的首部写明接收站的地址。 当数据帧中的目的地址与适配器ROM中存放的MAC地址一致时,该适配器才接受这个数据帧,否则丢弃。 ## CSMA/CD协议 载波监听多路访问/碰撞检测,协议的实质是载波监听和碰撞检测。 # 以太网扩展 --- 作者:[@臭咸鱼](https://github.com/chouxianyu) 转载请注明出处: 欢迎讨论和交流! ---