当前位置: 首页 > news >正文

网络原理——数据链路层

文章目录

  • 网络原理——数据链路层
    • 网络层 vs 数据链路层
    • 网络传输中不同层级的配合
    • 认识以太网
      • 以太网帧格式
      • MAC地址
      • 认识MTU和MSS
      • MTU对上层的影响
        • 对网络层IP协议的影响
        • 对传输层TCP的影响
        • 对传输层UDP的影响
      • 查看硬件地址及MTU
      • 理解以太网帧数据的上下限
    • ARP协议
      • ARP协议地位
      • ARP协议的作用
      • ARP协议格式
      • 利用ARP获取MAC地址
      • ARP的细节部分

网络原理——数据链路层

在TCP/IP协议栈中,一共有五层,我们是按照自顶向下的方式学习的!
我们现在可以忽略掉物理层的学习(主要以了解为主),我们来学习最后一层——数据链路层!

网络层 vs 数据链路层

如下图所示,这里展示了一个简单地网络拓扑结构:
在这里插入图片描述

上一次,我们在网络层中,将网络数据传输的时候:
本质是从一个子网到另一个子网!IP地址标识的是两台主机在网络拓扑结构的具体位置。
👉所以,假设B -> C,就得一跳一跳地经过一个个的子网。
👉假设选定好一条路:B要到C,就得依次经过路由器F G H C D,最后再交给C

上述的“一条一跳的逻辑”,其实是因为网络是被设计好的,再配合IP协议的使用,所以:
网络层实际上解决的:是从一台主机到另一台主机的通信路线选择的问题

但是,具体到如何从一个主机跳到下一个主机(路由器),这个是怎么做到的,这就是数据链路层要做的事情!这是属于局域网通信的范畴!

我们可以举一个比较形象的例子:
假设自驾旅游,从广州出发去北京
我们肯定会经过很多的省份,当然路线的选择有很多条 -> 对应的就是路由选择路线多条!
广州和北京是起点和终点 -> 相当于IP地址
期间可能会经过一个个的城市,这就相当于是一个个的中间节点!


有了起点和终点 -> 能够决定总体的路线规划(导航)
具体的路线是按照一个个节点走的!

数据链路层解决的,就是如何在一个子网内,从一个节点跳到另一个节点!

网络传输中不同层级的配合

虽然我们还没有讲数据链路层的具体实现,但是,我们已经知道这一层的作用了。
至此,TCP/IP协议栈的上面四层我们都已经知道他们的功能了!

我们现在就可以来理解一下,这四层是如何进行配合工作的!


下面,我们通过一张图来解释层级之间的作用:
在这里插入图片描述
总的来说就是:
应用层根据具体的业务,制定应用层协议。用于实现一些功能。
然后将报文向下传输传输层的协议用于保证数据安全可靠的传输。但是具体在网络中传输的时候,需要由网络层来规划具体路径,提供的是方法。具体走是让数据链路层来做的!
同时,因为在网络中的传输,可能因为一些原因导致丢包,变得不可靠!所以要传输层通过一系列的传输控制来保证可靠性!

认识以太网

数据链路层,解决的是局域网中两台主机的通信问题!
我们早已知道:目前主流的局域网通信方法有三种,分别是:以太网,无线LAN,令牌环网

目前用到最广泛的就是以太网!所以,这个部分将重点讲解以太网!

以太网帧格式

在上一节将网络原理的时候:我们认为在网络传输的是IP报文!但其实这是不对的。
因为报文从应用层自顶向下传输。是需要进行封装报头的!数据链路层也有协议,也需要封装报头!所以,单纯认为在网络中传输的是IP报文就错了!

其实,局域网的通信过程我们早在学习网络基础的时候就已经说过了:
在这里插入图片描述
在局域网内使用MAC地址(写在硬件设备上的)通信的。当然,一台主机发送到以太网的数据,其他的主机也都能看到!(只不过是判断到dstMAC地址和自己不一样,直接丢弃罢了)。

所以,在网络中传输的,其实不是IP报文!而是一个MAC数据帧!
(当然有办法可以绕过MAC地址,但是这里我们就不考虑了)

在这里插入图片描述
这里我们先不管ARP和RARP的帧格式,我们只看最长的那个!

源地址目的地址是指网卡的硬件地址(也叫 MAC 地址), 长度是48位,是在网卡出厂时固化的;
类型代表的是交付给上层的协议,基本上都是IP协议,协议号为0800(HEX进制)。
帧末尾是CRC校验码。了解即可。

