数据链路层

目录

一、以太网

1.重识网络的数据转发过程

2.以太网

二、MAC地址

1.认识MAC地址

2.MAC地址的作用

3.MAC地址的全球唯一性

(1)MAC地址为什么需要全球唯一?

(2)MAC地址的全球唯一如何保证?

三、MAC帧协议的格式

四、局域网的通信原理

1.局域网的转发原理

2.碰撞

3.MTU

4.交换机

五、ARP协议

1.认识ARP协议

2.协议格式

3.ARP请求和响应过程

4.ARP缓存表

六、回顾整个协议栈


我们完成了传输层TCP、UDP和网络层IP协议的讲解,现在我们进入数据链路层,学习MAC桢协议和ARP协议。

一、以太网

1.重识网络的数据转发过程

我们前面经常说IP报文会在节点之间不断跳跃,但是网络层IP协议还是要将数据报向下交付给数据链路层。

如图所示,每个红圈都是一个局域网,假设现在主机B要将数据发送到主机C,这个数据就要经过多个局域网,一跳一跳到达主机D。

所以网络传输的本质,就是数据在多个局域网(子网)转发。

2.以太网

一方面,一个局域网中有多台主机,这些主机之间通过网线连接(所谓的无线局域网就是主机间不用网线连接),保证了主机间的可以直接通信;另一方面,数据链路层的协议负责局域网中的数据传送,而数据链路层最主要的协议就是mac桢协议,也叫做以太网协议。

下图就能表示一个局域网,多台mac地址不同的主机在一个局域网中并按以太网协议通信。其中mac1是该局域网的入口路由器,因为它也有网卡,具有网络通信的能力,故可以看成是一台主机。

我们能得到以下结论:

  • “以太网”并不是一种具体的网络,而是一种技术标准,它包含数据链路层的内容和一些物理层的内容。
  • 以太网规定了网络的拓扑结构(网段划分)、访问控制方式、传输速率等,网线必须使用双绞线。而且不同的双绞线传输速率不同,有10M\s, 100M\s, 1000M\s等。
  • 以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等它们原理相似,但实现不同。

不管是什么类型的网络,都是用来组成局域网进行网络通信的。

二、MAC地址

1.认识MAC地址

每台支持上网的主机都至少有一张网卡,每个网卡都会有一个唯一的,硬件上不可修改的序列号,这个序列号被称为MAC地址(媒体访问控制地址),该地址在全球范围内具有唯一性。

MAC地址是一个6字节的十六进制序列号,如1A:2B:3C:4D:5E:6F。

2.MAC地址的作用

IP地址已经能标定主机的唯一性了,为什么还要有MAC地址呢?

我哈还是用之前的例子,比如说我要从天津市武清区杨村到天津市和平区的劝业场,那我就需要从高德地图等软件上查找可选择的路线。

我先去创意米兰公交站等749路公交,坐公交到北辰道地铁站。那我的上一站就是家,下一站就是北辰道地铁站。

我到达地铁站后,我要从北辰道站坐地铁转运到和平路站,此时我的上一站就是创意米兰公交站,下一站就是和平路地铁站。

从和平路地铁站出来后,我要沿着和平路走350米到劝业场.此时我的上一站就是北辰道地铁站,下一站就是天津劝业场。

最后我走到劝业场就可以了,但在这其中我的起始地址家和最终地址天津劝业场始终没有发生改变,而上一站和下一站的地址一直在变。

其实对于跨网络的通信也是一样的,最早发送数据的主机IP叫做源IP,最终数据的目的主机IP叫目的IP。

IP地址描述的是整个数据跨网络传送过程中的起点和终点,而MAC地址描述的是数据传送过程中,局域网内每一跳的起点和终点。

3.MAC地址的全球唯一性

(1)MAC地址为什么需要全球唯一?

MAC地址严格来说不需要全球唯一,只需要保证同一个局域网中的唯一性即可。但人们是可以携带电子设备移动的,MAC地址是在硬件上定死的。所以,谁也无法保证局域网内不会出现同样的MAC地址。

而且MAC地址数量也足够多,MAC地址就被设置为了全球唯一。

(2)MAC地址的全球唯一如何保证?

