【Linux笔记】网络部分——数据链路层mac-arp
44. 数据链路层
文章目录
- 44. 数据链路层
- 提要——数据链路层与网络层
- 以太网
- 以太网帧格式
- MAC地址
- MTU
- MTU对传输层协议的影响
- 局域网通信原理与MAC帧处理机制
- 局域网传输的基本流程
- MAC地址
- 局域网通信的碰撞检测
- 交换机的工作原理
- ARP协议
提要——数据链路层与网络层
在前面我们学习网络层IP的时候,我们提到:
网络通信中主机之间不是直接连接的,数据需要通过多个路由器转发。简而言之,数据在网络层传输聚焦于两个问题:为什么要交给下一个路由器(路径选择)?如何将数据交给下一个路由器?
- 路径选择问题由网络层决定,具体由IP协议处理。在网络通信中,每个主机和路由器都需要具有唯一性的IP地址,特别是公网IP地址,以确保全球范围内的唯一性。IP地址分为子网IP和内网IP,以及公网IP。公网IP具有全球唯一性,例如云服务器的IP地址可以在任何地方访问。主机b在进行路径选择时,主机c的IP地址是一个重要依据。(这是之前网络层IP的重点内容)
- 数据如何在相邻设备之间传输,则属于局域网通信问题。整个网络通信可以看作是由无数个局域网通信共同构成的广域网通信。局域网通信涉及数据链路层,包括MAC地址和碰撞检测等技术(有关数据链路层的问题在下一小节解释)。网络层和数据链路层各自解决不同的问题,网络层关注路径选择,数据链路层关注相邻设备间的数据传输。(这是这篇博客的主要内容)
数据链路层解决相邻主机直接通信的问题,通过MAC帧协议支持局域网通信。网络层决定路径选择,而链路层决定如何将数据从一台主机真正传递到另一台主机。IP报文需要交给下层真正转发,物理结构上传输的是帧,逻辑上认为IP在流动,但IP的流动需要MAC帧的支持。数据链路层解决网络分层的最后一个问题,即相邻主机直接通信的问题。
以太网
常见的局域网标准有以太网、令牌环网和无线局域网,其中以太网是最常见的。以太网是一种技术标准,不是具体网络,采用同一种标准即可。以太网规定了网络拓扑结构、访问控制和传输速率等,通信主要使用双绞线,传输速率有10兆、100兆和1000兆。以太网是当今应用最广泛的局域网技术。
网络世界中先有局域网后有广域网,因为早期各组织先解决内部通信问题,后来发展出广域网和互联网。局域网标准多样,如以太网、令牌环网和无线局域网,是被大浪淘沙后留下的较好标准。解决局域网通信问题后,伴生出跨网络通信需求,IP地址统一了网络通信,屏蔽底层网络差异。局域网通信标准多样,以太网是其中之一。
以太网帧格式
以太网的帧格式中,有效载荷部分来自网络层构建的报文,包括IP报头和有效载荷,数据帧加上自己的报头。有效载荷的长度与MTU有关,且长度不能小于46字节。以太网封装中,每台主机除了IP地址还有MAC地址,用于在局域网中区分主机唯一性。

