【网络编程】数据链路层协议——以太网协议

一、引入

在这里插入图片描述

我们知道两太不同局域网的主机传递数据并不是直接传递的,而是通过路由器“一跳一跳”的传递过去。
跨网络传输的本质:是由无数个局域网(子网)转发的结果。

所以要理解数据跨网络转发原理,就要先理解一个局域网中数据是如何转发的
它就是以太网协议

  • 局域网通信原理

在同一个局域网内的两太主机是可以直接通信的。
举个例子:

在局域网通信就好像在教室上课老师喊张三的名字,所有人都能听到,只不过分析发现不是喊的自己就忽略掉,只有张三会处理这个消息。这样老师和张三的通信就可以看作是1对1的直接通信。

二、以太网协议

2.1 MAC帧格式

局域网两台主机之间通信必须要封装MAC帧。
在这里插入图片描述

  • 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。
  • 帧协议类型字段有三种值,分别对应IP协议、ARP协议和RARP协议。
  • 帧末尾是CRC校验码。
    在这里插入图片描述
    用红色圈出来的部分就是报头部分。中间的则是数据部分,数据部分包含上层的报头加有效载荷(HTTP、TCP、IP的封装)。

2.2 MAC帧如何将报头与有效载荷进行分离&向上交付?

  • 报头与有效载荷分离

MAC帧的分离方式就是采用定长报头。直接对前面的14个和后边的4个进行提取,剩下的就是有效载荷。

  • 向上交付给哪个协议?

在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可。

2.3 MAC地址

局域网通信,每台主机都要有自己的唯一标识,每一台机器都要配一张网卡,每一个网卡都有一个序列号,这个序列号就是该网卡的MAC地址在全球范围内具有唯一性(其实在局域网内保证唯一性就够了),长度为48位(6个字节)。

在这里插入图片描述

2.4 局域网转发原理(基于协议)

在这里插入图片描述
假设现在要MAC1发送数据给MAC7,那么首先就需要封装一个MAC帧
在这里插入图片描述
每台主机的数据链路层都会收到这个MAC帧,然后进行报头和有效载荷的分离,然后查看目的IP地址发现是MAC7,如果发现不是自己,直接把数据帧丢弃,上层根本就不知道收到了这个数据帧;如果发现是自己,就把有效载荷向上交付。

处理结束后,MAC7也会给MAC1一个应答。
在这里插入图片描述
发送的过程同上。

结论:

其实局域网所有的主机都能收到MAC帧,只不过如果目标MAC地址不等于自己的MAC地址,就直接在数据链路层丢弃掉。

由此在局域网中,网卡有一种混杂模式:就是不丢弃任何的数据帧,全部向上交付,这就是局域网抓包工具的原理。
由此也可以看出HTTPS数据加密的必要性。

  • 数据碰撞

由于以太网中的所有的主机共享一个通信信道,所以多台主机同时发送数据就可能会产生数据碰撞

就类似于在教室我想跟李四说话,但是所有人都在互相说话,就导致李四听不到我的声音。

解决方法:
在同一时刻只允许有一台主机发送数据

怎么保证呢?
两种方法:
1️⃣ 令牌环:谁拿牌谁就能发消息,类比互斥锁
2️⃣ 以太网:如果发生了碰撞,就暂时不发数据,等一段(随机)时间再尝试发送。这种方法叫做主机的碰撞检测碰撞避免算法。

如果我们不断向局域网发送垃圾数据并且不执行碰撞检测和碰撞避免,那么就能让局域网所有主机都无法通信。

由此我们就可以把局域网看成一个临界资源,通过碰撞检测+碰撞避免让任何时刻只有一台主机能够发送消息。

  • 交换机

如果局域网过大,就会导致碰撞的概率增加,所以就有了交换机。

在这里插入图片描述

  • 交换机可以识别到局部性的碰撞,对碰撞的数据不做转发。
    比方说交换机左侧发生了碰撞,并不会影响到MAC3给MAC4发消息。

  • 交换机对正常发送的数据也不会做转发
    比方说MAC1是给MAC5发消息,那么就没必要让交换机的右侧收到消息,右侧的碰撞概率就减小了。

交换机的核心作用:划分碰撞域。

那么一台主机发送数据的时候,是长的好还是短的好呢?