MAC地址统一由IEEE(电气电子工程师学会)进行管理和分配,厂商只有得到IEEE的授权后,才能生产网卡。在之前介绍C语言浮点数的储存时我们也提到过这个组织。

每个MAC地址由两部分组成,分别是供应商代码和序列号。其中前24比特位代表供应商代码。剩下的24位由厂商自己分配。所以IEEE保证前24位不重复,各个厂商再保证后24位不重复,整个48bit的MAC地址就不会重复。

三、MAC帧协议的格式

下图就是MAC帧协议的格式,相比TCP、UDP和IP协议简单许多,报头只有三个字段:

  • 目的地址:接收方网卡的MAC地址,6字节,48比特位。
  • 源地址:发送方网卡的MAC地址,6字节,48比特位。
  • 类型:2字节,表示需要交付的上层协议类型,有三个值,IP对应0800、ARP对应0806、RARP对应8035。ARP和RARP后面会介绍。

  • CRC:校验码,4字节,用来校验数据是否正确,类似TCP/IP的校验和。

还是老问题,如何实现报头和有效载荷的分离?

MAC桢协议采用定长报头方式,直接按长度截取即可,简单粗暴。

目的MAC地址和源MAC地址都是6字节大小,协议类型字段2字节大小,末尾校验和CRC占4字节。而MAC桢的有效载荷不能大于MTU,所以有效载荷的大小是46~1500字节。至于46这个数字我们后面再讲它的来头。

也就是解包的时候,从整个数据帧读取前14个字节,再从最后读取4个字节,剩下的就是有效载荷。分用的时候,根据帧协议类型交给对应的上层协议即可,如类型为0800就交给网络层的IP协议处理。

四、局域网的通信原理

1.局域网的转发原理

以太网的通信原则如下:

所有的主机都接入了同一个局域网,所以每一个主机都认为它在与其他主机进行通信。

但是我们不妨想象这样一个场景,在一个班级中有小明、小红、小刚等几十个同学。老师正在前面讲课,讲到一半说:“小明,上来把这个题做一下。”此时,小明就站起来走到黑板前拿粉笔并开始写。

首先,老师讲课,学生听课就可以看作老师向学生传递信息。学生之间有事情也会互相交谈,所以学生之间也可以传递信息。学生也可以向老师问问题,所以学生也可以向老师传递信息。如果把每个人都看作一台计算机,那就可以将这个教室看作局域网,大家可以相互通信。

然后,老师叫小明上黑板做题。这句话其实班级内的所有人都听到了,但是因为老师叫的是小明,所以只有小明做出了反应。小红、小刚等其他人知道老师叫的不是自己,就直接忽略了。

这些放到局域网中也一样,局域网中的所有主机都在相互通信。如果一个主机发送了一条信息,所有的主机也都能收到。只是需要该数据的计算机会处理该数据,其他不需要该数据的计算机虽然收到了数据,但不会处理它。

既然我们已经学过了MAC桢协议,那这个传输过程到底经历了什么呢?

主机MAC4发送了一个数据帧给MAC3,当数据从IP层交给数据链路层后,数据链路层给数据报加上了报头,成为了数据帧,然后发送到网线中传到另一个主机。

局域网中存在多台主机,它们都以网线相连,都能看到以太网中跑的数据。由于网络通信本质上就是跨主机的进程间通信,那么我们就能将网络看作临界资源。

所以局域网中的所有主机都受到了主机MAC4发送的数据.每台主机在收到数据后,数据链路层会对比数据帧报头中的目的MAC地址,如果和自己的MAC地址相同,则进行解包分用交给下一层。

如果数据帧报头中的目的MAC地址和自己的MAC地址不符,那么直接在数据链路层就丢弃该数据,上层根本不知道曾经有过这个数据。

上图中,主机MAC3在数据链路层对比发现报头中的目的MAC地址和自己的MAC地址相同,所以进行解包将数据交付给网络层,然后逐层交到应用层。

2.碰撞

既然主机MAC4可以发送数据,那么其他主机也可以发数据,大家相互独立,互不影响。而且数据会以模拟信号(光信号)的形式在网线(光纤)中传播。

