数据链路层 上

数据链路层 上

Scroll Down
请注意,本文发布日期:  195  天前,最后编辑日期:  139  天前,内容可能已经不具有时效性,请酌情参考。

一、数据链路层

数据链路层属于计算机的底层,数据链路层使用的信道主要有两种:

  • 点对点信道:该信道使用一对一的通信方式
  • 广播信道:该信道使用一对多的通信方式

由于数据在局域网内传递并不需要通过路由器,所以局域网属于数据链路层范围。每台主机所使用的数据链路层协议可能不同。

二、使用点对点信道的数据链路层

1.数据链路层和PDU

链路:从一个节点到相邻节点的一段物理链路,中间没有其他任何节点

数据链路:物理链路+通信协议,当需要在一条线路上传送数据时,除物理链路外,还必须有必要的通信协议来控制这些数据的传输。

PDU:协议数据单元,每层的PDU叫法是不同的

Tips:数据链路层PDU叫帧、网络层PDU叫IP数据报

数据链路层的作用:将网络层传递下来的PDU加上自己的头部和尾部组成了帧,然后发送到链路上;以及将接收的帧,剥离数据链路层头部,交给上面的网络层。

点对点信道的数据链路层通信步骤:

  • 1st.A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧
  • 2nd.A发送帧到B
  • 3rd.B收到的帧无差错,则从收到的帧中提取出IP数据报交给上面的网络层;帧出错,丢弃该帧

2.基本问题

我们从点对点信道的数据链路层通信步骤中产生了三个问题,不同的数据链路层如何处理封装成帧透明传输差错检测

1) 封装成帧

封装成帧就是指在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到帧后,根据首部和尾部的标记,从而识别帧的开始和结束。

帧长度 = 首部 + IP数据报(≤MTU) + 尾部

20200419195536

为了提高帧的传输效率,帧的数据部分(即IP数据报)尽可能地大,但是每种数据链路层协议都规定了传送的帧的数据部分长度上限——最大传送单元(即MTU)

帧首部和尾部是如何规定的(即帧如何定界的),通过帧定界符,ASCII码中的不可输出的控制字符SOHEOT。SOH用于帧的最前面表示帧的开始,EOT用于帧的最后面表示帧的结束。注意SOH和EOT都是控制字符名而不是三个字符!帧定界符的重要作用就是在发送方未发送完整个帧时出现错误,后恢复正常,会重新发送该帧,接收方也知道该帧并不完整,丢弃该帧。

2) 透明传输

透明传输就是指数据部分不出现SOH或EOT的帧定界符,如果出现了,就会出现帧定界的错误。

保证透明传输的方法:在SOH和EOT前面插入ESC转义字符(该过程叫字符填充),让接收端不将SOH或者EOT解释为控制字符,然后交给网络层时,剔除帧定界符和转义字符。如果转义字符也出现在数据中,那么仍然加上ESC来进行转义。

SOH、EOT、ESC所对应的十六进制为01、04、1B

3) 差错控制

差错分为:比特差错传输差错

  • 比特差错:指传输中1变为0,0变为1
  • 传输差错:帧中无比特差错,但是出现帧丢失、帧重复、帧失序

由于通信链路并不是理想的,所以在计算机传输数据时,必须进行必要的差错检测,差错检测就是指如何处理在传输过程中可能会出现的比特差错和传输差错。

比特差错避免机制

目前数据链路层广泛采用的比特差错检测方式为循环冗余检验CRC的余数R

循环冗余校验原理:

  • 1st.发送端,先把数据划分成组,假定每组k个比特,假定传输的数据M=101001(k=6),在数据M后添加供比特差错检验的n位冗余码,然后构成一个帧发送出去,一共发送k+n位,尽管增加了传输开销,但是可以进行比特差错校验!
  • 2nd.N位冗余码计算方法:M=101001(k=6),收发双方事先讨论好长度为n+1位的除数P,假定讨论好的P=1101(n=3),用二进制的模2运算进行2n乘M的运算(即相当于在M后添加了n个0),得出2nM=101001000,然后计算(2^n M)/P取余001,得到的余数R作为冗余码拼接在数据M的后面发送出去。这种为了校验比特差错的冗余码称为帧校验序列(即FCS)
  • 3rd.所以最后发出的帧为101001001
  • 4th.接收端,将收到的101001001进行CRC校验(把收到的每一个帧都除以同样的除数P),然后检查得到的余数R,如果传输过程中没有出现比特差错,那么经过CRC校验后得到的余数R肯定是0,如果出现比特差错,而余数R为0的几率是非常非常小的。

