Linux网络--数据链路层

大家好,上次我们学习了网络层IP协议,今天我们来继续学习Linux网络的数据链路层,那么话不多说我们开始今天的学习:

目录

数据链路层

数据链路层

[1. 对比理解 "数据链路层" 和 "网络层"](#1. 对比理解 "数据链路层" 和 "网络层")

[2. 认识以太网](#2. 认识以太网)

[2.1 以太网帧格式](#2.1 以太网帧格式)

[2.2 认识 MAC 地址](#2.2 认识 MAC 地址)

[2.3 对比理解 MAC 地址和 IP 地址](#2.3 对比理解 MAC 地址和 IP 地址)

[2.4 认识 MTU](#2.4 认识 MTU)

[2.5 MTU 对 IP 协议的影响](#2.5 MTU 对 IP 协议的影响)

[2.6 MTU 对 UDP 协议的影响](#2.6 MTU 对 UDP 协议的影响)

[2.7 MTU 对于 TCP 协议的影响](#2.7 MTU 对于 TCP 协议的影响)

[MSS 和 MTU 的关系](#MSS 和 MTU 的关系)

[2.8 查看硬件地址和 MTU](#2.8 查看硬件地址和 MTU)

[ARP 协议](#ARP 协议)

[1. ARP 协议的作用](#1. ARP 协议的作用)

[2. ARP 协议的工作流程](#2. ARP 协议的工作流程)

[3. ARP 数据报的格式](#3. ARP 数据报的格式)

[4. ARP 欺骗原理](#4. ARP 欺骗原理)


数据链路层

数据链路层

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

1. 对比理解**"数据链路层""网络层"**

数据链路层(Data Link Layer)和网络层(Network Layer)是 TCP/IP 模型中相邻的底层核心层,共同支撑数据的 "跨节点传输",但职责边界、作用范围、核心目标完全不同:
数据链路层: 负责同一物理链路(相邻节点) 的 "点对点" 传输,解决 "相邻设备怎么传" 的问题;
网络层: 负责跨多个物理链路(跨网络) 的 "端到端" 传输,解决 "从源主机到目标主机怎么找路" 的问题。
**两者的关系可类比为:**数据链路层是 "城市内的道路 + 路口管理",网络层是 "跨城市的高速公路规划 + 导航"------ 没有道路(数据链路层),导航(网络层)无法落地;没有导航(网络层),无法跨城市到达目的地。

2. 认识以太网

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

2.1 以太网帧格式

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

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

2.2 认识MAC地址

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

2.3 对比理解MAC地址和IP地址

IP 地址描述的是路途总体的 起点 和 终点 ;

IP 地址 = 「收件人完整地址」(邮政编码 + 省市区街道门牌号)负责「全局定位」,告诉 "快递系统" 最终要送到哪个城市、哪个小区;

MAC 地址描述的是路途上的每一个区间的起点和终点;
MAC 地址 = 「运输车辆的车牌号码」负责「本地路段识别」,告诉 "每一段道路的管理者"(如路口、收费站)当前车辆要交给哪辆车 / 哪个站点。

2.4 认识****MTU

大家看到MTU是不是感觉有点熟悉,这不就是上次学习IP分片组装那里的内容吗?
MTU 相当于发快递时对包裹尺寸的限制 . 这个限制是不同的数据链路对应的物理层 , 产生的限制

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

2.5 MTUIP****协议的影响

由于数据链路层 MTU 的限制 , 对于较大的 IP 数据包要进行分包:

将较大的 IP 包分成多个小包 , 并给每个小包打上标签 ;
每个小包 IP 协议头的 16 位标识 (id) 都是相同的 ;
每个小包的 IP 协议头的 3 位标志字段中 , 第 2 位置为 0, 表示允许分片 , 第 3 位来表示结束标记( 当前是否是最后一个小包 , 是的话置为 1, 否则置为 0);
到达对端时再将这些小包 , 会按顺序重组 , 拼装到一起返回给传输层 ;
一旦这些小包中任意一个小包丢失 , 接收端的重组就会失败 . 但是 IP 层不会负责重新传输数据;

2.6 MTUUDP****协议的影响

让我们回顾一下 UDP 协议:

一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部 ) - 8(UDP 首部 )), 那么就会在网络层分成多个 IP 数据报 .
这多个 IP 数据报有任意一个丢失 , 都会引起接收端网络层重组失败 . 那么这就意味着, 如果 UDP 数据报在网络层被分片 , 整个数据被丢失的概率就大大增加了 .

2.7 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);

MSS 和 MTU 的关系
2.8 查看硬件地址和****MTU

使用 ifconfig 命令 , 即可查看 ip 地址 , mac 地址 , 和 MTU;

ARP****协议

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

还记得我们学习IP协议的时候传输数据,当时我们没说怎么向子网IP传输数据,今天学习了ARP就知道了:

1. ARP****协议的作用

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

如果我们只知道目标主机的 IP 地址,不知道对方的 MAC 地址,就无法给对方发送数据帧?

所以需要一种局域网协议,把 IP 转换成对应的 mac 地址 --- 这就是ARP 协议!(地址解析协议)

2. ARP****协议的工作流程

源主机发出 ARP 请求 , 询问 "IP 地址是 192.168.0.1 的主机的硬件地址是多少 ", 并将这个请求广播到本地网段( 以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播);
目的主机接收到广播的 ARP 请求 , 发现其中的 IP 地址与本机相符 , 则发送一个 ARP 应答数据包给源主机 , 将自己的硬件地址填写在应答包中 ;
每台主机都维护一个 ARP 缓存表 , 可以用 arp -a 命令查看。缓存表中的表项有过期时间( 一般为 20 分钟 ), 如果 20 分钟内没有再次使用某个表项 , 则该表项失效 , 下次还要发 ARP 请求来获得目的主机的硬件地址。


想一想 , 为什么要有缓存表 ? 为什么表项要有过期时间而不是一直有效 ?
因为我们使用的子网IP和机器的网卡都是可以进行替换的,如果缓存表没有过期时间那么一旦我们更换了IP或是网卡那么就无法更新缓存表也就无法再继续通信了。
再想一想 , 结合我们刚才讲的工作流程 , ARP 的数据报应该是一个什么样的格式?

3. ARP****数据报的格式

注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次 , 对于链路层为以太网的情况是多余的, 但如果链路层是其它类型的网络则有可能是必要的。
硬件类型指链路层网络类型 ,1 为以太网 ;
协议类型指要转换的地址类型 ,0x0800 为 IP 地址 ;
硬件地址长度对于以太网地址为 6 字节 ;
协议地址长度对于和 IP 地址为 4 字节 ;
op 字段为 1 表示 ARP 请求 ,op 字段为 2 表示 ARP 应答。

下面我们来讲解一下ARP的使用方法:

当前在外网上传来一份数据要给主机E,可是当前路由器并不知道主机E的 MAC 地址,那么此时就要发送 ARP 请求,由路由器发出。

由于现在并不知道目的主机MAC地址,所以 以太网目的地址 这一部分要写 全F 意为广播,也就是发送给该子网内的所有主机。

以太网源地址就是路由器的MAC地址,帧类型是0806表示ARP请求/应答,硬件地址长度是1表示以太网,协议地址长度是0800表示要转换的是IP地址。OP为1表示ARP请求。

因为只有目的以太网地址不知道,所以除了目的以太网为 全F 剩下都写好了。

现在数据链路层将这份数据发送给所有主机,所有主机收到数据后,先看OP位是请求还是应答,然后再看目的主机IP,如果是当前主机则进行处理,若不是当前主机那就把该数据丢掉不处理。

等主机E收到后,看清了是发送给自己的请求,那么主机E要进行处理,把自己的MAC地址写上去,OP为2表示ARP应答,此时源以太网地址是主机E的MAC地址,目的以太网地址是路由器的MAC地址,这样将ARP发回路由器,路由器就知道了主机E的MAC地址。

这样就能把数据发送给主机E了。

4. ARP****欺骗原理

步骤一


步骤二


步骤三

ARP欺骗是利用ARP 协议无身份验证的漏洞,通过伪造 "IP与MAC 的对应关系",篡改目标设备的 ARP 缓存表,从而劫持局域网内的流量。

攻击者利用这个漏洞,主动给目标设备发伪造的 ARP 响应,篡改对方的 ARP 缓存表,实现流量劫持。常见场景有几种:

场景 1:欺骗主机(让主机把流量发给攻击者)

攻击者(比如局域网内的主机 C)给主机 A 发伪造的 ARP 响应:"我是网关(192.168.1.1),我的 MAC 是 CC:CC:CC:CC:CC:CC(攻击者的 MAC)"。

主机 A 的 ARP 缓存表被篡改:"网关 IP→攻击者 MAC"。

后果:主机 A 发往网关的所有流量(比如访问网页、发消息),都会先发给攻击者(相当于你把快递都发给了冒充快递站的邻居)。
场景 2:欺骗网关(让网关把流量发给攻击者)

攻击者同时给网关发伪造的 ARP 响应:"我是主机 A(192.168.1.10),我的 MAC 是 CC:CC:CC:CC:CC:CC(攻击者的 MAC)"。

网关的 ARP 缓存表被篡改:"主机 A IP→攻击者 MAC"。

后果:网关发往主机 A 的流量,也会先发给攻击者。
场景 3:中间人攻击(截获 + 篡改所有流量)

当攻击者同时欺骗主机 A 和网关后:

主机 A 的流量先到攻击者;

攻击者可以偷看、篡改数据(比如把 "登录密码" 改成自己的);

再把流量转发给网关(主机 A 和网关都察觉不到)。
欺骗的 "维持":持续发伪造响应

ARP 缓存表有超时机制(通常 1-10 分钟),超时后会重新请求正确的 MAC。所以攻击者需要持续发送伪造的 ARP 响应(称为 "ARP 泛洪"),保持目标缓存中的错误记录(相当于每隔几分钟就给你发一次 "快递站新车牌" 的消息,让你一直信以为真)。

以上就是今天我们学习的数据链路层的所有内容,如果感到有收获的话还请点赞收藏,那我们下次再见!

相关推荐
speop2 小时前
【datawhale组队学习】|TASK02|结构化输入
网络·人工智能·学习
oioihoii2 小时前
C++20协程如何撕开异步编程的牢笼
linux·服务器·c++20
叫致寒吧2 小时前
自动化运维工具 Ansible
运维·自动化·ansible
冉佳驹2 小时前
Linux ——— Git的核心操作流程、进程状态及环境变量相关知识
linux·git·进程·环境变量·进程状态·fork
黑不溜秋的2 小时前
Ubuntu 20.04 安装 搜狗输入法
linux·运维·服务器
norsd2 小时前
CentOS 设置 DNS
linux·运维·centos
LCG米2 小时前
时间敏感网络(TSN)交换机在嵌入式实时系统中的实现与应用教程
网络
XXYBMOOO2 小时前
使用 HTML5 Canvas 实现可交互的数据瀑布流(隐藏式运维模式)
运维·交互·html5
KaDa_Duck2 小时前
DASCTF 2025下半年赛 PWN-CV_Manager复盘笔记
linux·笔记·安全