【Linux网络编程】9. 数据链路层

文章目录

  • 一、数据链路层
    • [1、对比理解 "数据链路层" 和 "网络层"](#1、对比理解 "数据链路层" 和 "网络层")
    • 2、认识以太网
    • 3、以太网帧格式
    • [4、MAC 地址](#4、MAC 地址)
    • [5、MAC 地址 & IP 地址](#5、MAC 地址 & IP 地址)
  • 二、MTU
    • 1、MTU(最大传输单元)
    • [2、MTU 对 IP 协议的影响](#2、MTU 对 IP 协议的影响)
    • [3、MTU 对 UDP 协议的影响](#3、MTU 对 UDP 协议的影响)
    • [4、MTU 对 TCP 协议的影响](#4、MTU 对 TCP 协议的影响)
    • [5、查看硬件地址和 MTU](#5、查看硬件地址和 MTU)
  • 三、ARP协议
    • [1、ARP 协议作用](#1、ARP 协议作用)
    • [2、ARP 协议工作流程](#2、ARP 协议工作流程)
    • [3、ARP 数据报格式](#3、ARP 数据报格式)

一、数据链路层

核心作用:在同一网段内,实现两个相邻设备之间的帧传输,负责把 IP 数据报封装成帧,通过物理地址(MAC 地址)完成点到点的交付。

1、对比理解 "数据链路层" 和 "网络层"

层级 核心目标 寻址方式 传输范围 关键比喻
数据链路层 同一网段内,相邻设备间的帧交付 MAC 地址 一跳(直连节点) 同城快递,负责从小区到隔壁小区
网络层 跨网段,主机到主机的端到端交付 IP 地址 全网(跨网段) 全国物流,负责从寄件地址到收件地址

2、认识以太网

  • 以太网是一种局域网技术标准,覆盖数据链路层 + 物理层,定义了拓扑、介质、速率、访问控制等规范。
  • 它规定了网线用双绞线、传输速率(10M/100M/1000M 等)、CSMA/CD 访问控制方式等细节。
  • 是目前应用最广泛的局域网技术,同类还有令牌环网、无线 LAN 等。

总结: 以太网是定义了局域网传输规则的标准,是最主流的有线局域网技术

3、以太网帧格式

以太网帧的结构非常固定,核心字段如下:

字段 长度 核心作用
目的 MAC 地址 6 字节 接收方的硬件地址
源 MAC 地址 6 字节 发送方的硬件地址
类型 2 字节 标识上层协议:0x0800=IP、0x0806=ARP、0x8035=RARP
数据 46~1500 字节 承载上层数据(IP 数据报 / ARP 报文),不足 46 字节会自动填充
CRC 校验 4 字节 校验帧在传输中是否损坏

总结: 以太网帧用 MAC 地址标识收发方,用类型字段区分上层协议,用 CRC 保证数据完整性

4、MAC 地址

  • 核心作用: 数据链路层的硬件地址,用来标识局域网内的网卡设备。
  • 格式: 48 位(6 字节),通常用十六进制 + 冒号表示,如08:00:27:03:fb:19
  • 特点: 网卡出厂时固化,理论上全球唯一(部分网卡支持修改 MAC,虚拟机 MAC 可能冲突)。

5、MAC 地址 & IP 地址

  • IP 地址: 标识全网端到端 的起点、终点,负责跨网段路由
  • MAC 地址: 标识每一跳局域网 相邻设备,只负责链路内点对点转发
  • IP 定全程起点终点,MAC 定每一段路口交接

总结: 传输全程 IP 不变,每一跳 MAC 都在变

二、MTU

1、MTU(最大传输单元)

  • 核心概念: 数据链路层规定的单次传输的最大数据长度,相当于快递的包裹尺寸上限。
  • 以太网标准: MTU=1500 字节(对应以太网帧的数据字段上限),帧数据字段最小 46 字节,不足会自动填充。
  • 分片场景: 当 IP 数据包长度超过链路的 MTU 时,路由器会把它拆分成多个小分片传输,到终点再重组。
  • 关键特点: 不同网络类型(如拨号链路)的 MTU 不同,跨网络传输时会按链路的 MTU 动态处理分片。

总结:MTU 是数据链路层的 "包裹尺寸上限",超了 IP 层就分片,保证数据能顺利传输。

2、MTU 对 IP 协议的影响

  • 核心影响: 当 IP 数据包长度超过链路 MTU 时,必须被分片传输。
  • 分片标识: 所有分片的 IP 头中,16 位标识(id)相同,用来标记它们属于同一个原始数据包。
  • 结束标记: IP 头的 3 位标志中,第 3 位表示 "更多分片",非最后一个分片置为1,最后一个分片置为0
  • 重组规则: 接收端根据标识(id)分片偏移,按顺序把分片拼装还原。
  • 关键问题: 只要有一个分片丢失,整个数据包的重组就会失败,且 IP 层不负责重传,需要上层(如 TCP)处理重传逻辑。

总结: IP 分片是为了适配 MTU,用相同标识 + 偏移拆分大包,丢一个分片就全失败,IP 层不负责重传

3、MTU 对 UDP 协议的影响

  • 以太网 MTU=1500 字节,扣除 IP 头 20 字节、UDP 头 8 字节,UDP 单次最大有效数据是 1472 字节
  • 超过 1472 字节的 UDP 数据,会被 IP 层拆分成多个分片传输。
  • 只要任意一个分片丢失,整个 UDP 数据报就无法重组,导致传输失败,丢包概率大幅上升。

总结: UDP 大包会被 IP 分片,分片丢一个,整个包就废了,所以 UDP 要控制单次发送数据不超过 1472 字节

4、MTU 对 TCP 协议的影响

  • MSS(最大分段大小): TCP 单个报文段中,纯数据部分的最大长度,不包含 TCP 头和 IP 头。
  • 以太网中,MSS = MTU(1500) - IP头(20) - TCP头(20) = 1460字节

MSS 协商机制

  1. TCP 三次握手时,双方会在 SYN 报文中携带自己支持的 MSS 值。
  2. 通信双方会取对方 MSS 的较小值作为最终协商的 MSS,避免数据被 IP 分片。
  3. 目的是让 TCP 报文段封装成 IP 数据报后,长度不超过链路 MTU,从而避免分片带来的丢包风险。

总结: TCP 通过协商 MSS,让每个报文段刚好适配 MTU,从源头避免 IP 分片,保证传输更可靠

5、查看硬件地址和 MTU

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

三、ARP协议

ARP不属于纯数据链路层 ,是介于网络层和数据链路层之间的协议。

1、ARP 协议作用

  • 核心:建立 IP 地址与 MAC 地址的映射关系。
  • 通信时只知道对方IP ,不知道MAC,没法封装以太网帧。
  • 网卡只认 MAC 地址,MAC 不匹配直接丢包,所以必须先用 ARP由 IP 查 MAC,才能正常发数据。

2、ARP 协议工作流程

  1. ARP 请求: 源主机广播 ARP 请求包(目的 MAC 为全FF:FF:FF:FF:FF:FF),询问目标 IP 对应的 MAC 地址。
  2. ARP 应答: 目标主机收到请求后,发现 IP 匹配,单播回复 ARP 应答包,告知自己的 MAC 地址。
  3. ARP 缓存: 源主机收到应答后,将 IP 与 MAC 的映射存入 ARP 缓存表(可用arp -a查看),缓存表项有 20 分钟左右的过期时间。
  • 为什么要有缓存表?

    避免每次通信都广播 ARP 请求,减少网络流量,提升通信效率。

  • 为什么表项要有过期时间?

    防止主机更换网卡、IP 地址变动或设备下线后,缓存表项失效导致通信错误,确保映射关系始终是最新的。

3、ARP 数据报格式

ARP 数据报是以太网帧内的载荷,整体结构分为「以太网首部」和「ARP 报文」两部分。

以太网首部(14 字节)

字段 长度 作用
目的 MAC 地址 6 字节 广播时为 FF:FF:FF:FF:FF:FF
源 MAC 地址 6 字节 发送方网卡的 MAC 地址
帧类型 2 字节 0x0806 表示这是 ARP 报文

ARP 报文(28 字节,核心部分)

字段 长度 关键说明
硬件类型 2 字节 1 表示以太网
协议类型 2 字节 0x0800 表示 IP 地址
硬件地址长度 1 字节 以太网 MAC 地址为 6 字节
协议地址长度 1 字节 IPv4 地址为 4 字节
op(操作码) 2 字节 1 = ARP 请求,2 = ARP 应答
发送端 MAC 地址 6 字节 发送方的 MAC 地址
发送端 IP 地址 4 字节 发送方的 IP 地址
目的端 MAC 地址 6 字节 请求时为全 0,应答时填入目标 MAC
目的端 IP 地址 4 字节 要查询的目标 IP 地址
相关推荐
可乐鸡翅yeah_2 小时前
个人 / 外包流媒体项目交付实战,M3U8 验收与问题闭环完整工作流
运维·网络·python·低代码·django·m3u8·在线播放
2601_962071572 小时前
如何利用SpringSecurity进行认证与授权
java·服务器·数据库
w200512243 小时前
Pod管理
linux·服务器·云原生·容器·k8s·podman
黄俊懿3 小时前
【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第十节:网关安全-单向加密
网络·数据库·计算机网络·安全·架构·系统架构·架构师
Patrick在香港3 小时前
Python 拉取城巴开放数据:406 条路线,香港岛巴士网络的数字画像
网络·python·数据分析·php·数据可视化·香港·开放数据
chen<>4 小时前
C++ 六种 memory_order:从原子性到线程间可见性.md
java·linux·开发语言·c++
一直C4 小时前
Linux系统编程|进程间通信IPC全套详解(1)(管道、信号)
linux·c语言·开发语言·网络·青少年编程·visual studio code
Experience-摆渡4 小时前
自建 IP 轮换方案实战:健康探测 + 熔断剔除 + 粘性会话
网络·网络协议·tcp/ip
会周易的程序员4 小时前
企业私有 AI 算力服务器架构设计:异构四节点 + QUIC 微服务
运维·服务器·c++·人工智能·微服务·架构
luj_17684 小时前
合法避税与投资评估实战指南
c语言·开发语言·网络·经验分享·算法