传输差错避免机制

如果整个传输中没有出现比特差错,但是出现了传输差错,即以下几种情况:

  • 帧丢失:收到#1-#3
  • 帧重复:收到#1-#2-#2-#3
  • 帧失序:收到#2-#1-#3

OSI的观点是让数据链路层向网络层提供可靠传输服务,这句话的意思是传输差错由数据链路层协议解决,在通信链路质量差的情况下数据链路层协议可以拥有向网络层提供可靠传输服务。但是随着科技的发展,通信链路质量引起的传输差错已经很低了,这就不需要让数据链路层协议提供可靠传输服务了。所以目前互联网就采取了区别对待的方法:

  1. 对于通信质量良好的传输链路,数据链路层协议不要求数据链路层向网络层提供可靠传输服务,而是由传输层的TCP协议来完成可靠传输服务
  2. 对于通信质量不好的传输链路,数据链路层需要向网络层提供可靠传输服务

三、数据链路层协议之一 —— PPP协议

1.PPP协议的特点

PPP协议就是数据链路层协议的一种,也是目前使用最广泛的数据链路层协议。通常用户需要使用PPP协议来连接用户到ISP的链路上,采用了这种协议的链路,才是数据链路。

PPP协议是由IETF制定,在1994年成为互联网的正式标准[RFC 1661]

20200419200554

设计PPP时必须要遵循几个要求:简单封装成帧差错控制透明传输支持多层网络协议支持多种类型链路

简单

由于最复杂的部分放在了TCP协议中,而网际协议IP则相对比较简单,它提供的是不可靠的数据报服务,所以数据链路层协议无需提供比IP协议更多的功能。所以对数据链路层的帧,不需要纠错,序号,流量控制。

封装成帧

PPP规定的帧定界符为0x7E(其中0x表示十六进制),用于标识PPP帧的头部和尾部

透明传输

当PPP使用异步传输时(逐个字符传输),它规定转义字符为0x7D,并使用字节填充。字节填充方法如下:

  • 把数据部分出现的每一个0x7E字节变为0x7D,0x5E
  • 把数据部分出现的一个0x7D字节变为0x7D,0x5D

当PPP使用同步传输时(一连串比特连续发送),它规定使用零比特填充方法来实现透明传输:

  • 发送端:只要发现11111,立即在后面填入一个0
  • 接收端:只要发现11111,立即删除后面的一个0

差错控制

PPP协议必须能够对收到的帧进行检测,并立即丢弃有差错的帧。如果不在数据链路层进行差错检测,那么出现错误的帧就会被传输到网络层,这样会浪费网络层资源

支持多层网络协议

当点对点链路所连接的是局域网或路由器时,PPP必须同时支持在链路所连接的局域网或路由器上运行的各种网络层协议(IP、IPX),这句话的意思就是PPP协议作为数据链路层协议,必须向网络层协议提供部分功能,PPP不能只能对一种网络层协议提供这些功能,而是需要支持多种网络层协议,因为在现今网络中,不同的网络往往使用不同的网络层协议。

支持多种类型链路

PPP需要在多种类型的链路上运行,比如串行、并行、同步、异步、低速、高速、电、光、交换、非交换的链路

比如PPPOE协议(RFC 2516),在以太网上运行的PPP,这是PPP协议能够适应多种类型链路的一个典型例子。PPPoE是为宽带上网的主机使用的链路层协议。这个协议把PPP帧封装在了以太网帧中(当然需要增加一些能够识别各用户的功能)。宽带上网时由于数据传输速率高,因此可以让多个连接在以太网上的用户共享一条到ISP的宽带链路。现在,即使是只有一个用户利用ADSL进行宽带上网(并不知道和其他人共享ISP的宽带链路),也是使用PPPoE协议

同时,PPP协议支持的MTU(即最大传送单元)为1500字节

2.PPP协议的帧格式

20200419201212

20200419201222

