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

数据链路层

在讲这个之前思考两个问题。

你为什么要把数据交给路由器F??

是因为我们的IP报文和目的IP不在一个子网内,需要跨子网通信,由目的网络的网络号决定的。

你怎么把数据交给路由器F??

这个就是我们这里要讲的东西了。

网络层是解决你为什么要交给路由器的,而数据链路层是解决你如何给它的。

以太⽹帧格式

以太⽹的帧格式如下所⽰:
mac帧如何做到解包??
固定长度报头,如何分用?
帧类型,2位表示,通过它的类型交给上层协议。

认识MAC地址

MAC地址⽤来识别数据链路层中相连的节点;

⻓度为48位, 及6个字节. ⼀般⽤16进制数字加上冒号的形式来表⽰(例如: 08:00:27:03:fb:19)

在⽹卡出⼚时就确定了, 不能修改. mac地址通常是唯⼀的(虚拟机中的mac地址不是真实的mac地

址, 可能会冲突; 也有些⽹卡⽀持⽤⼾配置mac地址).

MTU对UDP协议的影响

让我们回顾⼀下UDP协议:

⼀旦UDP携带的数据超过1472(1500 - 20(IP⾸部) - 8(UDP⾸部)), 那么就会在⽹络层分成多个IP数

据报.

这多个IP数据报有任意⼀个丢失, 都会引起接收端⽹络层重组失败. 那么这就意味着, 如果UDP数据

报在⽹络层被分⽚, 整个数据被丢失的概率就⼤ 增加了.

MTU对于TCP协议的影响让我们再回顾⼀下TCP协议:

TCP的⼀个数据报也不能⽆限⼤, 还是受制于MTU. TCP的单个数据报的最⼤消息⻓度, 称为

MSS(Max Segment Size);

TCP在建⽴连接的过程中, 通信双⽅会进⾏MSS协商.

最理想的情况下, MSS的值正好是在IP不会被分⽚处理的最⼤⻓度(这个⻓度仍然是受制于数据链

路层的MTU).

双⽅在发送SYN的时候会在TCP头部写⼊⾃⼰能⽀持的MSS值.

然后双⽅得知对⽅的MSS值之后, 选择较⼩的作为最终MSS.

MSS的值就是在TCP⾸部的40字节变⻓选项中(kind=2);

我们mac数据真,越长越好还是越短越好??

越长就发送时间越长,碰撞了概率就增加,就是我们之前讲的局域网通信。

mac越短,此时发送的效率也就很低了, 因为每次发送的字节数太少,所以要约定有效载荷的范围值46-1500,做实验做出来的。

一个局域网中,主机越多越好还是越少越好呢??

越少越好,因为越多碰撞的概率越大。

如果一个局域网中主机很多,怎么有效减少碰撞呢??

答案是存在一个交换机。

比如我们主机A要发送给主机E,此时你交换机左侧全部收到了,交换机也收到了,但是我的交换机此时只知道你的主机A是从我的左边来的,主机E我不知道在哪,此时我就往右侧发送我们的这个Mac帧,此时经过这个交换机不断学习的话,此时这个交换机就能清楚的知道我的主机的分布,知道之后,比如我主机A要给主机D发送消息,此时我就不让主机A的MAC帧去右侧,我知道你主机D在左侧,只需要让左侧主机收到即可。此时减少右侧数据碰撞的概率,这个交换机的作用就是划分碰撞域交换机也叫网桥。

此时如果交换机多了,这个大的局域网碰撞域划分为多个小碰撞域,此时就能减少碰撞概率了。

我们主机B通过去路由器F查路由表,查到了就去,查不到走缺省路由,然后继续向后找我们要走的路,但是此时有问题,你主机B到我的路由器F,我只知道你的IP地址啊,我不知道你的mac地址我如何做mac帧封装呢??

因为局域网中规定只有mac地址才能在局域网中传输,即使我们达到路由器D,我也只知道这个主机在我的这个子网中,我只知道它的IP,并不知道它的mac帧啊,那我怎么找到它呢??

简单来说就是我如何通过IP地址拿到mac地址呢??

因为只有mac地址才能在局域网中通信,所以,此时我们该如何做呢??

此时就要引出一个协议了。

ARP协议

我要给主机B通信,此时我就先得查路由表看看这个主机是否在我的局域网内,然后我会以广播的形式给主机B发送一个ARP请求包,此时这个局域网内都能收到,但是只有目的IP才能响应,此时他就给你响应过来它的MAC,此时你主机A就拿到了主机B的MAC地址,这就是一个ARP的过程。

注意到源MAC地址、⽬的MAC地址在以太⽹⾸部和ARP请求中各出现⼀次,对于链路层为以太⽹的

情况是多余的,但如果链路层是其它类型的⽹络则有可能是必要的。

硬件类型指链路层⽹络类型,1为以太⽹;

协议类型指要转换的地址类型,0x0800为IP地址;

硬件地址⻓度对于以太⽹地址为6字节;

协议地址⻓度对于和IP地址为4字节;

op字段为1表⽰ARP请求,op字段为2表⽰ARP应答。

我们ARP协议是存在在我们的数据链路层的,我们的MAC帧是需要发送ARP请求拿到的,此时我们的MAC帧就相当于ARP的下层,但是我们的ARP不需要再向上层交付,因为我没有用到上层的一些东西,所以此时这个ARP就是独立在数据链路层的,我们的一个主机不仅能收到对方ARP的响应就是你向对方发送一个ARP请求,对方应答你,然后其它主机也可能向你发送请求啊,你既可以是请求也可以收到应答。

