链路层:数据传输规则

[第一节: 链路层的意义]

1.1 什么是链路

简介

  在讲解链路层之前,首先让我们清楚一下什么是链路,来张图:

链路层:数据传输规则_第1张图片
数据链路.png

  链路(Link):是指从一个结点相邻结点的一段物理线路(有线或无线),而中间没有任何其他的交换结点。在进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。
  数据链路(Data Link):这是因为当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是使用网络适配器(既有硬件,也包括软件)来实现这些协议。一般的适配器都包括

  深入解读:链路其实是物理层的信息传输的设备,可以理解为信道。而数据链路只是一个抽象的概念,可以理解为数据在传输过程中因为通信规则而走的某一条路径。我们知道网络都是拓扑结构的,可以说条条网线通目的地,但是到底走哪条网线?是走最近的?还是走指定的?在链路层中会有对应的协议来控制。
  我们在读下文的时候,要有一个认知前提:链路层并没有物理链路,而是抽象上的链路,是建立在链路之上的,具体的实现其实是在数据的传输上对应的物理设备,例如交换机;所谓链路层只是在网线的物理链路的两端通过达成的共同协议来解读传递过来的信息,然后将信息发送到指定的下一条链路中。如果链路层的设备不能解读传送过来的信息,那么就丢掉。


1.2 为什么需要链路层

白话

  在讲解链路层之前,我们先来回顾一下物理层,物理层存在的意义是为了传输信号,至于传输的是什么物理层是不负责的。就像是我们的对话环境意义,物理层就像是空气,我们通过空气震动传递声音,对方也在这个环境中,所以也能听到我们发出的声音,声音就是信号,物理层只是提供了一个信号传递的必要环境。
  但是有声音你不一定能解读,就像是一个人说英语,一个人说汉语,同样能发声,能接收到信号,但是彼此缺并不知道信号的意义,那信号也就没有任何意义。
  此时的英语或者汉语就是一种协议,当然在信号传输的过程中也存在一定的问题,比如两个说汉语的人交流,因为隔得较远,因为天气等原因造成气压不稳,或者风较大,都会使接收方收到的消息可能会有缺失或者误差。
  那么链路层主要解决的问题就是找到一种方式能让彼此交流,让对方知道你在说什么。


1.3 如何让对方知道你在说什么?

前言

  现实生活中,两个人要对话(具备通话的物理环境,即都能收到对方传过来的声音),首先两个人都要用相同的语言,而语言又是由单词(包含长度、发音等属性),词组,语法等构成。
  沟通的语言就相当于协议,而协议的实现就没有语言那么复杂了,我们只需要让传递的双方知道我们这段数据是给谁的,然后哪一部分是数据,什么时候结束就好了。至于数据的内容是什么是需要目的地客户端需要解析的。
  现实生活中我们对话都是一句话一句话的说,那么数据传输也是一段一段传输的,我们管这个叫做封装成帧,中间还会遇到一些其他问题,为了解决这些问题,引入了透明传输差错检测两种机制,下面我们来详细解释一下这三个基本问题。

  • 封装成帧

  先来张概念图,心里好有个数:

