Linux下 数据链路层详解(从以太网到ARP协议)

欢迎来到我的频道!【点击跳转专栏】

本文所有代码已托管至码云:【点此转跳】

文章目录

  • [0. 数据链路层](#0. 数据链路层)
  • [1. 以太⽹](#1. 以太⽹)
    • [1.1 以太⽹帧格式(MAC帧)](#1.1 以太⽹帧格式(MAC帧))
    • [1.2 报头分离和分用问题](#1.2 报头分离和分用问题)
    • [1.3 认识MAC地址](#1.3 认识MAC地址)
    • [1.4 对⽐理解MAC地址和IP地址](#1.4 对⽐理解MAC地址和IP地址)
    • [1.5 认识MTU](#1.5 认识MTU)
    • [1.6 局域网通信原理](#1.6 局域网通信原理)
    • [1.7 交换机](#1.7 交换机)
    • [1.8 打通IP地址和MAC地址的联系(ARP协议)](#1.8 打通IP地址和MAC地址的联系(ARP协议))
  • [2. ARP协议](#2. ARP协议)
    • [2.1 ARP协议是什么以及其作用](#2.1 ARP协议是什么以及其作用)
    • [2.2 ARP协议原理](#2.2 ARP协议原理)
    • [2.3 ARP数据报的格式](#2.3 ARP数据报的格式)
    • [2.4 RARP( 逆地址解析协议)](#2.4 RARP( 逆地址解析协议))
    • [2.5 ARP欺骗](#2.5 ARP欺骗)
  • [3. 总结](#3. 总结)

0. 数据链路层

⽤于两个设备(同⼀种数据链路节点)之间进⾏传递

结论:数据本质是以数据帧的形式传递的!

1. 以太⽹

  • "以太网"不是一种具体的网络,而是一种技术标准; 既 包含了数据链路层的内容,也包含了一些物理层的内容 . 例如: 规定了网络拓扑结构,访问控制方式,传输速率等;
  • 例如 以太网中的网线必须使用双绞线; 传输速率有10M,100M,1000M等;
  • 以太网 是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网,无线LAN等;

1.1 以太⽹帧格式(MAC帧)

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

ether即表示 Mac地址 只需要保证局域网内唯一即可!

1.2 报头分离和分用问题

  1. 接收方如何分离报头和有效载荷?

这里采用固定长度的首(14byte)和尾(4byte)!

  1. 接收方如何分用呢?

在报头有2字节类型字段 对发送方来说 当数据从网络层交付给链路层时 链路层是知道是哪个协议交付的 如果是IP 则填写IP对应的置 对接收方来说 则可以根据该标志位将数据交给对应上层的协议!

1.3 认识MAC地址

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

1.4 对⽐理解MAC地址和IP地址

  • IP地址描述的是路途总体的 起点 和 终点
  • MAC地址描述的是路途上的每⼀个区间的起点和终点(局域网内部)

1.5 认识MTU

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

  • 以太网帧中的数据长度规定最小46字节,最大1500字节, ARP数据包的长度不够46字节,要在后面补填充位(一般是填0),正是因为有这个填充所以IP协议里面会有4位首部长度和16位总长度!
  • 最大值1500称为 以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
  • 如果一个数据包从以太网路由到拨号链路上, 数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
  • 不同的数据链路层标准的MTU是不同的;

数据链路层依赖物理层,每一种数据链路协议,都配套一套对应的物理层硬件/电气标准。

数据链路层协议 对应的物理层 MTU
以太网(Ethernet) 双绞线/光纤网线 1500
PPP(拨号老宽带) 老式电话线 576
802.11(WiFi无线链路) 无线电信号 1500(有变体)

👉"不同的数据链路对应的物理层"意思:

有什么样的物理硬件(网线/电话线/Wi‑Fi),就用对应的数据链路帧格式;MTU就是这套组合定出来的上限,不是IP协议自己想定多少就多少。

1.6 局域网通信原理

主机A此时正在给主机B发消息!为什么是A给B发???这个是网络层决定的!是你查路由表的时候找到了主机E发现是在当前局域网内的,此时就将该报文扔到以太网中了。

  • 以太网中,任何时刻,只允许一台机器向网络中发送数据
  • 如果有多台同时发送,会发生数据干扰,我们称之为 数据碰撞,一个以太网我们称为一个 碰撞域!
  • 所有发送数据的主机要 进行碰撞检测和碰撞避免(本质是在数据链路层对数据进行延迟重发!不过这个是硬件层面的就不深入了解了)
  • 局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标Mac地址判定,也就是说在同一个局域网内,你的数据是可以被任意一台设备(网卡开启混杂模式)抓到的,所以需要应用层加密!也是防止出现这种情况!
  1. 数据帧长度,是否影响碰撞概率?

为了减少碰撞(因为碰撞一次所有数据都要重传,代价太高) 需要尽量增加间隙 类似说话 你连说100句话别人插不进去,但是你说1句等一会 就方便别人发言!所以数据帧不能发太长 可以分几段发送 这样就可以减少碰撞!所以就会有MTU这个东西!如果你1000字节发1000次 这么做效率又太低!所以就有了46~1500这个范围。(以太网数据发送是光电信号 发送是很快的!所以撞检测和碰撞避免导致的效率问题我们不用担心!)

  1. 如果主机数量增多呢?

如果主机数增多 必然导致发送的数据变多 碰撞概率变大!

1.7 交换机

交换机本质上是多端口网桥 ,主要工作在 OSI 模型的数据链路层,根据以太网帧中的 目的 MAC 地址 转发数据。它连接同一局域网中的多台设备,使设备之间能够高效通信。可以有效隔离冲突域!划分冲突域

此时A和D C和E就可以同时通信 避免碰撞了! 同时AE之间还能互相通信! 相当于减少设备数量 有效减少冲突概率!也能有效防止部分主机恶意碰撞。

这就是为什么学校会有这么多路由器和交换机 就是尽量避免碰撞。


谈谈交换机原理:交换机和路由器一样,随着通信的进行,交换机会自主动态学习。

比如主机 A 要给主机 D 发信息,交换机一开始什么都不知道。报文从 eth_left 进来,交换机读到源 MACA,记录 MACA 一定在左侧。

交换机不知道 MACD 在哪里,于是执行泛洪;实际底层是存储‑转发,现象上
帧会从左流到右,为便于理解可以想象转发效果近似一根导线。

交换机从 right 端口发出去 A 的帧副本,这个副本跑在右侧网线,如果此时 E 同时往外发帧,二者会在右侧链路上产生碰撞 。

碰撞会损坏 E 的这一帧,交换机无法接收损坏的帧,因此这次不能学习 MACE。

之后 E 执行退避重传,向局域网重新发送完好帧;完好帧从 eth_right 进入交换机,交换机读到源 MACE,
确定 MACE 一定在右边并记录。
经过一段时间的交换学习,交换机就摸清楚整个局域网各个 MAC 对应的端口

说人话就是 在哪边收到数据帧 交换机就将收到的MAC地址记录下来!经过一段时间 交换机就知道MAC A B D在左边,MAC C E在右边,此时MAC A对MAC D发送信息,因为有交换机存在 数据帧想到右边需要经过交换机 但是它知道MAC A D是都在左边的 于是交换机就对该数据帧不做转发 扩散到右边

1.8 打通IP地址和MAC地址的联系(ARP协议)

当我们转发报文的时候 经过路由器A 根据目的IP 得到 子网掩码 + 目标网络 从而得知下一跳的路由器B的IP地址(通过查路由表) 但是我们只知道 路由器B的IP地址 不知道MAC地址啊! 不知道MAC地址此时局域网通信就没法做!

所以说 在同一网段中,必须要有一种技术,能够把下一跳IP地址 转化成为下一跳主机的Mac地址!这种技术就叫ARP(地址解析协议)

2. ARP协议

虽然我们在这⾥介绍ARP协议, 但是需要强调, ARP不是⼀个单纯的数据链路层的协议, ⽽是⼀个介于数据链路层和⽹络层之间的协议

2.1 ARP协议是什么以及其作用

ARP协议就是支持ip->Mac的协议!其作用就是支持局域网Mac级别的通信!

2.2 ARP协议原理

主机A向主机D发送信息,因为不知道MACD,于是相当于在局域网内进行以下广播:

cpp 复制代码
desmac:ffff ffff ffff 广播给所有设备
srcmac:MACA
data:谁是MACD??
type:0806

于是设备BCD都一看是广播帧,于是都接收了,在ARP层一分析 哦!原来是找设备D啊于是在没到ip层前 就丢掉了!设备D的ARP层一看 原来是找我!于是返回一下内容:

cpp 复制代码
desmac:MACA
srcmac:MACD
data:我是MACD MACD=XXXXXX
type:0806

设备BC在数据链路层一看desmac是MACA于是都不接收,直接丢弃,然后设备A收到后,就可以建立IP_A和MACA的映射了!

一句话总结:ARP原理就是先广播,再一对一发送MAC地址的过程!请求的报文是ARP层丢弃,应答的报文是MAC帧层丢弃的!

每台主机都维护⼀个ARP缓存表,可以⽤arp -a命令查看。缓存表中的表项有过期时间(⼀般为20分钟),如果20分钟内没有再次使⽤某个表项,则该表项失效,下次还要发ARP请求来获得⽬的主机的硬件地址

2.3 ARP数据报的格式

  • 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次, 对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
  • 硬件类型指链路层网络类型, 1为以太网,相当于是转MAC地址;
  • 协议类型指要转换的地址类型, 0x0800为IPV4地址;
  • 硬件地址长度 对于以太网地址为6字节;
  • 协议地址长度对于, IP地址为4字节;
  • op字段为1表示ARP请求,op字段为2表示ARP应答(收到ARP数据 永远先看op字段)。
  • 如果目的以太网地址不知道则设置成全f

ARP数据报长度不足46字节,会自动补齐!

2.4 RARP( 逆地址解析协议)

可以将MAC地址转化为IP地址 原理很简单 有MAC地址就可以在对应局域网内发送数据帧 然后目标主机返回对应IP地址即可!

2.5 ARP欺骗

结论:ARP缓存记录,只会记录最新的

ARP 欺骗发生在局域网内。正常情况下,设备会通过 ARP 表记录"某个 IP 地址对应哪个 MAC 地址",例如:

text 复制代码
网关 IP 192.168.1.1 → 网关 MAC

攻击者伪造 ARP 应答,欺骗受害主机说:

text 复制代码
192.168.1.1 → 攻击者的 MAC

于是受害主机原本要发给网关的数据,会先被错误地发到攻击者机器。攻击者可以转发这些数据,让网络表面上仍能正常使用,同时进行监听、篡改或断网;这就是常见的"中间人攻击"。

步骤1:


步骤2:


步骤3:

我们甚至可以发送错误的ARP给别人,从而定向导致他人断网

3. 总结

  • 数据链路层 :用于两个设备(同一数据链路节点)之间传递数据,数据以数据帧形式传输。
  • 以太网:一种技术标准,帧格式包含源/目的MAC地址(48位)、类型字段和CRC校验;通过固定首尾长度分离报头,用类型字段分用。
  • MAC地址与IP地址:MAC描述局域网内每个区间的起终点,IP描述整体起终点;MTU是不同数据链路与物理层组合定出的帧长度上限(以太网46~1500字节)。
  • 局域网通信:同一时刻只允许一台设备发送,否则产生碰撞;交换机作为多端口网桥,通过动态学习MAC地址划分冲突域、减少碰撞。
  • ARP协议 :介于数据链路层与网络层之间,负责将下一跳IP地址解析为MAC地址,原理是先广播、再一对一应答,并维护带过期时间(约20分钟)的ARP缓存表。
相关推荐
‎ദ്ദിᵔ.˛.ᵔ₎3 小时前
linux 进程信号(下)
linux·运维·服务器
skywalk81633 小时前
在FreeBSD系统的linux仿真环境下安装和使用kiro 这个亚马逊的AI agent
linux·人工智能·freebsd·kiro
Mikko73 小时前
Linux 磁盘满了但 du 找不到?LVM 扩容 df 不变?fstab 写错开不了机?三台真机实测磁盘排查
linux·运维·centos
Madison-No73 小时前
多语言聊天大模型--测试报告
linux·git·python·selenium·jmeter·自动化·postman
Liuqy-053 小时前
特殊进程——孤儿、僵尸、守护进程
linux·运维·服务器
流浪0014 小时前
Linux系统篇47——线程(十二) POSIX 信号量与环形队列,把判空判满提前到访问之前
linux·操作系统·线程·信号量·环形队列
咖丨喱4 小时前
【MMC Core + hc16 Host(WiFi SDIO 如何落到控制器)】
linux
等我调个Bug4 小时前
【Linux系统篇】权限
linux·服务器
~光~~5 小时前
【嵌入式linux学习】Cache 策略:Write-Through / Write-Back + Allocation
linux·学习·spring