zoukankan      html  css  js  c++  java
  • (一)数据链路层

    数据链路层

    此文的内容有:

    • 数据链路层使用的信道及其背后的协议
    • 数据链路层的三个基本问题:封装成帧、透明传输、差错检测
    • 以太网MAC层

    信道及其背后的协议

    数据链路层属于计算机网络的底层,它使用的信道主要有以下两种类型:
    (1)点对点信道:使用一对一的点对点通信方式
    (2)广播信道:使用一对多的广播通信方式,因为信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送

    点对点信道

    先解释下基本概念:

    • 链路:指从一个结点到相邻结点的一段物理路线(有线或无线),中间没有任何交换结点。在进行数据通信时,两台计算机之间的通信路径往要经过许多段这样的链路。
    • 数据链路:在一条线路上传送数据时,除了必须有一条物理路线外,还必须有一些必要的通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
    • 帧:数据链路层的协议数据单元。数据链路层把网络层交下来的数据构成帧发送到链路上,把接收到的帧中的数据取出并上交给网络层。在互联网中,网络层协议数据单元就是IP数据报(或简称为数据报、分组、包)

    点对点信道的数据链路层在进行通信时,主要步骤如下:

    • 结点A的数据链路层把网络层交下来的IP数据报添加首部和尾部,封装成帧
    • 结点A把封装好的帧发送给结点B的数据链路层
    • 若结点B的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据报并上交给网络层,否则丢弃这个帧
      数据链路层不必考虑物理层如何实现比特传输的细节,如下图所示:

    三个基本问题

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

    1、封装成帧
    就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。每一种链路层协议都规定了所能传送的帧的数据部分长度上限--最大传送单元MTU。

    首部和尾部的一个重要作用就是进行帧定界。当数据是由可打印的ASCII码组成的文本文件时,帧定界可以使用特殊的帧定界符,帧开始符:SOH(Start Of Header),十六进制编码为01(二进制是00000001),帧结束符:EOT(End Of Transmission),十六进制编码是04(二进制是00000100)。
    假定发送端在尚未发送完一个帧时,突然出现故障,中断了发送,随后又恢复正常,于是从头开始发送刚才未发到完的帧。由于使用了帧定界符,接收端就知道前面是个不完整的帧(只有开始符SOH,没有结束符EOT),必须丢弃,而后面收到的数据有明确的帧定界符,是一个完整的帧,应当收下。

    2、透明传输
    由于帧定界使用专门的控制字符,因此,所传输的数据中的任何8比特的组合,不允许和帧定界的字符一致,否则就会出现帧定界的错误。当传送的帧是用文本文件组成的帧时(即从键盘输入的),其数据部分不会出现帧定界字符,所以不管从键盘上输入什么字符,都可以放在这样的帧中传输,我们把这样的传输叫做透明传输。
    但是当数据部分是非ASCII码的文本文件时(如二进制代码的计算机程序、图像等),如果数据中的某个字节恰好与帧定界字符一样,数据链路层就会错误的找到帧的边界,把部分帧收下,而把剩下的那部分数据丢弃,如下图所示:

    像上图所示的帧的传输就不是透明传输,当遇到数据中出现帧定界字符时,后面的数据被接收端丢弃了,数据中出现的EOT可能仅仅是二进制数据00000100。这个透明是一个很重要的术语,它表示:某一个实际存在的事物看起来却好像不存在一样,比如:看不见前面有块100%透明的玻璃。
    为了解决透明传输问题,就必须设法使数据中可能出现的控制字符“SOH”与“EOT”在接收端不被解释为控制字符。具体的方法是:发送端的数据链路层在数据中出现控制字符的前面插入一个转义字符“ESC”,它的十六进制编码是1B,二进制编码是00011011,在接收端的数据链路层把数据送往网络层之前删除这个插入的转义字符。这种方法叫做字节填充(byte stuffing)或字符填充(character stuffing)。如果转义字符也出现在数据当中,解决方法仍然是在转义字符的前面插入一个转义字符,当接收端收到连续的两个转义字符时,就删除前面的一个,如下图所示:

    3、差错检测
    现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错,1可能变为0,0也可能变为1,这叫做比特差错,它是传输差错中的一种。在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate),比如:当误码率为10﹣¹º时,表示平均每传送10¹º个比特会出现一个比特的差错。误码率与信噪比有很大的关系,提高信噪比,可以降低误码率,但无法使误码率下降为0。因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)的技术。
    使用循环冗余检验CRC差错检测技术,只能做到对帧的无差错接收,即:凡是接收端数据链路层接收的帧,我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错。
    传输差错可分为两大类:一类就是前面说的比特差错,另一类是:收到的帧虽然没有出现比特差错,但却出现了帧丢失、帧重复、或帧失序,例如,发送方连续传送三个帧,[#1][#2][#3]。假定接收端收到的每一个帧都没有比特差错,但却出现了下面的几种情况:

    • 帧丢失:收到[#1][#3](丢失[#2])
    • 帧重复:收到[#1][#2][#2][#3]([#2]重复)
    • 帧失序:收到[#1][#3][#2]
      以上三种情况都属于出现传输差错。

    过去OSI的观点是:必须让数据链路层向上提供可靠传输。但现在通信线路的质量已经大大提高了,由通信链路质量引起差错的概率已经大大降低。因此,互联网采取的区别对待的方法:对于通信质量良好的有线传输链路,数据链路层协议不使用确认和重传机制,即不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出现了差错并且需要进行改正,那么改正差错的任务就由上层协议来完成(TCP协议)。对于通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,数据链路层向上提供可靠传输的服务。实践证明,这样做可以提高通信效率。

  • 相关阅读:
    Android 如何自定义EditText 下划线?
    一步一步理解 Java 企业级应用的可扩展性
    客户案例—北京优络时代科技有限公司
    11个显著提升 ASP.NET 应用程序性能的技巧——第1部分
    如何用 React Native 创建一个iOS APP?(二)
    如何与 DevOps 为伍?
    通过 DevOps 整合开发和应用安全管道
    性能为王:选择模拟监控的10大理由!
    模拟监控和真实用户体验监测,选哪个?
    PHP 之 Laravel 框架安装及相关开源软件
  • 原文地址:https://www.cnblogs.com/cone/p/14843365.html
Copyright © 2011-2022 走看看