- 源地址和⽬的地址是指⽹卡的硬件地址(也叫MAC地址), ⻓度是48位,是在⽹卡出⼚时固化的
- 帧协议类型字段有三种值,分别对应IP、ARP、RARP;
- 帧末尾是CRC校验码
MAC地址
- MAC地址⽤来识别数据链路层中相连的节点;
- ⻓度为48位, 及6个字节. ⼀般⽤16进制数字加上冒号的形式来表⽰(例如: 08:00:27:03:fb:19)
- 在⽹卡出⼚时就确定了, 不能修改. mac地址通常是唯⼀的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些⽹卡⽀持⽤⼾配置mac地址)
MAC地址的有效范围仅限于局域网内,因为数据报文在路由过程中会进行解包和重新封包,MAC地址在这个过程中会不断变化。MAC地址类似于硬件设备的序列号,如内存、磁盘和CPU都有唯一的序列值,网卡的MAC地址是专门为网络设计的。硬盘厂商使用序列值来追踪产品的交付状况,例如通过序列值可以追溯到故障硬盘的生产工厂和经手人。MAC地址在硬件领域并不陌生,许多设备都有类似的唯一标识概念。
MTU
数据链路层的MAC帧在封装IP报文时,其有效载荷部分不能超过一个限制长度,称为MTU,也就是最大传输单元。MTU相当于发快递时对包裹尺⼨的限制. 这个限制是不同的数据链路对应的物理层, 产⽣的限制.
- 以太⽹帧中的数据⻓度规定最⼩46字节,最⼤1500字节,ARP数据包的⻓度不够46字节,要在后⾯补填充位; 不同的网络类型有不同的MTU
- 如果⼀个数据包从以太⽹路由到拨号链路上,数据包⻓度⼤于拨号链路的MTU了,则需要对数据包进⾏分⽚(fragmentation)
- 不同的数据链路层标准的MTU是不同的
MTU对传输层协议的影响
MTU对传输层协议(如UDP和TCP)有显著影响。
对于UDP协议,UDP数据包的有效载荷若超过1472字节(1500字节减去20字节IP报头和8字节UDP首部),则会在网络中被拆分为多个IP数据报。任一数据报丢失将导致重组失败,从而增加UDP丢包概率。
对于TCP协议,由于受制于MTU,单个数据包的最大消息长度不能无限大,这个最大消息长度称为MSS。MSS的值一般为1460。1460这个数字的由来是因为IP报头标准长度是20个字节,整体长度不能超过1500字节。传输层交给网络层的报文长度不能超过1480字节,这个1480字节包含20字节的TCP报头,所以去除TCP报头的有效载荷为1460。因此滑动窗口中的数据不能整体打包发送,必须切分成最大1460字节的小段发送,这样可以避免底层分片。
TCP通信双方在三次握手时会协商MSS值,通常选择双方MSS值中较小的一个作为通信标准。MSS值不是通过TCP标准报头字段传递的,而是通过TCP选项字段中的40字节变长选项进行设置和交换的。MSS的理想值正好是IP层不会被分片处理的最大长度,主要受MTU限制。
局域网通信原理与MAC帧处理机制
这个内容其实已经在网络基础部分已经说了
局域网传输的基本流程
MAC地址
局域网内的主机可以直接通信,不需要经过复杂的网络路由。例如在家庭网络中,电脑、手机等设备连接同一个路由器就属于同一个局域网,使用手机热点时,连接该热点的设备也属于同一个局域网。
在局域网中,每台主机都有一个唯一的MAC地址作为标识。
MAC地址是网卡出厂时内置的48位固定序列值,用于在局域网中唯一标识每台主机。
在局域网通信时,发送的报文中会包含源MAC地址和目标MAC地址。所有主机都能收到这个报文,但只有目标MAC地址与自身匹配的主机才会处理,其他主机会丢弃该报文。
可以通过ifconfig命令查看Linux系统的MAC地址,通常显示为以太网接口eth0或ens3的硬件地址。Windows系统则使用ipconfig命令查看,显示为以太网适配器的物理地址。
局域网通信的原理类似于教室场景,当老师点名时,虽然所有人都能听到,但只有被叫到名字的学生会回应。类似地,在局域网中,所有主机都能收到传输的报文,但只有目标主机会处理。每台主机通过比较报文中的目标MAC地址与自身地址来决定是否处理该报文。
MAC的唯一性:MAC地址内嵌在网卡中,出厂时即确定,一般不能修改,具有唯一性。虚拟机使用的MAC地址并非真实,而是通过虚拟化技术构建的。MAC地址的唯一性只需在局域网内保证即可,因此可以在局域网内自行构建48比特位的16进制值,只要不与局域网内其他地址冲突即可。
局域网通信的碰撞检测
早期使用集线器(Hub) 构建的共享式以太网:局域网通信中,任何时刻只允许存在一份有效报文,否则会发生数据碰撞。例如,主机A和主机B同时发送报文会导致光电信号干扰,称为碰撞。发生碰撞后,主机会执行碰撞检测和碰撞避免机制,随机休眠一段时间后重发报文。这种机制可以避免持续冲突,让其他主机在休眠期间正常通信。休眠期间,其他主机可以正常通信,从而释放网络资源。这种机制类似于在教室中多人同时说话导致混乱,通过轮流发言避免干扰。
以太网局域网被定义为一个碰撞域,其中多台主机共享通信资源。当多台主机同时发送数据时会发生数据碰撞,导致互相干扰。发送主机需要进行碰撞检测和碰撞避免来确保通信可靠性。
从互斥的角度理解碰撞机制:碰撞检测和避免的本质是保证以太网使用的唯一性。以太网被视为一种临界资源,所有主机以互斥方式访问,但采用的是特殊的不加锁方式,即直接使用并在碰撞出错后再处理。主机发送数据时执行的代码被称为临界区,通过碰撞检测和避免算法来保证临界资源使用时的数据读写原子性。
交换机的工作原理
- 交换机是一种网络设备,用于划分碰撞域,减少局域网中的数据包碰撞。当交换机刚上线时,它对网络情况一无所知,会无差别地转发所有收到的数据帧。例如,主机a发送数据帧给主机e,交换机会将数据帧从左侧接口转发到右侧接口,所有主机都会收到这个数据帧。
- 交换机虽然不处理数据帧的内容,但会分析数据帧的源和目的MAC地址。通过这种方式,交换机可以学习到哪些主机位于哪个接口。例如,如果交换机在左侧接口收到源MAC地址为a的数据帧,它可以确定主机a位于左侧。同样,如果右侧接口收到源MAC地址为e的数据帧,交换机可以确定主机e位于右侧。
- 随着时间的推移,交换机会建立一个MAC地址表,记录每个主机对应的接口。这样,当主机a再次发送数据帧给主机e时,交换机会直接将数据帧从左侧转发到右侧,而不需要无差别扩散。如果主机a和主机b通信,数据帧只在左侧交换,不会影响右侧的主机。
- 交换机通过这种方式划分碰撞域,减少碰撞概率,提高网络效率。交换机通常用于学校机房和企业网络,家庭路由器虽然具有交换机功能,但效果有限。交换机还可以连接路由器,根据目标地址将报文直接交给路由器,不再影响其他主机。

ARP协议
在网络通信中,数据包转发通常使用IP地址进行路由,但在局域网通信中,数据帧的传输依赖于MAC地址。这引发了一个问题:到底使用IP地址还是MAC地址进行通信?为了解决这个问题,需要引入ARP协议。
ARP协议用于将IP地址转换为MAC地址,从而实现数据包从网络层到数据链路层的顺利传递。主机在发送数据包时,首先通过ARP协议获取目标主机的MAC地址,然后将数据包封装成数据帧,通过局域网传输。如果目标主机不在同一局域网,数据包会通过路由器转发,路由器同样使用ARP协议获取下一跳的MAC地址。这种机制确保了IP地址和MAC地址在网络通信中的协同工作。
此外,网卡有一种混杂模式,可以接收所有经过的数据帧,而不仅仅是目标地址为本机的数据帧。这种模式常用于网络抓包工具,如tcpdump,用于分析网络流量。混杂模式使得主机能够捕获局域网中的所有数据帧,即使这些数据帧的目标地址不是本机。这种功能在网络安全和故障排查中非常有用。