除去首尾,剩余部分就是数据链路层的有效载荷!
这个数据部分可能是IP报文,也可能是ARP,RARP报文。


面对一种协议,我们还是问出那两个问题:
1.如何分离报头和有效载荷?
2.如何分用?

其实答案早已经在上面显现出来了:
①由图可知:以太网帧的报头部分,是定长的!长度6 + 6 + 2 + 4 = 18字节。
未来收到一个以太网帧,从前往后提取14字节, 从后往前提取4字节,剩下就是有效载荷!

②分用,其实就是如何解包后传递给上一层的具体协议!
前面已经说过了,类型字段就是表示上一层的交付协议的!一般是IP协议(0800)。

MAC地址

虽然我们已经在网络基础部分了解过局域网通信了,也知道了MAC地址。
但是这里还是再来复习一下:‘

  • MAC 地址用来识别数据链路层中相连的节点
  • 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
  • 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址)

我们还是以下面这个例子来理解MAC地址和IP地址的区别:
在这里插入图片描述

认识MTU和MSS

我们观察以太网帧格式中的数据部分:
我们可以很清楚的看到: 数据部分的大小是46 ~ 1500字节,是有上限和下限的!

其中,上限1500,也被称为MTU(​Maximum Transmission Unit),最大传输单元!
也就是说,对于数据链路层来说,它能够携带的数据范围,不能超过MTU。

上篇文章讲到:
传输层(如果使用TCP)是不管数据边界的,只负责把数据传输下来,数据链路层只能接收MTU以内的数。所以,在网络层的时候,如果发现超出范围了,就需要网络层进行IP报文的分片,再向下传输进行封装。

也还说了:为了尽可能减少的分片,传输层需要控制一下单次有效载荷数据的大小,经计算得到1460!
这个数字就是MSS(Maximum Sgement Size),最大段尺寸!

MTU对上层的影响

我们先不去理解为什么数据链路层为什么要设置MTU这个最大传输单元。
我们以结果出发,理解一下MTU这个值对上层的一些影响!

对网络层IP协议的影响

网络层基本上就是IP协议,所以我们来看看MTU对IP协议的影响!

其实在讲解IP协议时候,讲到报文分片的内容:
当整个IP报文长度过长的时候,即超过MTU,网络层是需要对IP报文做分片的!

具体的如何分片组装,我们早已讲过,参考:
网络层认识——IP协议 -> IP分片

在这里插入图片描述

对传输层TCP的影响

其实,在网络传输中来说:IP报文分片不是主流!

原因其实很好理解:

1.增大丢包的概率(只要有一个分片丢失就是丢包)
2.分片/组装耗费时间

既然是如此,所以TCP就会控制单次发送报文的有效载荷大小(<= MSS):在这里插入图片描述
TCP报头不包含选项 && IP报头不包含选项的情况下,这两个报头都是定长20byte!
所以MSS = MTU - 40 = 1460!(默认情况)。


MSS协商:
首先要说明的是,MTU这个值并不是一成不变的!是可以进行动态调整的。
👉 这就导致了,通信的双方的MTU大小是不同的!
👉 问题:如果A的MTU大于B的,那A按照自己的标准发送,那B端接收不还是得分片?

在实际通信过程中,确实会有这样的问题!但是有解决方案!
如果说,A和B都能够提前知道对方的MTU大小,不就可以在自己这一端的传输层控制了吗?

那对于TCP来说:什么时候可以进行这样的沟通呢? 答案很明显 -> 建立连接三次握手时!
双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值,然后经过建立连接后,双方就知道了两边的MTU大小!然后双方会取两个MTU的更小的那一个,作为通信的MTU!

Tips: MSS 的值就是在 TCP 首部的 40 字节变长选项中(kind=2);

对传输层UDP的影响

对于UDP来说,其实就简单的多了。
首先,UDP的报头是定长8字节(UDP没有选项字段),IP报头20字节,
所以UDP报文能够发送的最大数据量应该是:1500 - 8 - 20 = 1472字节。

如果超过1472这个数字(一般情况下),就需要对IP数据报进行分片:
这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败。 那么这就意味着, 如果 UDP 数据报在网络层被分片, 整个数据被丢失的概率就大大增加了。

查看硬件地址及MTU