这里的以太网首部其实就是MAC帧的报头的一部分内容。

我们拿一个图来填充一下这个应答头帮助我们的理解。

我们的路由R想去主机E发送ARP请求怎么填充的。

首先我们需要先填充后面的部分,就是如图的字段,前四个基本都是固定的格式,上面都有讲解,op就是代表我们是请求还是应答了,发送端的以太网地址就是我们的MAC地址,我们是知道的,就是macr表示,发送端IP我们也知道是IPr,目的以太网的地址我们是不知道的,就是对方的MAC地址我们不知道,但是我们知道是以广播的形式传播的,所以是FFFF FFFF FFFF 因为占六个字节48位,所以是12个F,目的IP我们也是知道的就是IPE,此时我们就把ARP封装好了,此时我们交给数据链路层的时候还要封装前面的就是这几个字段,以太网的目的地址依然是全FFFF FFFF FFFF 的因为是广播的形式传播,以太网的源地址我知道就是macr,帧类型

我们ARP请求时0806,此时填上即可,此时我们就完成了数据链路层的ARP封装了,此时就交到我们的这个局域网中,此时你觉得主机A会让这个ARP请求进入数据链路层吗??

答案是会的,因为以太网的目的IP时广播,都可以收到,进去之后,把数据链路层解析了,拿到我们封装的ARP了,此时通过目的IP我们可以确定不是我主机A,此时在主机A的ARP层就被丢弃了,这就是这个过程,直到我们找到主机E,主机E解析之后发现是我们,此时更改一下这个ARP封装,此时你主机E就可以把MAC帧地址放进去了,此时继续看这个图。

首先前四个还是固定的,op就变成2了,因为我是应答ARP的,发送端以太网地址就是MACE了,发送端IP地址是IPE,目的以太网地址我们还是直到MACR,因为发送的时候带的有,目的IP也知道是IPR,此时就完成了ARP封装,然后交给数据链路层封装,此时就是以太网目的地址是MACR,以太网源地址是MACE,帧类型还是0806代表ARP,此时就完成了封装,重新发送到网络中的时候,此时其它主机收到了,数据链路层收到了,但是通过对比自己的以太网目的地址发现不是自己,直接在数据链路层就丢弃了,直到发给我们的路由器R,此时就拿到目的主机的MAC帧地址了。

所以我们跨国通信也是需要发送ARP请求拿到我们中国的国际路由的MAC地址了。

我们难道每次访问这个主机,每次都要进行ARP吗??

不是的,我们的ARP会自动缓存就是该主机IP和该主机ARP的映射关系。

缓存不是永久的,因为我们的这台主机重启一次可能IP和MAC地址都会发生改变的。

RARP就是把MAC地址转化为IP地址,不过多讲解。

http://www.jsqmd.com/news/710985/

相关文章:

  • 作为一名在读博士生,我在日常是如何与AI协作的?
  • 揭秘嵌入式固件被逆向篡改的11种隐匿路径:基于GJB 5000A与IEC 62443-3-3的防御体系构建
  • 大型语言模型如何平衡个性化与社交规范
  • 计算机视觉算法优化方法
  • AI智能体指令跟随技术:核心挑战与AgentIF-OneDay基准测试
  • 2026.4.27
  • Radeon Software Slimmer:3步实现AMD显卡驱动的极致精简与性能优化
  • Audiveris终极指南:让纸质乐谱秒变数字音乐的免费神器
  • Redis Sentinel 自动故障转移机制
  • C语言BMS开发合规性攻坚实录(ASIL-C强制要求逐条拆解+MISRA-C:2023最新适配方案)
  • ERNIE 5.0多模态架构解析与工程实践
  • 暗黑破坏神2存档编辑器:d2s-editor完全指南
  • 嵌入式学习的第三天
  • 2026年AI工程岗必考!Docker AI Toolkit最新版8大核心模块面试题库,限时开放前100名免费下载
  • MySQL InnoDB 锁机制深度解析:从共享锁到 Next-Key Lock,彻底搞懂并发控制
  • 2026年目前高清的视频下载去水印软件找哪个
  • 告别乱码!手把手教你用51单片机驱动LCD1602显示自定义字符(附完整代码)
  • 避开Halcon点云分析第一个坑:手把手教你用`visualize_object_model_3d`正确显示与交互
  • BandPO:动态边界策略优化提升LLM强化学习探索能力
  • 终极指南:5步掌握TFT Overlay - 云顶之弈玩家的实时战术辅助工具
  • 【国家级智慧农场认证技术白皮书节选】:Python实现农业IoT多源数据语义级融合的5层架构设计(含GDPR合规适配)
  • CSS浮动布局的性能优化_减少不必要的清除浮动代码
  • swagger/
  • 怎么下载视频号的视频到相册
  • 用Python和Pygame复刻简化版植物大战僵尸:从数学建模到游戏开发的保姆级教程
  • PCIe 关键技术—— elastic buffer
  • Python 玩转摄像头:MediaPipe 手势追踪贪吃蛇游戏(含完整环境配置教程)
  • 4GB显存也能玩转SDXL?Fooocus低配置AI绘图终极指南
  • 2026最强全能 AI Agent:Codex 零基础完整实战教程(基于 GPT-5.5 与 Image-2 模型)
  • 终极指南:如何用Prompt Optimizer节省90%的LLM API成本