其中首部第四个字段是协议字段,当协议字段为:

  • 0x0021时,数据部分就是IP数据报
  • 0xC021时,数据部分就是LCP的数据
  • 0x8021时,数据部分就是网络层的控制数据

3.PPP协议的工作状态

PPP帧格式清楚后,我们需要知道PPP是如何进行初始化的。PPP工作如下:

20200419201308

  • 1st.用户PC拨号呼叫路由器时,在双方建立物理层连接后,PPP进入链路建立状态
  • 2nd.LCP开始协商配置参数,发送了LCP配置请求帧(PPP帧),协议字段为0xC021,数据部分包含了配置请求。ISP端可以发送以下几种响应:
配置确认帧:所有选项都接受

配置否认帧:所有选项都理解但不能接受

配置拒绝帧:选项无法识别/不能接受,需要协商

配置参数包含了:最大帧长、验证协议(PAP、CHAP)
  • 3rd.协商结束后就建立了LCP链路,开始验证,这一状态只允许发送LCP协议的分组、验证协议的分组、检测链路质量的分组。如果验证成功,进入网络层协议状态
  • 4th.PPP协议两端的网络层可以运行不同的网络层协议,但仍然可使用同一个PPP协议进行通信。
    如果PPP链路上运行的是IP协议,则对PPP链路的每一端配置IP协议模块(如分配IP地址)时就要使用NCP中支持IP的协议——IPCP。IPCP分组也可以封装成PPP帧。
  • 5th.当网络层配置完毕后,链路进入了可进行数据通信的链路打开状态,链路两端的PPP端点可以彼此向对方发送分组。两个PPP端点还可以发送回送请求LCP分组和回送回答LCP分组,以检查链路状态

当然,PPP协议使用点对点信道的数据链路层协议

四、数据链路层协议之一 —— DIX ethernet V2

1.局域网的数据链路层

局域网(LAN):网络由一个单位所拥有,且地理范围和计算机均数目有限

局域网特点:拥有比广域网(WAN)具有更高的数据率、较低的时延和较小的误码率,但随着光纤技术在WAN中的使用,现在的WAN也拥有着很高的数据率和很低的误码率

局域网的优点:

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

在20世纪80年代左右,局域网的标准很多,有关厂商在商业上的激烈竞争,其中有两个局域网标准分别是DIX ethernet V2和IEEE 802.3。因为这两个局域网标准的差别较小,人们常把802.3局域网标准称为“以太网”,但是严格来说,DIX ethernet V2才是以太网。20世纪90年代经常使用的局域网标准只剩下了DIX ethernet V2。再经过40多年发展后,从快速以太网(100Mbit/s)、吉比特以太网(1 Gbit/s)、10吉比特以太网(10 Gbit/s)相继出现在了市场中,以太网的标准已经在局域网中占了绝对优势。所以现在的局域网一般都指以太网。

计算机和外界局域网的连接是通过网络适配器(也称网络接口卡,即NIC)这个设备来实现的,NIC和局域网之间的通信时通过双绞线以串行传输的方式进行的。由于计算机内部使用的是并行传输,所以NIC还有一个重要功能就是进行数据串行传输和并行传输的转换。同时由于网络上的数据率和计算机总线上的数据率并不相同,因此NIC中还得装有对数据进行缓存的存储芯片。光有NIC这个硬件也是不行的,需要有相对应的驱动程序,驱动程序会告诉NIC,应当从存储器的什么位置上把多大的数据块发送到局域网,相反从局域网存数据块到存储器的什么位置上,同时NIC需要实现以太网协议。NIC在接受和发送各种帧时,不使用CPU,这样减轻CPU的工作压力。当NIC收到有错误的帧时,直接丢弃而不用通知计算机;当NIC收到正确的帧时,它使用中断来通知计算机,并交付给协议栈中的网络层。

局域网可使用多种传输媒体, 10Mbit/s-10Gbit/s的局域网都可以使用双绞线。当数据率很高时,需要使用光纤作为传输媒体。