如果在同一时刻,多个主机都向局域网这个共享资源发数据。不同的波就会产生叠加或者衰减,导致原本的光电信号发生变化,引发数据不一致的问题,体现在以太网中就是数据碰撞。所以一个局域网也可以称为一个碰撞域。

为了避免数据碰撞的问题,出现了像令牌环网这样的解决方案。

令牌环网就是在局域网中存在一份数据作为令牌,只有持有该数据的主机才能向网络中发生数据,就像我们多线程中的互斥锁一样。

但以太网仍是最主流的协议,它采用碰撞检测和碰撞避免算法来避免碰撞。

假设,主机MAC1发送了一个数据帧,主机MAC6也发送了一个数据帧,互相发送给对方,这两个数据帧在以太网中发生了碰撞。

主机MAC1和主机MAC6也都能再次接收到自己发送的数据,接收完成后主机可以对比发送前后数据的内容,如果不同就表示发生碰撞了。

主机MAC1意识到碰撞发生了,所以为了避免再次碰撞,主机MAC1会等待一段时间后再重发刚刚的数据。主机MAC7也会采用同样的策略,碰撞了就等一会儿再发。

这就是碰撞检测和碰撞避免算法的大致原理,具体实现可以查其他资料。

可不可以利用碰撞来瘫痪一个局域网?

答案是可以的,如果局域网中有一个主机不断向局域网中发送垃圾数据,且不执行碰撞检测和碰撞避免。那么就会导致其他主机一发送数据就产生碰撞,各主机就会一直处于碰撞检测和碰撞避免的状态。

就类似于教室里有一个人在不停地大声嚷嚷,老师和学生之间的对话就都听不清了。

3.MTU

对于以太网来说,既然会存在碰撞,那么发送的数据帧是长了好,还是短了好呢?

答案是太长和太短都不行。

太短的话,一方面会导致数据帧无法校验,因为CRC校验是需要数据帧中有一定数量的有效载荷的,所以MAC帧协议规定,有效载荷的长度要大于等于46字节;另一方面,如果数据太小,发送的次数就会增加,对通信效率就会由影响。

如果最终交付到数据链路层的有效载荷小于46字节,MAC帧协议也会在后面填充数据到46字节。

太长的话,数据在以太网中传输的时间就会变长,从而增加了数据碰撞的概率。所以MAC帧协议规定有效载荷的最大值是1500字节,也就是最大传输单元MTU。

由于不同类型的局域网有不同的MTU,所以数据在MTU较小的路由器中也会进行分片。

如果IP层收到的数据报长度大于当前网络MTU了,则也需要IP对数据进行分片,然后再交给数据链路层发送。

虽然,我们知道当各个分片都遵循我们之前学过的组装流程。但是,为了数据的高效传递,就要尽量少分片。

MAC帧的有效载荷在46~1500字节的范围内也会发生碰撞,但概率很小。

数据在以太网中是以光电信号的形式传输的,只要有效载荷在规定范围内,那么碰撞的概率就很小。毕竟光速是非常非常快的,数据传输的时间会很短。

4.交换机

一个局域网中存在很多主机。由于向网络中发送数据的主机变多,导致发生碰撞的概率增加。随着主机越来越多,概率性事件就会成为必然事件。

所以在比较大的局域网中,就会有交换机的存在。如图所示,交换机将局域网分成了两部分,它的左边是一部分,右边是一部分。

如果左边的主机MAC1向右边的主机MAC6发生数据。数据在局域网中传送时,会先经过交换机,再由交换机转发给主机MAC6。

如果主机MAC1向主机MAC2发生数据,就不会通过交换机转发,同理交换机右侧也和左侧一样。

那这样的划分到底有什么作用呢?

交换机可将局域网划分成了多个碰撞域,从而减少了局域网中的数据碰撞。

当主机MAC1向主机MAC6发送数据时,假如左侧的网络发生了碰撞,那么当数据经过交换机时,交换机便不会再转发这个数据,直接丢弃。此时右侧的主机依旧能正常通信,不会受到左侧的影响。

传统的交换机工作在数据链路层,随着不断地研发改造,交换机的能力越来越强大,有了像网络安全等更多的功能。