既然说,硬件地址是MAC,是早就写好在设备上的。我们是否能够查找呢?
还有,我们是否可以通过指令查询到MTU的大小,验证确实是1500?

答案很简单,通过指令ifconfig就可以查询出来,如下图所示:
在这里插入图片描述

理解以太网帧数据的上下限

前面我们从结论入手,在已经知道了MTU的情况下,理解了当MTU存在的情况下,对网络通信的一些影响!但是,我们没有搞清楚,为什么要存在这样的上下限!

首先,我们需要回到以太网的通信过程上,重新探究几个细节:
在这里插入图片描述
问题一:上述的通信过程中,为什么主机A要把数据交给主机E?
答案是路由决定的!

报文从上至下传输,到数据链路层前,需要先经过网络层!
路由器存在路由表,本质是主机存在!我们自己的电脑也是可以有路由表的:
在这里插入图片描述
在网络层中,就可以判断目的主机的IP地址是否是当前子网的了!
所以,所谓的路由决定,其实分为两个方面:
①是否要经过路由器?如果处在同一个子网,就向下封装MAC帧,直接向目标主机发送!
②如果需要经过路由器,就需要向下封装MAC帧,向对应的子网出口路由器发送!

问题二:局域网如果同时存在两台主机发送数据怎么办?
这个问题早在网络基础部分的时候就已经说过了:
以太网的本质,就是一个碰撞域!如果同一时间内有多个主机发送数据,必然导致数据碰撞!

所以,为了保证在以太网内的数据传输安全和可靠,就需要实现一种方式:
能够让以太网内的多台主机,在一段时间内:只有一台主机向以太网发送数据!
所以,以太网就是一个巨大的“临界资源”,我们可以把在同一以太网内的主机当作多个线程!

👉所以,以太网采取了多种措施,就是为了保证同一段时间内只有一台主机发送!

所以我们现在来思考:
在以太网中发送的数据能够过长吗?
当然是不太好的!因为数据过长,那么发送时间就变长 -> 数据碰撞的概率就变大 -> 碰撞需要重传 -> 影响传输效率 -> 数据长度不能过长

那如果太短呢?
其实太短也不好!假设我要发送1000个字节给对方主机,但是我拆成1个字节一个字节给对方发送,这也是很低效的! -> 发送时间整体也会变长 -> 碰撞概率增大

综上所述:
传输给数据链路层的数据报文,不能太长,也不能太短 -> 以太网帧数据大小有上限和下限!

只不过这个具体的上下限值,是46 ~ 1500。不用管这个数据是怎么来的,这个数据能拿出来必定是经过大量的数据测试,外加严格证明的!

ARP协议

我们在前面讲以太网帧格式的时候,有一个部分没讲,就是以太网帧是不仅仅是可以携带数据,还可以是ARP协议!如下图所示:
在这里插入图片描述

ARP协议地位

虽然我们在这里介绍 ARP 协议, 但是需要强调, ARP 不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议!

我们通过一张图来理解它所处的位置:
在这里插入图片描述
ARP协议是处在以太网上层的另一种协议!
其实每一层都会有很多的协议,我们在学习的时候选择了最经典的、必学的协议来理解。

Tips:其实还有一个ARAP协议,但是现代网络已经很少用了,这里就不讲了!!!

ARP协议的作用

]我们现在肯定会有一个问题,我们上面不是讲完了数据链路层吗?
这里再讲多一个ARP协议是为什么?有什么作用吗?

其实,前面我们还遗留着一个没有讲解的问题:

1.网络是从一个子网到另一个子网!
2.在网络中传输的,其实是MAC帧!

在这里插入图片描述
而目前来说,我们只能从路由表上知道的是各个节点的IP地址。但是,在网络中跑的是MAC帧,可是我们并不知道下一跳的MAC地址啊?怎么传输过去呢?

我们从几个方面来理解为什么网络中传输的是用MAC地址:
1.局域网技术出现的更早!网络是在局域网的基础上发展的!
2.各种硬件设备,如网卡、集线器只认识MAC地址

所以,我们需要了解,如何解决这最后一个问题:
即我怎么知道下一跳的MAC地址呢?(只知道下一跳IP地址的情况下)。

直接说结论:
使用ARP协议就可以实现由IP地址解析MAC地址!也称地址解析协议
其实本质就是形成一个由IP地址和MAC地址的映射关系键值对!

ARP协议格式

