大家好,上次我们学习了网络层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 MTU对IP****协议的影响
由于数据链路层 MTU 的限制 , 对于较大的 IP 数据包要进行分包:
将较大的 IP 包分成多个小包 , 并给每个小包打上标签 ;
每个小包 IP 协议头的 16 位标识 (id) 都是相同的 ;
每个小包的 IP 协议头的 3 位标志字段中 , 第 2 位置为 0, 表示允许分片 , 第 3 位来表示结束标记( 当前是否是最后一个小包 , 是的话置为 1, 否则置为 0);
到达对端时再将这些小包 , 会按顺序重组 , 拼装到一起返回给传输层 ;
一旦这些小包中任意一个小包丢失 , 接收端的重组就会失败 . 但是 IP 层不会负责重新传输数据;


2.6 MTU对UDP****协议的影响
让我们回顾一下 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 泛洪"),保持目标缓存中的错误记录(相当于每隔几分钟就给你发一次 "快递站新车牌" 的消息,让你一直信以为真)。
以上就是今天我们学习的数据链路层的所有内容,如果感到有收获的话还请点赞收藏,那我们下次再见!