数据链路层

数据链路层

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

认识以太网

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

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

以太网帧格式

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

  • 源地址和目的地址是指网卡的硬件地址(也叫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帧),至此可以开始发送数据

相关推荐
彭祥.40 分钟前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
会飞的鱼先生1 小时前
Node.js-http模块
网络协议·http·node.js
lzb_kkk1 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
独行soc3 小时前
#渗透测试#批量漏洞挖掘#HSC Mailinspector 任意文件读取漏洞(CVE-2024-34470)
linux·科技·安全·网络安全·面试·渗透测试
BD_Marathon3 小时前
Ubuntu下Tomcat的配置
linux·ubuntu·tomcat
胖大和尚3 小时前
clang 编译器怎么查看在编译过程中做了哪些优化
c++·clang
饥饿的半导体3 小时前
Linux快速入门
linux·运维
BD_Marathon3 小时前
Ubuntu:Tomcat里面的catalina.sh
linux·ubuntu·tomcat
BD_Marathon3 小时前
设置LInux环境变量的方法和区别_Ubuntu/Centos
linux·ubuntu·centos
Me4神秘3 小时前
Linux国产与国外进度对垒
linux·服务器·安全