在这里插入图片描述
我们首先要知道:
ARP协议并不是一个完全独立的协议,它是附加在以太网帧上的一个协议!
其实就是以太网帧的数据部分是ARP协议的报头!

ARP协议是不需要有效载荷的!因为不需要向上传输。


我们来了解一下ARP协议的报头:
在这里插入图片描述
1.硬件类型指链路层网络类型,1为以太网。以太网很常用,所以这个位置基本就是固定为1。
2.协议类型指要转换的地址类型,0x0800 为 IP 地址。这个基本也是固定的。
3.硬件地址长度对于以太网地址为 6 字节。
4.协议地址长度就是IP地址的长度,一般为4(IPv4)。
5.op字段有两个取值:1代表这是ARP请求,2代表ARP应答。
6.发送端以太网地址 && IP地址,发送ARP协议报头的主机的MAC地址和IP地址。
7.目的以太网地址 && IP地址,接收该ARP协议报头的主机的MAC地址和IP地址。

上面简单介绍了一下ARP协议的报头的不同字段。
前面四个字段基本上是固定的,后序四个地址也是很好理解的。
我们需要重点关注的是op它表示着,ARP报头,可能是请求,也可能是应答!

利用ARP获取MAC地址

在这里插入图片描述
假设现在数据送到了路由器D,进入到了路由器D和主机C所在的子网内,在只知道主机C的IP地址IPC的情况下,怎么获取对方的MAC地址,从而在子网内进行数据帧的转发呢?

我们把问题简单化:
在这里插入图片描述
我们就假设前面都已经能够通过某种方式获取MAC地址了马,传输到了路由器R,现在,我们路由器R拿着E的IP地址,应该怎么找到E的MAC地址,从而把数据发送给对方。


R发送请求,其他接收:

如下图所示:路由器R做了三件事情:

①形成ARP请求报文,填充字段
②封装为MAC帧
③发送到以太网
在这里插入图片描述

需要说的是:
在ARP请求报文中,目的主机的是不知道的,是要获得的。不知道的情况下设置的是全1!
封装为以太网帧的时候,因为目的地址也是不知道!也是设置为全1。

其实,全1的地址都是被称为广播地址的!没错,就是我们在学习IP网络划分的时候的那种广播,就是所有主机都要受理!如果是某个具体的主机的MAC地址,那么其他主机接收到这个报文后会直接丢弃,因为和自己的MAC地址匹配不上!

报文就这么发送到以太网中,且是通过广播发送,所有主机进行受理!
所有的主机接收这个报文,首先需要判断这个ARP报文是请求还是应答!-> 看op字段即可。
一旦发现这个是一个请求报文,就需要把MAC帧报头脱离,然后检查目的主机IP地址是否和自己的一样,如果一样就留下处理,反之丢弃!

所以,在上述路由器R发送给主机E的时候,只有E在判断IP地址和自己一样,把这个ARP请求留下,其他主机直接丢弃了!

最后检查目的MAC地址,发现是全1,说明是在请求这台主机的MAC地址!所以,这个时候,主机E就要想办法把自己的MAC地址返回给发送端的主机了(这里是路由器R)!

E发送应答,其他接收:

所以,主机E需要做一下几件事:

①形成ARP应答报文,填充字段
②封装为MAC帧
③发送到以太网
在这里插入图片描述

首先,这一次目的MAC地址不是全1了,所以不是所有的主机都会受理!这一次目的主机是MACR,所以说,这个应答只有主机R能够收到!
其次,看OP字段,OP = 2,说明是一个ARP的应答!说明有主机返回了自己的MAC地址了!
最后看源MAC和IP地址,发现是主机E的MAC地址,所以,这个时候就知道是主机E发来的!
至此,主机R就成功获得了下一跳主机的MAC地址!


此时,路由器R手握着IPE和MACE,这个时候就把IP报文重新封装一个MAC帧,发送给主机E即可!这样,路由器就完成了:获取MAC -> 数据转发的过程!

ARP的细节部分

我们已经了解了ARP是怎么样来获取到对方主机的MAC地址的,完成IP地址到MAC地址的转化。但是,现在还有两个问题:
1.只有进入子网的路由器到内部主机这一步需要使用ARP吗?
2.每次转发报文的时候,都需要先做ARP报文的交换吗?

问题一:
答案当然不是!上面是为了理解方便,才拿路由器转发给主机E做例子解释。
但其实,主机这个概念还是比较广泛的,不仅仅是电脑、也可以是路由器!