链路层:数据传输规则_第2张图片
链路层封装成帧.png

  其实封装成帧来传输数据还可以这样来理解:经过物理层的阐述我们知道,数据传输是不可靠的,如果我们不进行封装成帧,那么就是整个文件或者其他资源来传输,如果出了问题,我们可能要从头开始传输,或者需要判断从哪里开始出现了问题,这就需要消耗不少的资源和复制的逻辑来重新传输或者判断计算,所以我们需要找一个折中的值来包装每次传输的数据,如果这个数据出现了问题,丢失了或者是出现了误码率,那么我们完全可以丢弃它,让客户端重新传输甚至不传输(如果对内容的完整性允许有一定的损失的话,例如视频、音频的传输)。

  理解了为什么需要封装成帧,接下来说一下如何封装成帧。 
  入上图所示,因为数据的发送是依赖于信号,而信号又是连续的,那么如何区分一个帧从哪里开始到哪里结束呢?这就需要引入帧与帧之间的分隔符,也就是图中的帧首部和帧尾部;中间部分就是我们要传输的数据部分,为其命名为MTU,即Maximum Transmission Unit(最大传输单元)。

  插播:MTU的确定是很复杂的,RFC 1191 描述了“路径最大传输单元发现方法”,这是一种确定两个 IP 主机之间路径最大传输单元的技术,其目的是为了避免 IP 分片。如果感兴趣的同学可以自行查找资料,这里只做简要解读。

  • 透明传输(pass-through)

  指的是在通讯中不管传输的业务内容如何,只负责将传输的内容由源地址传输到目的地址,而不对业务数据内容做任何改变。
  在传输文本内容的时候我们都是使用的ASCII码,而我们知道ASCII是7位编码,一共可组合成128个不同的ASCII码,其中可打印的有95个,不可打印的控制字符有33个。我们可以选择一些特殊的字符来做帧界定符
  但是我们传输的数据并不都是文本内容(例如:二进制的图像等),这时候情况就不一样了,我们选择的帧界定符可能就跟数据部分的可能会发生重复,这样终端帧解析的时候就找不到正确的帧开头和结尾了。
  为了解决这个问题,引入了转义字符(Escape character)的概念,我们将一根特殊的字符作为转义字符,当发现帧界定符前面存在该转义字符的时候,这个时候帧界定符所代表的就是数据,而不是帧界定符。

链路层:数据传输规则_第3张图片
字节填充法解决透明传输问题.png
  • 差错检测

  差错检测和透明传输一样,也是在传输过程中发生的问题。
  现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错:1可能会变成,而0也可能变成1,这就叫做比特差错;比特差错是传输差错中的一种。在一段时间内,传输错误的比特占所占传输比特总数的比率称为误码率BER(BitErrorRate)
  因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
  目前在数据链路层广泛使用了循环冗余检验CRC(CyclicRedundancyCheck)的检错技术。
  分析到这里,我们可以发现,如果如果我们在传送数据时不以帧为单位来传送,那么就无法加入冗余码以进行差错检验。如果要在数据链路层进行差错检验,就必须把数据划分为帧,每一帧都加上冗余码,一帧接一帧地传送,然后在接收方逐帧进行差错检验。这也是为什么要封装成帧来传送的一个原因。

重点,在数据链路层若仅仅使用循环冗余检验CRC差错检测技术,则只能做到对帧的无差错接受,可以理解为凡是接收端数据链路层接受的帧均无差错。
  传输差错可分为两大类:
    一类就是前面所说的最基本的比特差错,
    另一类传输差错则更复杂些,这就是收到的帧并没有出现比特差错,但却出现了帧丢失、帧重复或帧失序。
综上:链路层所谓“可靠传输”可以近似认为:凡是数据链路层接收端接收到的帧均无差错。

  说明一:[无比特差错]与[无传输差错]并不是同样的概念。
  无差错传输理解为:在某一次传输任务(会有N多个数据帧进行传输)中,接收端能准确的接收到这次传输任务所表达的内容。
  无比特差错理解为:某一个数据帧在传输的时候,接收端接收到的数据帧是无差错的。
  也就是说,在组装数据帧的时候如果出现了问题例如帧丢失或者顺序错误的话,就不能认为是无传输差错

  说明二:所以为了保证无传输差错在CRC检错的基础上,增加了帧编号、确认和重传机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。
  这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量己经大大提高了,由通信链路质量不好引起差错的概率己经大大降低。因此,现在互联网就采取了区别对待的方法:
  对于通信质量良好的有线传输链路,数据链路层协议不使用确认和重传机制,即不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出现了差错并且需要进行改正,那么改正差错的任务就由上层协议(例如,传输层的TCP协议)来完成。
  对于通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,数据链路层向上提供可靠传输的服务。


1.4 总结

以上只是概念性的说明,具体的实现有很多思路,具体的需要根据当前网络使用的是什么协议来决定。
  数据链路层使用的信道主要是点对点信道(PPP协议)广播信道(CSMA/CD协议),具体就不展开做详细介绍了,有兴趣的同学可以自己查阅资料
  协议可以理解为解决某种问题的一种解决办法,所以只要是类似的问题都可以使用这种办法解决,后面再计算机知识的学习中,也会发现很多相似的协议。

参考资料


  • 《计算机网络(第7版)》-谢希仁
  • 维基百科

你可能感兴趣的:(链路层:数据传输规则)