【lwip】07-链路层收发以太网数据帧源码分析

目录

  • 前言
  • 7.1 链路层概述
  • 7.2 MAC地址的基本概念
  • 7.3 以太网帧结构
  • 7.4 以太网帧结构
  • 7.5 以太网帧报文数据结构
  • 7.6 发送以太网数据帧
  • 7.7 接收以太网数据帧
  • 7.8 虚拟局域网VLAN源码分析
    • 7.8.1 以太网标准帧和VLAN帧的区别
    • 7.8.2 以太网发送带VLAN数据帧
    • 7.8.3 以太网接收带VLAN数据帧
    • 7.8.4 开启VLAN功能ETHARP_SUPPORT_VLAN
  • 7.9 一个硬件映射到多个IP
前言参考lwip的ethernet.cethernet.h文件 。原文:李柱明博客园
7.1 链路层概述简单概述 。
相关术语:
  • 结点(node):运行链路层协议的设备 。如主机、路由器、交换机和WiFi接入点 。
  • 链路(link):沿着通信路径连接相邻结点的通信信道 。
  • 数据?。毫绰凡忝恳恢∈莅黶ize有限,如果上层传递下来的数据报size超出链路层每帧能接收的数据size极限,就会分片 。(这里不细说)
在TCP/IP协议族中,链路层主要有三个目的:
  1. 为IP模块发送和接收IP数据报;
  2. 为ARP模块发送ARP请求和接收ARP应答;
  3. 为RARP发送RARP请求和接收RARP应答 。
TCP/IP支持多种不同的链路层协议,这取决于网络所使用的硬件 , 如以太网、令牌环网、FDDI(光纤分布式数据接口)及RS-232串行线路等 。
数据报从源主机传输到目标主机时 , 数据报必须通过端到端路径上的各段链路才能达到目标主机 。
各种端到端的链路层协议由具体的端到端决定,链路层设备只需要把数据报封装在自己的链路层帧并转发到下一个端设备即可 。
7.2 MAC地址的基本概念MAC Address(Media Access Control Address),亦称为EHA(Ethernet Hardware Address)、硬件地址、物理地址(Physical Address) 。
在OSI模型中 , 第三层网络层负责 IP地址,第二层数据链路层则负责 MAC位址 。
所以一个主机会有一个IP地址,而每个网络位置会有一个专属于它的MAC位址 。
MAC地址组成(48字节):前3个字节表示组织唯一标志符(OUI)+后3个字节由厂家自行分配的扩展标识符 。
7.3 以太网帧结构IEEE 802.2/802.3(RFC 1042)和以太网的封装格式(RFC 894)参考图:
7.4 以太网帧结构IEEE 802.2/802.3(RFC 1042)和以太网的封装格式(RFC 894)参考图:
【lwip】07-链路层收发以太网数据帧源码分析

文章插图
目标MAC地址(6字节):这个字段包含目标网卡的MAC地址,当一个网卡收到一个以太网数据帧 。
  • 如果该数据帧的目标地址是网卡自身的MAC地址或者是MAC广播地址,它都将该帧的数据字段的内容传递给网络层;
  • 如果收到了其他MAC地址的?。蚪檬葜《?。
源MAC地址(6字节):这个字段包含了传输该帧到局域网上的适配器的MAC地址 。类型/长度字段(2字节):类型字段允许以太网复用多种网络层协议 。是表示当前以太网帧的数据区是哪个协议的数据包 。
  • 0x0800:表示当前数据帧中装载的数据为IPV4数据报 。
  • 0x0806:表示当前数据帧中装载的数据为ARP数据报 。
  • 0x0835:表示当前数据帧中装载的数据为RARP数据报 。
  • 注意:
    • Ethernet II和IEEE802.3的帧格式主要的不同点在于前者定义的2字节的类型,而后者定义的是2字节的长度 。类型字段和长度字段互斥,但是类型值和长度值是不相同的 , 以此来区别两种帧格式 。
    • 如果该字段值大于等于0x0600时,表示数据包中的协议类型,反之表示长度 。
    • 长度字段表示它后续数据的字节长度,但不包括CRC校验码 。
数据字段(46~1500字节):这个字段承载了上层数据报 。
  • 以太网的最大传输单元(MTU)是1500字节 。这意味着如果IP数据报超过了1500字节,则主机必须将该数据报分片 。
  • 数据字段的最小长度是46字节,如果数据报小于46字节,数据报必须被填充到46字节 。当采用填充时 , 传递到网络层的数据包括数据报和填充部分,网络层使用IP数据报首部中的长度字段来去除填充部分 。
【【lwip】07-链路层收发以太网数据帧源码分析】CRC(4字节):CRC字段包含了以太网的差错校验信息 。
在以太网中MAC地址可分为3类:
  1. 单播地址 。