在全世界,交换机研发领域的公司有很多。在我国最有名的就是以研发交换机起家的华为公司。

C&C08是华为早期自主研发的第一台数字程控交换机的型号名称,可以说它就是华为从一个不知名的小企业走向强大的高科技企业的奠基石。

五、ARP协议

1.认识ARP协议

假如,路由器维护的一个局域网内又新增了一台主机,路由器需要给这个主机发送数据。这个新主机的IP地址我可以从报文中读到,但MAC地址路由器不知道,MAC桢的目的地址无法填写。所以路由器就需要向这个主机发消息,让它把自己的MAC地址传过来。

也就是说,路由器需要有一个认识新主机的过程,本质是获取主机B的MAC地址。

而这个获取本局域网内MAC地址的过程就是ARP协议的工作。

ARP不是单纯的数据链路层的协议,而是介于数据链路层和网络层之间的协议,只是大部分操作都在数据链路层完成。

如图所示,ARP协议处于数据链路层,MAC帧协议在分用的时候,可以将有效载荷分用给ARP协议,PARP协议,还有网络层的IP协议。

前面讲解MAC帧协议格式的时候,报头中的协议类型,其中0800表示IP协议,0806表示ARP协议,8035表示RARP协议,就都对应上了。

2.协议格式

ARP协议的格式如图所示,它的长度是固定28字节,没有有效载荷。

  • 硬件类型:标识数据链路层的网络类型,1表示以太网,我们日常使用的网络都是以太网,所以它基本上是固定的。
  • 协议类型:要转换的地址类型,比如0x0800为IP地址,而且通常情况下地址都是IP地址,也是一个固定参数。
  • 硬件地址长度:对于以太网地址,也就是MAC地址,共为为6字节,也是一个固定参数。
  • 协议地址长度:主流使用IPv4,对应为4字节,也是一个固定参数。
  • op:为1表示ARP请求,为2表示ARP应答。
  • 发送端以太网地址和发送端IP地址,以及目的以太网地址和目的IP地址就是双方的IP和MAC地址。

ARP协议的数据也需要先交付给MAC帧协议,MAC桢协议会为它加上报头,然后再发送到局域网中。

既然ARP报文有请求,也有应答,所以在局域网中一个主机很可能会同时收到需要请求和应答的报文。

那么又一个问题出现了,当一个ARP报文到达了ARP层后,ARP应该怎么先看哪个字段,后看哪个字段,快速判断每个报文的处理方式呢?

首先,ARP协议的请求和应答有完全不同的处理方式,op字段为1表示请求,为2表示应答。所以,拿到一个ARP报文后应该先看op确定报文的类型。

然后,看目的IP,目的IP如果跟自己的不一样,直接丢弃就好。如果一样,再去处理。

3.ARP请求和响应过程

对于一个主机,路由器要怎么获取它的MAC地址呢?我们不妨看看下面的过程:

假设局域网内MAC3是一个新接入的主机,MAC1是路由器,现在路由器要获取新主机的MAC地址MAC3。

首先,路由器需要构建一个ARP报文,填好数据。

接着,将该报文向下传递到MAC桢协议,加上MAC桢协议的报头,广播发送到网络中。

提示三点,第一,路由器要获取新主机的MAC地址就需要将目的以太网地址设置为0xFFFFFF,表示我需要这个数据。

第二,MAC桢协议的目的地址设为0xFFFFFF表示在该局域网内的所有主机发送该报文,这个mac地址也可以被理解为广播地址。

第三,这个广播请求所有主机都会接收到,并传递到ARP层。又由于目的IP与自己不同,所以除去MAC3以外的主机都会直接丢弃该报文。

然后,新主机接收到了请求,先看OP发现是请求报文,再看目的IP发现确实是给我的,MAC1需要我的MAC地址。

接下来,新主机也构建了一个应答报文,并向下传递至MAC桢协议发送。

这次由于MAC桢协议的目的地址已经被指定,所以虽然所有主机都能收到这个数据。但对于MAC1以外的主机而言,由于MAC地址不对,在数据链路层这个数据就会被丢弃,ARP层不会知道有这个数据的存在。

最终,新主机受到了这个应答报文,MAC桢协议去掉报头向ARP层交付,路由器拿到了新主机的MAC地址MAC3。