我们上面说的问题本质是:一台主机要路由到下一台主机的时候,只能通过路由表查到下一跳的IP地址,而不知道MAC物理地址,不知道物理地址就没办法把数据传输过去!

所以,其实这个问题是存在所有的两个节点之间的!

问题二:
每次都做ARP报文交换,这个效率非非常低!
所以,每个主机会存在一个时间段内,会把最近一段时间内做的ARP获得的IP与MAC的映射关系缓存到本地!这个时间是分钟级的,大概是15~20mins!

为什么不直接全部缓存起来?
答案是,根本没必要!

以下是几个具体原因:

1.浪费路由器内部存储空间
2.主机的IP地址是动态划分的!重新登陆一次就变了,那原来的映射关系就作废了。
3.主机的用户可能会更换网卡设备,MAC地址也变了,那原来的映射关系也是作废。
4.有些主机可能只通信一两次就不再通信了,那存储了也没意义!

所以,在一段时间内存储即可!下次要用了就再使用ARP协议申请。


文章转载自:

http://xlCEwyk4.fkwgk.cn
http://EvC9qOGL.fkwgk.cn
http://6bRUuWMa.fkwgk.cn
http://mVvz6XCi.fkwgk.cn
http://CnE5C5wr.fkwgk.cn
http://fKPBvuIj.fkwgk.cn
http://aHyBTgyq.fkwgk.cn
http://TWTmdgbS.fkwgk.cn
http://8ESwbf18.fkwgk.cn
http://DkldEAH4.fkwgk.cn
http://MDWmC2yx.fkwgk.cn
http://nbQfQYI7.fkwgk.cn
http://8ufbbOCL.fkwgk.cn
http://syKiOFby.fkwgk.cn
http://WY6SPWQY.fkwgk.cn
http://gLLL2Zm2.fkwgk.cn
http://AfWVQiqW.fkwgk.cn
http://L6Hkrmk7.fkwgk.cn
http://p0b4C1c8.fkwgk.cn
http://T80mPyLX.fkwgk.cn
http://5GeghceU.fkwgk.cn
http://hoP2WNw1.fkwgk.cn
http://TSKK8Ax0.fkwgk.cn
http://sOp42n7s.fkwgk.cn
http://tsirTgVh.fkwgk.cn
http://qj3Djfep.fkwgk.cn
http://e4W9uqHM.fkwgk.cn
http://dfw389oO.fkwgk.cn
http://BwWJUJl9.fkwgk.cn
http://yN1nhdne.fkwgk.cn
http://www.dtcms.com/a/388644.html

相关文章:

  • 大语言模型的 “幻觉” 难题:技术成因、解决方案与应用风险规避
  • 状态保留功耗门控 SRPG (State Retention Power Gating)
  • Elman神经网络多输入多输出回归预测+SHAP可解释分析+新数据预测(MATLAB源码)
  • 408 王道数据结构的学习记录
  • 使用内存映射读取文件和写入文件,并进行性能测试
  • SQL的UNION用法大全介绍
  • 从Web原生到高性能:如何优化企业数据库管理工具
  • 基于python新能源汽车数据分析可视化系统 懂车帝 Scrapy爬虫 Django框架 Vue框架 大数据项目(源码+文档)✅
  • 线性回归和 softmax 回归
  • mysql远程访问连接设置
  • 《WINDOWS 环境下32位汇编语言程序设计》学习17章 PE文件(2)
  • Linux网络编程:从协议到实战
  • Vector 底层实现详解
  • OpenShift Virtualization - 虚机存储的相关概念 DataVolume、CDI 和 StorageProfile
  • 2025年Web自动化测试与Selenium面试题收集:从基础到进阶的全方位解析
  • pytorch中的FSDP
  • 贪心算法与材料切割问题详解
  • 2. 结构体
  • MySQL 核心操作:多表联合查询与数据库备份恢复
  • vue3学习日记(十四):两大API选型指南
  • 微信支付回调成功通知到本地
  • 量化交易 - Simple Regression 简单线性回归(机器学习)
  • Kubernetes控制器详解:从Deployment到CronJob
  • python 架构技术50
  • 第九周文件上传
  • MCP大白话理解
  • 【Qt】QJsonValue存储 int64 类型的大整数时,数值出现莫名其妙的变化
  • 【C语言】冒泡排序算法解析与实现
  • [GESP202309 三级] 进制判断
  • 【C++】const和static的用法