数据链路层

数据链路层

用于两个设备(同一种数据链路节点)之间进行传递

认识以太网

"以太网" 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容

跨网络传输的本质是由无数个局域网转发的结果,理解跨网络传输的本质,首先需要理解局域网中报文的转发原理;上文中网络层的作用是路由选择,真正去实现路由的是数据链路层

以太网帧格式

以太网的帧格式如下所示:

  • 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的
  • 帧协议类型字段有三种值,分别对应IP、ARP、RARP
  • 帧末尾是CRC校验码

学习报文最重要的两个问题:

如何解包?

定长报头加上后面4字节校验码

如何分用?

报头中的类型决定交付的协议类型

理解局域网转发的原理

报文在数据链路层经过以太网的封装,形成数据帧;由主机1发送至局域网中,该报文会被局域网中所有的主机获取,在数据链路层先识别目的地址,如果不符合直接丢弃;如果符合,直接向上交付

如果大量主机同时发送数据,此时每个主机都会受到大量数据,进而导致数据传输效率低下,解决措施有:令牌环,以太网

在以太网中规定:在任何时刻,只能有一个主机发送消息,如果多个消息被同时发送,会导致局域网中的数据发生碰撞,从而变成无效数据;一个局域网,一个碰撞域

再后来交换机的引入,也大大降低了碰撞的概率

交换机划分了碰撞域,当识别局部性碰撞时,对碰撞数据不进行转发

重新看待局域网,可以将局域网当作临界资源;规定任何时刻只能有一台主机能够向临界资源中写入数据

认识MAC地址

  • MAC地址用来识别数据链路层中相连的节点
  • 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示
  • 在网卡出厂时就确定了, 不能修改

对比理解MAC地址和IP地址

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

认识MTU

由于碰撞域的存在,一台主机发送数据时,发送的数据是较长些好,还是较短些好,为什么呢?

较长或者较短都会影响传输效率,适中较好

MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制

  • 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位
  • 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU
  • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)
  • 不同的数据链路层标准的MTU是不同的

MTU对上层协议的影响

在上文的网络层中已经介绍过分片,这里不加赘述

查看硬件地址和MTU

ARP协议

再回到数据帧中,再局域网中可通过目的IP和子网掩码确定目标网络,目标网络中存在着许多的主机,通过目标主机MAC地址便可确定目标主机,但是数据帧中需要填充的内容就是目标主机的MAC地址,所以在与目标主机传输数据之前,还存在一个过程:获取目标主机MAC地址,ARP协议便可完成这一任务

ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议

ARP协议的作用

ARP协议建立了主机 IP地址 和 MAC地址 的映射关系

  • 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址
  • 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
  • 因此在通讯前必须获得目的主机的硬件地址

简单来说,ARP协议,根据IP地址,得到对方主机的MAC,获取对方主机的MAC地址后,再发送MAC帧

ARP数据报的格式

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

ARP协议的工作流程

主机1调用ARP请求,填入字段,目的地址填入FFFFFF,进入数据链路层封装成MAC帧,发送至局域网中,被局域网中的每个主机收到,对比目的IP是否相等,进行丢弃;到达目的主机后,向上交付给ARP协议,读取op内容判断ARP的类型:请求或应答;填入MAC地址,返回数据链路层进行封装,再发送至局域网中,直接到达主机1(由于MAC已经获取,其他主机不再获取MAC帧),至此可以开始发送数据

相关推荐
apcipot_rain16 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克60516 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_67816 小时前
深挖C++:类和对象(中)
开发语言·c++
LongRunning18 小时前
【Linux】RK3568-OpenCV+YOLO(八)
linux·opencv·yolo
D e re k ZH19 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
xiaoye-duck20 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
zaizai100721 小时前
【Effective Modern C++】学习第一章
c++
Fruiticecake21 小时前
C 程序员速通现代 C++(一):lambda、std::function、移动语义与智能指针
c语言·c++
民乐团扒谱机21 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
青少儿编程课堂21 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