一、数据链路层前导知识
1.1 整体了解数据在网络传输的整体过程
计算机网络分为五个层次,从下往上依次是物理层(实际传输01代码),数据链路层,网络层,运输层,应用层。这一次我们学习的是数据链路层,想要学习数据链路层,应该首先了解数据是如何从一个点发送到另外一个点的,对其整体有个了解,不然会学的特别懵。
我们通过主机H1向H2发送信息,是要通过网线,一系列路由器传送转发我们所发送的数据才能送到主机H2;首先会将要发送的数据通过应用层封装成为应用层数据协议单元,其实就可以理解为想要从北京邮寄一个物品到居住在大连的一个朋友,那么我们要邮寄物品,首先就会对物品进行打包,而就和将数据封装成为应用层数据协议单元将类似,只有包裹被打包后才可以被运输,只有数据被封装成应用层数据协议单元才可以被运输层传送;
到这里位置,将数据封装成为应用层数据协议单元好像就可以进行传输了,不再需要经过运输层,网络层,数据链路层的作用了,其实数据通过网络传输远比我们打包快递邮寄难,它需要将数据按着顺序进行不同层次的封装,最后在通过物理层传输,即0101010,将数据通过物理线路传输到H2主机,主机H2接收到的最开始其实就是一串毫无规律的01数据,在主机H2中,就需要进行摆数据上的封装一步一步拆开的步骤,所以在从上往下依次经过数据链路层,网络层,运输层,应用层一层一层的拆开我们的之前在主H1处的封装,最后得到H1想要发送的数据。
我们会一步一步的学习每一层都是如何对数据封装的,这里需要对其过程有个抽象的了解。
1.2 数据传输的实际过程
①数据首先由应用层封装成为应用层协议数据单元,封装完成后会交付给运输层。
②运输层会再次将数据封装成为运输层数据协议单元,即在其加上运输层协议首部,后交付给网络层。
③网络层会对数据再次进行封装,即加上网络层协议首部,使其成为网络层协议数据单元,然后交付给数据链路层。
④数据链路层会再一次的对数据进行封装,此次是将其封装成帧,即加帧头和帧尾,使其成为数据链路层协议数据单元,然后交付给物理层。
⑤封装成帧后的数据,最后就会通过物理层传输至H2主机,然后在主机H2处会按着封装的步骤,从外往里的依次拆开封装。
二、数据链路层
2.1数据链路层的三大问题:
- 封装成帧
- 如何封装?
- 封装的作用是什么,为什么要封装?
- 透明传输
- 透明传输是什么?
- 如何进行透明传输?
- 差错检测
- 为什么需要差错检测?
- 如何差错检测?
2.1封装成帧
①如何封装
如何封装,其实我们已经知道了,就是在网络层协议数据单元中添加帧首部和帧尾部信息,封装完成的帧我们也会将其称为MAC帧,MAC帧在不同的数据链路层中MAC帧封装的格式是不同的,就比如,京东快递和中通快递封装快递的方式就会不同,虽然都是同一层,但是,由于协议不同,封装的格式不同。
ppp协议,点对点协议的MAC帧格式
对于点对点(所谓的点对点传输,就是两个点要传输就通过一个线直接连接进行传输)协议的MAC帧格式如下,在网络层协议数据单元中添加额帧首部信息5字节,帧尾部份3字节,在帧的首部和尾部都有一个1字节的标志。
以太网MAC帧格式
在网络层协议数据单元中添加额帧首部信息14字节,帧尾部份4字节。
封装的作用
那在数据链路层进行封装成帧到底有什么作用呢?其实封装成成帧后会将MAC交付给物理层,物理层进行传输的时候,会将01000110挤在一起传送,为了一个包裹一个包裹的区分开来,就可以使用帧定界 在区分一个一个数据帧,所以封装成帧的作用就是使用帧定界。
所以通过前后的一个字节的标志就可以区分出来一个一个的帧了;仅适用于点对点这种的帧,因为对于以太网MAC帧中并没有标记,为了实现以太网中的MAC帧的帧定界,在物理层的时候,还会添加一个前导码,通过时间间隔的控制来实现帧的定界。
2.2透明传输
在了解透明传输是个什么东西开始之前,先来看个可能出现的问题,若要传输的数据中就包含了flag,应为flag其实就是一个数据,若传送的数据中也包含一个帧定界符的话,还可以进行准确的传输吗?
显然的不行的,当主机H2接收到数据,先看到第一个flag,接着读取帧数据,看见第二个flag,就会自动的认为帧结束了,从而导致传输出错,所以我们就需要解决它,从而实现透明传输。
所以所谓的透明传输就是想让数据的传输是想让数据中存在的 " 标记 "好像透明一样,可以顺利被传输,而不是被误认为是开始或结束的标志。那么如何实现透明传输呢?
对于数据中出现的flag,就对其添加转义字符,转义字符1个字节,在接收端接收的数据的时候,遇见转义字符,就可以判别出来前面的flag是数据,而不是帧定界的标志,从而就可以实现透明传输。
其实上述实现的透明传输面向字节的物理传输的,即一个字节一个字节传输,一个字节一个字节接受的,就可以通过字节填充ESC来实现透明传输。
所以实现透明传输就是要将数据部分出现的和标记相同的数据实现透明传输,即为其加上转义字符,这里只需要了解到对于数据链路层实现透明传输是通过加转移字符来实现的;后面我们会具体的学习PPP点对点协议它的透明传输是具体以什么作为转义字符,以及如何添加转义字符的。
2.3差错检测
在传输过程中就很可能出现0变成1,1变成0,从而导致传输的数据出现差错,所以我们需要检测到传输的数据是否出错,出错的话,就会丢弃该数据,以确保每次接受到的数据都是正确的,所以在数据链路层还需要实现检错功能;检错功能如何实现呢?
①奇偶校验
所谓的奇偶校验就是,将数据中加上一个校验位,使其1成为奇数个或者偶数个,成为奇数个称为奇校验,偶数个称为偶校验。
当传输数据为01011101110101001时候,采用偶校验,此时1的个数为10个,偶数个1,此时将数据变为010111011101010010,添加上一个校验位保证1的个数为偶数个,若为奇数个1,校验位写1,使其1的个数为偶数个,在接收方接收到来自发送方的信息时,直接检测1的个数是奇数还是偶数个从而判断是否传输出错;对于校验位的存放位置,在ppp帧格式和以太网帧格式中,都有相应的字节FCS来存放校验位。
其实对于奇偶校验来说,该方法其实是有缺陷的,如果采用奇偶校验的方式,有两位bit数据发生了出错,奇偶校验的方式还可以准确无误的检测出来吗?显示有时候是检测不出来的,所以该方法的误检率还是比较高的。
②CRC循环冗余校验
直接举例解释,对于下图所示的生成多项式,其对应比特串就是10111,也就是发送和双放约定好的生成多项式,根据多项式的比特串求解出此次发送数据的冗余码,将其冗余码加入到MAC帧中的FCS字段,接收方将接收到的数据+FCS字段构成的一串数据和约定好的多项式的比特串进行除法运算,若余数为零,则表示没有差错,若不为零,则表示有差错。
- 发收方根据要发送的信息和生成多项式求解循环冗余码,即求解校验位。
- 接收方检验传送的数据是否出错,使用接受到的数据和生成多项式检验,此次发现,计算结果的余数不为零,则表示产生了误码。
对于CRC校验来说,该方法的检错率是比较高的,所以一般都是采用该方式来检错。