局域网使用的是广播信道,可以进行一对多的通信。所以广播信道要决绝的问题就是如何合理的共享通信媒体资源,那么采用的是多点接入技术,多点接入技术的特点就是信道并非在用户通信时固定分配给用户,而是采用了一种叫随机接入的方式,其特点就是所有的用户可随机地发送信息。但如果两台或多个用户同时发送信息,那么会在共享媒体上发生碰撞(也称冲突),使得这些用户的发送都会失败。所以,必须要有解决碰撞的网络协议。所以总线型的局域网需要用到CSMA/CD这个解决碰撞的网络协议。以前由于使用集线器较多,集线器的机理是所有接口处于同一个碰撞域下,所有的主机处于同一个碰撞域下,所以CSMA/CD技术来减小碰撞。那么现如今集线器已经被抛弃,大多采用的是交换机,而交换机的机理就是每个接口是单独的碰撞域,所以连接到该交换机的局域网不是总线型的局域网,所以就不需要用到CSMA/CD技术,但是如果使用到半双工模式,一个接口中的接受和发送就产生冲突了,这个时候CSMA/CD就会侦听来避免碰撞的发生。

CSMA/CD工作机理具象化描述:如果你听见有人在发言,那就必须停下来等别人讲完,但如果有时碰到两个人同时发言,那么就发生了碰撞,大家必须立即停止发言,等听到没人发言时你再发言。这就是CSMA/CD的工作机理,CSMA/CD全称载波侦听多路访问/冲突检测

无连接工作方式:不必先建立连接就可以直接发送数据

Tips:局域网上的计算机人们一般称为“主机”、“工作站”、“站点”、“站”,这些词都是同义词

为了通信的方便,以太网采取了两种措施:

  • 01、采用无连接的工作方式:因为局域网的广播信道质量很好,产生差错的概率较小,所以NIC对发送的数据帧不进行编号,也不要求对方发回确认。因此,以太网提供的服务是不可靠交付。当目的主机收到帧经过CRC检测后,发现有差错就直接丢弃该帧,其他什么都不做,对差错帧是否需要重传则由高层来决定。如果高层使用了TCP协议,那么TCP发现丢失了一些数据,于是TCP要求将这些数据重新传递给以太网进行重传。但是以太网并不将其当作重传帧,而是当作新的数据帧来发送。
  • 02、以太网发送的数据采用曼彻斯特编码:就是采用高低电压交替出现的信号

2.以太网的MAC层

在局域网中,MAC地址(又称物理地址或硬件地址或以太网地址),MAC地址是指每一台主机中固化在NIC中的地址,能唯一标识一个NIC。MAC(media access control address)地址为48位,形象的说就是标识一个人身份的身份证,不管你到了地球上的哪个角落,你都不会改变身份证的信息,具有唯一性。

Tips:MAC地址不是标识一台主机,而是标识一个NIC!因为主机中的NIC损坏是可以更换NIC的,更换的NIC则拥有了不同的MAC地址。或者说一台主机中可以安装多个NIC,那么就拥有了多个MAC地址,所以更准确的说MAC地址应当是某个接口的标识符。

IEEE的注册管理机构RA是局域网全球地址的法定管理机构,它负责分配地址字段6字节的前3个字节(称为组织唯一标识符或公司标识符,OUI)。生产局域网适配器的厂家都必须向RA购买OUI,RA再分配OUI给该厂商。比如TP-link公司生产的适配器的MAC地址的OUI为24:69:68。6字节的后3字节由该公司自行分配,只要保证生产的适配器没有重复地址即可,可见一个OUI可以生产2^24个不同的MAC地址。用这种方式得到的48位地址称为EUI-48。但值得注意的是24位的OUI不能够单独用来标志一个公司,因为一个公司可能有几个OUI,也可能有几个小公司合起来购买一个OUI。在生产适配器时,这种6字节的MAC地址已被固化在适配器的ROM中。因此,MAC地址也叫做硬件地址或者物理地址。

地址记法中有两种标准:

  • 第一种:把每个字节的最低位写在最左边(IEEE 802.3标准采用这种记法)
  • 第二种:把每个字节的最高位写在最左边
    在发送数据时,两种记法都是按照字节的顺序发送,而在每一个字节中的发送顺序都是从低位到高位,即先发送该字节的最低位,最后发送该字节的最高位。

OUI中的第一个字节的最低位叫I/G位,表示individual/group:

  • I/G=0时,地址字段表示一个单个站地址
  • I/G=1时,地址字段表示一个组地址,用来进行组播(又称多播)
    因此,RA只分配地址字段的前三个字节中的23位,当I/G位分别表示0和1时,一个地址块分别生成223个单个站地址和223个组地址。