2.5 IP地址与MAC地址

IP地址描述的是路途总体的起点和终点
MAC地址描述的是路途上的每一个区间的起点和终点

IP就是一个大目标,MAC就是实现大目标的每一个小目标。

因此数据在路由过程中,源IP地址和目的IP地址可以理解成是不会变化的,而数据每进行一跳后其源MAC地址和目的MAC地址都会变化。

2.6 MTU

MTU(最大传输单元)描述的是底层数据帧一次最多可以发送的数据量,这个限制是不同的数据链路层对应的物理层产生的。以太网对应MTU的值一般是1500字节。

MAC帧规定有效载荷的长度的范围是【46 ~ 1500】。

可以把MTU看作发快递时对包裹的大小限制,不同的物理层可能有不同的MTU。

在这里插入图片描述

2.6.1 MTU对IP协议的影响

如果IP层一次发送的字节数超过了MTU,就需要进行切片,关于切片在上一章讲过【网络编程】网络层协议——IP协议

这里补充一点:

数据在路由器转发的过程路由器也可能会进行切分,因为不同网络的MTU是不同的。这样我们可以把IP协议中的不可切分字段置为1,如果遇到MTU较小的,直接舍弃掉数据,重发重新选择路径,这样就可以选出一条吞吐量大的路径

2.6.2 MTU对UDP和TCP协议的影响

如果UDP和TCP携带的数据过大,超过MTU,对于UDP来说就直接丢包了,对于TCP就是数据重传。
所以可以得出切片是不好的。

  • 如何减少分片

如果传输层控制好一次交给IP的数据量不要太大,那么数据在IP层自然也就不需要进行分片。
TCP作为传输控制协议,它需要控制有效载荷数据不能超过某一阈值,这个阈值就叫做MSS(最大报文段长度)
MAC帧的有效载荷最大为MTU,TCP的有效载荷最大为MSS,由于TCP和IP常规情况下报头的长度都是20字节,因此一般情况下 MSS = MTU - 20 - 20,而MTU的值一般是1500字节,因此MSS的值一般就是1460字节。
所以一般建议TCP将发送的数据控制在1460字节以内,此时就能够降低数据分片的可能性。

这也解释了为什么滑动窗口范围内会有多个报文段,不能直接一起发送,就是因为一次不允许发送太大的单个数据段。

三、ARP协议

3.1 ARP协议的作用

当跨不同子网的两太主机A和B通信,最终数据会送到主机B局域网中的路由器D,我们知道D和B属于同一个局域网,那么就得封装MAC帧进行通信,但是报文中只含有B的IP地址,并不知道B的MAC地址。

这就需要有一个过程让路由器获取主机B的MAC地址。

ARP协议的作用就是根据IP地址来获取目标主机的MAC地址。

  • ARP协议的宏观工作流程

现在在一个教室上课,老师第一次来,不认识每个人,只知道每个人的学号,那么老师怎么知道每个人的姓名呢?
可以直接叫学号,然后得到这名同学的反馈,然后就建立了学号和姓名的映射关系

当路由器收到数据要发送给目标主机的时候,就会封装ARP报文,广播报文,寻找匹配的目标IP,目标主机收到ATP后会封装一个ARP应答,该应答里包含了自己的MAC地址。由此路由器就知道了目标主机的MAC地址,然后才会把数据包封装MAC帧进行发送。

3.2 ARP数据报的格式

在讲ARP数据报格式之前先讲一个知识点:
因为ARP里面包含了IP,所以ARP协议协议属于MAC帧的上层协议
在这里插入图片描述
所以MAC帧在封装的时候,不仅仅有IP报文,还有可能是ARP请求/应答。

在这里插入图片描述

  • ARP报文格式

在这里插入图片描述
这里的前三个字段是MAC帧的报头,所以真实的ARP请求只有后面的部分:

硬件类型指链路层的网络类型,1为以太网。
协议类型指要转换的地址类型,0x0800为IP地址。
硬件地址长度对于以太网地址为6字节,因为MAC地址是48位的。
协议地址长度对于IP地址为4字节,因为IP地址是32位的。
op字段为1表示ARP请求,op字段为2表示ARP应答

后边四个字段就是用来ARP的请求和响应的。
如果后边一些字段不清楚例如目的MAC地址,就可以填成全F标识没有被设置。

