Linux数据链路层通信原理及报文格式

数据链路层

局域网通信原理

网络层解决的是数据应该送往哪一个主机/路由器的问题,数据链路层主要解决的是直接相连的主机之间数据交付的问题。

每一台主机都有网卡,网卡有一个Mac地址,Mac地址只需要保证在局域网里的唯一性即可,每台主机只有一个Mac地址。每一个机器其实都可以接收到报文,在数据链路层的这一层可以解包出这个报文的目标主机和源主机,然后对报文里的ip信息对比看看是不是自己的主机ip,如果是就处理,不是就丢弃报文,而在数据链路层丢弃的数据,上层是不知道的。

任何一个时刻可以由多个主机接受局域网里发生的消息,但一个时刻只能允许一个主机发送消息 ,可以把局域网看成多台主机共享的临界资源

在以太网通信的时候,由于是光电信号,就会发生数据碰撞问题,所以发送数据的主机要执行避免碰撞的算法,错峰发送。碰撞域表示在以太网里有可能发生数据碰撞的区域。

在通信的时候其实有一个设备称为交换机 ,它工作在数据链路层,如果判断两太通信的主机都在交换机的一侧,无论是正常传输还是数据发生碰撞,交换机都不会把数据继续传输到另外一侧,就不会让数据在更大的局域网里传输,通过这样划分碰撞域就可以减少数据碰撞的概率。

但这里存在安全问题,网卡分为普通模式和混杂模式,混杂模式下的网卡会把数据上传给上层,所以我们的数据需要加密。

令牌环网:和局域网一样,每一个时刻都只能有一个主机往令牌环网发送消息,只有具有令牌的主机才能往令牌环网发送消息,这个令牌类似于系统编程里面的锁的概念

Mac帧报头


MAC :源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的。
类型 :帧协议类型字段有三种值,分别对应IP,ARP,RARP。
CRC :帧末尾是CRC校验码,是一种用于检测数据传输或存储过程中可能出现的错误的信道编码技术。它通过对数据进行除法运算并生成一个简短的固定位数校验码来实现错误检测。

Mac帧是定长报文,所以可以轻松的解包和封装,通过类型,我们可以确定不同类型的Mac帧报文应该交给哪一个上层,从而做到分用。

由于数据碰撞和效率平衡的问题,传输层有MSS限制发送的数据的大小,而在数据链路层有MTU来限制发送的包的大小,在tcp三次握手的时候,双方也会协商交互,用于减少分片和组装的次数。
RARP :如果我们只知道目标主机的MAC地址,需要知道目标主机的IP,就可以使用RARP报文。

ARP协议

ARP协议是用来把目的主机的ip地址转化为MAC地址,因为报文从路由器经过的时候,是需要重新制定报头的,把源MAC地址和目的MAC地址修改了。

ARP协议是属于MAC帧上层

原理

数据发送到局域网里,路由器先收到数据,路由器就会以广播的形式询问ip为xx.xx.xx.xx(目的主机IP)的MAC地址是什么,当目标主机收到消息的时候,就会发送一个ARP响应包,包含主机A的MAC地址,然后再定向返回回去。

报头


硬件类型 :指的是数据链路层的网络类型,如果设置为1表示以太网。
协议类型 :指的是要转换的地址类型,一般设置为0x0800,标识把IP地址转化为MAC地址。
硬件地址长度 :对于以太网来说,硬件地址长度为6,表示MAC地址的长度是6个字节。
协议地址长度 :一般写4,表示IP地址来说是4字节。
OP :OP字段为1表示ARP请求,字段为2表示ARP应答。
发送端以太网地址 :发送ARP请求的主机的以太网地址。
发送端的IP地址 :发送APR请求的主机的IP地址。
目的以太网地址 :如果是发送ARP报文的那一端一般填全F,表示广播。
目的IP地址:接收ARP报文的主机的IP地址。

过程

当一个局域网的路由器收到报文,却不知道目的IP对应的MAC地址的时候,就需要广播发送一个ARP报文,首先是在ARP协议层(也就是MAC帧的上层)先制作一个ARP报文请求

然后送到数据链路层里的MAC层,添加报头,这样我们就构建出来了一个MAC帧,这样,这个MAC帧就流向局域网,这个局域网里的每台主机都会收到这个MAC帧,而且dest MAC是广播地址,所以这个局域网里的主机都要对此进行处理,在MAC层先对MAC帧的报头进行分离,然后就把分离完报头的数据交往上一层ARP层,当ARP层发现op是1,也就是报文种类是请求ARP的时候,就会比对IP,如果IP是自己的IP的话,就要定向的进行ARP应答,如果不是,就直接丢弃。

当我们要定向应答的时候,要把op字段改为2,目的MAC地址,目的IP地址,源IP地址,源MAC地址这些都要修改,传输到下一层MAC层后,要把MAC帧报文的目的MAC地址和源MAC地址修改了,不再使用广播类型。

当路由器收到应答ARP报文之后,可以看到0806这个字段,可以知道这个报文是属于ARP的,就把报文传输到上层的ARP层进行解析,就会发现op是2,就可以解析报文,就可以拿到目标MAC地址了。

其实无论是ARP请求还是ARP应答,都会被局域网里的主机收到,对于不相关的主机来说,ARP请求是在ARP层丢弃的,因为ARP请求的MAC帧报头的目的MAC地址是全F,表示广播,而ARP应答是在MAC层丢弃的,因为MAC帧报头的目的MAC地址是具体的。

在经过arp请求之后,主机收到的MAC地址和IP地址的映射关系,都会被临时缓存起来,所以arp并不是每次都需要重新做的,而是在缓存失效的时候才需要重新进行ARP。

所以,我们可以通过IP地址和子网掩码按位与,获得网络号,然后拼接上从1-254的IP地址,并且全部都ping一下,就可以获得这个网段里所有主机的IP和MAC地址的映射关系。
ARP欺骗:当A主机收到了很多的arp应答,那么A主机会以最新的arp应答为准,但这样就会有一个问题,如果有一台B主机伪造自己的IP地址,向A主机发送很多虚假IP和MAC地址映射关系的报文,就会导致主机A的缓存映射被修改,如果这台B主机也对其他主机这样做了,那么这台主机能够变成这些主机里的中间人。

bash 复制代码
arp -a#可以用来查看缓存在主机里的MAC地址和IP地址
相关推荐
卷Java2 小时前
Linux服务器Docker部署OpenClaw:腾讯云/阿里云/VPS安装避坑指南
linux·运维·服务器
原来是猿4 小时前
Linux-【动静态库】
linux·运维·服务器
victory04315 小时前
Agent 面试知识树 + 高频追问答案库
网络·面试·职场和发展
九皇叔叔6 小时前
CentOS 7.5/RHEL 7.x 配置 YUM 源(阿里云镜像+本地源双方案)
linux·阿里云·centos
Blurpath住宅代理6 小时前
原生IP vs 广播IP:如何从网络层判断代理IP的“真实性”?
网络·静态ip·动态ip·代理·代理ip·住宅ip·住宅代理
chinesegf7 小时前
DNS 验证验证SSL证书
linux·服务器·网络
猿饵块7 小时前
python--websocket
网络·websocket·网络协议
taxunjishu7 小时前
塔讯总线协议转换信捷 PLC 对接 TCP/IP 设备实战方案
网络·物联网·自动化
墨神谕8 小时前
什么是Socket
websocket·网络协议