全流程如下图:

正因为ARP协议既涉及了IP地址,报头设计有基于MAC桢协议,所以我们称ARP协议工作在数据链路层和网络层之间。

顺带提一句,RARP协议和ARP协议很类似,它是一个主机知道另一个主机的MAC地址但不知道IP地址时,向另一台主机申请IP地址的协议。主要在路由器配置中使用,日常使用基本接触不到。

4.ARP缓存表

当主机收到ARP应答并找到了需要的MAC地址,操作系统会将局域网内各主机的IP地址和MAC地址建立好映射关系。这些映射关系就会储存在ARP缓存表里。

我在cmd中输入arp -a就能查看ARP缓存表,Linux中也可以使用这个命令。

每一个IP地址都对应一个MAC地址,这些主机都位于一个局域网内,根据缓存表的对应关系就可以支持在IP层路由后,数据链路层准确地将数据发送到局域网内的指定MAC地址处的主机上。

缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效。下次通信时还要发送ARP请求获得目标主机的MAC地址。

由于在子网划分的规则下,只有入网的设备才有IP地址。如果某一个主机断网很久了,另一台新主机正在使用这个IP地址。

在该主机给这个新主机发送数据时,ARP缓存表中的MAC地址如果仍然是旧主机的MAC地址,MAC桢在局域网内都找不到这个MAC地址,所有的主机都会在数据链路层丢弃这个数据,这台新主机也就收不到数据了。

所以,ARP缓存表必须每隔一段时间就更新一次。

六、回顾整个协议栈

下图就是一个数据从主机A的应用层到达主机B的应用层的过程。

主机A:

  • 用户在应用层写好数据以后,通过HTTP或者HTTPS协议封装成网络传输的数据,将报文交付给传输层的TCP或者UDP协议。
  • 如果是使用TCP协议,则报文被先放到了发送缓冲区中,操作系统在合适的时候将其分包封装并交付给网络层IP协议。
  • 如果使用的是UDP协议,则将报文直接封装并交付给网络层的IP协议。
  • 网络层的IP协议在收到TCP/UDP数据段后再将其封装,在IP报头中填充目的IP,源IP等字段,然后将数据报交给数据链路层的MAC帧协议。
  • 最后MAC桢协议发送数据桢到网线内。

路由器:

  • MAC帧协议将数据帧通过局域网交给下一跳的路由器,路由器的数据链路层收到数据帧后,对其解包呈递给上层的IP协议,IP层根据目的地址进行路由,然后再将新的数据报封装,然后将其交付给数据链路层。
  • MAC协议再根据ARP表的映射关系(如果没建立映射,则需要发起ARP请求),将数据报交给下一跳路由器。
  • 这样不断跳转,最终数据会被主机B收到。

主机B:

  • 主机B的数据链路层收到数据后,通过对比发现MAC帧报头中的目的MAC地址和自己的MAC地址相符,进行解包,然后根据帧类型0800将有效载荷交给网络层的IP协议。
  • IP协议发现该数据报中的目的IP地址和自己的相符,也进行解包,去掉IP报头。根据报头中的协议类型,将有效载荷向上传递给传输层的UDP或者TCP协议。
  • 传输层收到数据段后,将报头解包,并且根据报头中的目的端口号,将有效载荷交给应用层的HTTP或者HTTPS协议。
  • 应用层收到报文后,进行解包,将报头和有效载荷分离,对发送过来的数据进行处理。

这就是依靠协议栈(OSI模型)的整个网络通信过程,每一层都有详细的解释,这里仅仅是一个宏观上的描述。

对于OSI模型中还有会话层、表示层和应用层。

会话层表示对链接进行管理,对应我们之前提到的现代APP上的保活机制,控制在合适的时间链接的建立和断开。

表示层表示把数据从网络传输的样式转化为我们正常使用的样式,对应了我们学过的分离有效载荷和序列化反序列化。

应用层就是我们要拿我们能够使用的数据去做事情,比如说之前的网络计算器,内部的数据就能为计算服务。

所以说,OSI模型能从1984年提出,到沿用至今,其定义的准确性和结构性是十分先进的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值