3.3 ARP协议的工作流程

在上面讲过ARP协议的宏观工作流程,现在我们来填写以下ARP报文的字段。

3.3.1 ARP的请求过程

在这里插入图片描述
假设现在路由器A构建ARP请求发送给B。

  • 构建ARP请求

硬件类型填1,因为是以太网通信。
协议类型填0800,因为是IP协议的转化。
硬件地址长度和协议地址长度分别设置为6和4,因为MAC地址的长度是48位,IP地址的长度是32位。
op字段填1,因为是ARP请求。
以太网地址和发送端IP地址,对应就是路由器A的MAC地址和IP地址。
目的以太网地址和目的IP地址,对应就是主机B的MAC地址和IP地址,因为不知道主机B的MAC地址,所以填全F。

在这里插入图片描述

这个报文实际上是在ARP层封装的:
在这里插入图片描述
报文要先向下交付数据链路层进行封装才会发送到局域网。
所以现在要添加以太网帧的报头:
在这里插入图片描述

目的MAC地址并不知道,所以填全F。
源地址就填路由器A的MAC地址。
类型就填0806,因为MAC帧当中的帧类型字段设置为0806。
最后要加上CRC校验。

在这里插入图片描述
MAC帧封装完毕后,路由器A就可以将封装好的MAC帧以广播的方式发送到局域网当中了。

假设现在MAC2主机收到了这个报文,解包后发现目标MAC是全F,就是广播的,当识别到MAC帧当中的帧类型字段为0806后,便知道这是一个ARP的请求或应答的数据包,于是会将MAC帧的有效载荷向上交付给ARP层
当ARP收到数据包后,先比对op字段,判断是请求还是响应。发现是1就是请求,然后提取目的IP字段,发现不是自己,就在ARP层直接丢弃数据包。

3.3.2 ARP的应答过程

  • 构建ARP响应

op填2,表示应答。
目标MAC就填路由器A。
其他同理ARP请求。

在这里插入图片描述
为了发送到局域网,所以加下来封装MAC帧报头:
在这里插入图片描述
MAC帧封装完毕后,主机B就可以将封装好的MAC帧发送到局域网当中了。

所有主机都会收到这个MAC帧,看到MAC帧报头中的目的IP如果不是自己,就直接丢弃了,不会传递到ARP层
当路由器A的ARP层收到这个数据包后,先看的op字段为2,于是判定这是一个ARP应答,然后就会提取发送端以太网的地址和发送端IP地址,此时路由器D就拿到了主机B的MAC地址。

总结一下:
所有ARP层收到数据包后,都会先看op字段,如果是请求,那么就构建应答,如果是响应,那么就提取源IP和源MAC地址就能知道对方的IP和MAC地址了。

3.4 ARP缓存表

我们知道局域网通信要用到MAC地址,所以要使用ARP协议通过IP得到MAC地址,难道每次都要用这个流程吗?

不是,它会把这个结果缓存起来。每次发起ARP请求后都会建立对应主机IP地址和MAC地址的映射关系,每台主机都维护了一个ARP缓存表,我们可以用arp -a命令进行查看。

在这里插入图片描述
需要注意的是,缓存表中的表项有过期时间,这个时间一般为20分钟,如果20分钟内没有再次使用某个表项,那么该表项就会失效,下次使用时就需要重新发起ARP请求来获得目的主机的硬件地址。这主要是因为IP地址是会发生变化的

3.5 RARP协议

RARP(反向地址转换协议),是根据MAC地址获取IP地址的协议。
有时候我们只知道MAC地址而不知道IP地址,当然这种情况非常少。

在同一局域网内知道了MAC地址就可以直接向给主机发送消息了,因此我们可以直接发消息询问对方的IP地址就行了。

3.6 ARP欺骗

假设现在有一个局域网,每个主机内部都有ARP缓存表如下:
在这里插入图片描述
但此时来了一个中间人,它封装大量假的ARP请求发送给MAC1,里面写的是IP4:MAC3,同理给路由器发送IP1:MAC3

在这里插入图片描述
这样MAC3就成为了中间人,这种操作叫做ARP欺骗。



猜你喜欢

转载自blog.csdn.net/qq_66314292/article/details/131831351