OUI中的第一个字节的最低第二位叫G/L位,表示global/local:

  • G/L=0时,表示全球管理,保证在全球没有相同的地址,厂商向IEEE购买的OUI都属于全球管理
  • G/L=1时,表示本地管理,用户可任意分配网络上的地址。以太网不会理会G/L=1时的地址

这样,在全球管理时,对每一个站的地址可用46位的二进制数字来表示(最低位和最低第二位为0),剩下的46位组成了地址空间可以有2^46个地址,已经超过70万亿个,可保证世界上的每一个适配器都可有一个唯一的地址。当然,迟早会用完的,在2020年会考虑MAC地址耗尽的问题。

当路由器通过适配器连接到局域网时,适配器上的MAC地址就用来标志路由器的某个接口。路由器如果同时连接到两个网络上,那么它就需要两个适配器和两个硬件地址。

适配器拥有过滤功能,当适配器从网络上每收到一个MAC帧就先用硬件检查MAC帧中的目的地址。如果是发往本站的帧则就收下,然后再进行其他的处理。否则就将此帧丢弃,不再进行其他的处理。这样做就不浪费主机的CPU和内存。发往本站的帧分为:

  • 单播帧(unicast):收到的帧的MAC地址与本站的硬件地址相同
  • 广播帧(broadcast):发送给本局域网上的所有站点的帧(全1地址)
  • 多播帧(multicast):发送给本局域网上一部分站点的帧

所有的适配器都至少应当能够识别前两种帧,有的适配器可以通过编程方法来识别多播地址。很显然,只有目的地址才使用广播地址和多播地址。以太网适配器还可设置为一种特殊的工作方式,即混杂模式。工作在混杂模式的适配器只要“听到”有帧在以太网上传输就都悄悄地接收下来,而不管这些帧是发往哪个站。这样做实际上是窃听其他站点,而不中断其他站点地通信。

常用以太网地MAC帧格式有两种标准:DIX ethernet V2、IEEE 802.3。假设网络层使用的是IP协议,使用其他网络层协议也可以。下图是V2的MAC帧格式:

20200419202107

V2的MAC帧较为简单,由5个字段组成:

  • 目的地址字段:目的MAC地址
  • 源地址字段:源MAC地址
  • 类型字段:用来标识上一层使用的是什么协议,以便把收到的MAC帧数据部分上交给上一层的这个协议。
  • 数据字段:长度从46-1500字节;最小长度64字节-18字节的首部和尾部长度
  • FCS字段:用于CRC校验

这里需要指出V2的MAC帧格式中,首部并没有一个帧长度字段,那么接收方如何知道从接收到的以太网帧中取出多少字节的数据交付给上一层协议呢?前面讲到,以太网使用的是曼彻斯特编码,曼彻斯特编码特点就是在曼彻斯特编码的每一个码元的正中间有一次电压的转换(1到0,0到1)。当发送方把一个以太网帧发送完毕后,就不再发送其他码元了,因此发送方NIC的接口上的电压也就不变化了。这样接收方就可以很容易地找到以太网帧的结束位置,在结束位置前数4个字节,就能确定数据字段的结束位置

当数据字段的长度小于46字节时,V2标准就会在数据字段中加入一个整数字节的填充字段,以保证以太网的MAC帧长不小于64字节。我们应该注意到,MAC帧的首部并没有指出数据字段的长度是多少,在有填充字段的情况下,接收端的MAC在剥离首部和尾部后就把数据字段和填充字段一起交给了上层协议。现在的问题是:上层协议如何知道填充字段和长度呢(网络层应当丢弃没有用处的填充字段)?其实网络层协议具有识别有效的数据字段长度的功能。如果是IP协议,那么IP首部有一个总长度字段,总长度字段+填充数据长度=MAC帧数据字段的长度,比如当IP数据报的总长度为42字节时,填充字段共有4字节,当MAC帧把46字节的数据上交给IP后,IP层就把其中最后4字节的填充数据丢弃。

为什么要在MAC帧前多加8字节?因为考虑到接收方的适配器始终尚未与到达的比特流达成同步,因此MAC帧的最前面的若干位就无法接收,结果使整个的MAC成为无用的帧。

数据链路层 下