构建 (a) 有效和 (b) 最小尺寸的单播、广播和组播以太网帧

问题描述 投票:0回答:1

我有一个“KSZ8851SNL评估板”链接),它是一个以太网设备,并且是我的“SPI主机”“SPI从机”,即“ST Nucleo F429ZI”链接)。

我编写了一个在“SPI master”上运行的驱动程序。使用驱动程序,我使用 MAC 地址 00:0b:00:00:00:00 初始化“SPI 从机”,启用环回接口并且

无地址过滤
。通过此设置,我可以发送一个 “随机字节块” (不是正确的以太网帧),这些数据由环回接口返回,以便我可以读取它们并验证是否已收到所有发送的字节。 但是当我使用 MAC 地址

00:0b:00:00:00:00

初始化 “SPI 从站”、启用环回接口和

地址过滤
时,我会遇到问题,因为 “随机数据斑点” 不是正确的以太网帧,而是被过滤掉了,这样我就收不到了。 此时我想停止使用

“随机数据斑点”

并知道如何构建适当的最小大小:

    “单播”
  • 以太网帧
  • “多播”
  • 以太网帧
  • “广播”
  • 以太网帧
  • 我在维基百科上阅读了很多内容(
link

),我还发现了一张漂亮的图片(link)。但是,当您只有 MAC 地址而没有 IP 地址时,是否有可能发送正确的以太网帧?没有选项可以设置参考手册(链接)中描述的“KSZ8851SNL”的IP地址...我想到的一件事是发送带有空负载的以太网帧。这可能吗? 有人可以告诉我如何构建这些框架吗?有什么工具可以帮助我进行构建吗?

ip ethernet
1个回答
1
投票

ARP 是一个易于构建的框架,我们可以使用 ARP 请求作为您的广播/组播消息,并将 ARP 回复作为您的单播消息。

ARP请求包的结构如下(使用

方框图

): ┏━━━━━━━┳━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┳━━━━━━━━┓ ┃Offsets┃Octet┃ 0 ┃ 1 ┃ 2 ┃ 3 ┃ ┣━━━━━━━╋━━━━━╋━━━━━━━━╋━━━━━━━━╋━━━━━━━━╋━━━━━━━━┫ ┃ Octet ┃ Bit ┃01234567┃01234567┃01234567┃01234567┃ ┣━━━━━━━╋━━━━━╋━━━━━━━━┻━━━━━━━━┻━━━━━━━━┻━━━━━━━━┩ ┃ 0 ┃ 0 ┃ Destination MAC Address │ ┣━━━━━━━╋━━━━━┫ ┌─────────────────┤ ┃ 4 ┃ 32 ┃ │ │ ┣━━━━━━━╋━━━━━╉─────────────────┘ │ ┃ 8 ┃ 64 ┃ Source MAC Address │ ┣━━━━━━━╋━━━━━╉─────────────────┬─────────────────┤ ┃ 12 ┃ 96 ┃ Ethertype 0x0806│ HTYPE 0x0001 │ ┣━━━━━━━╋━━━━━╉─────────────────┼────────┬────────┤ ┃ 16 ┃ 128 ┃ PTYPE 0x0800 │ HLEN 6 │ PLEN 4 │ ┣━━━━━━━╋━━━━━╉─────────────────┼────────┴────────┤ ┃ 20 ┃ 160 ┃ Opcode 0x0001 │ │ ┣━━━━━━━╋━━━━━╉─────────────────┘ │ ┃ 24 ┃ 192 ┃ Sender hardware (MAC) Address │ ┣━━━━━━━╋━━━━━╉───────────────────────────────────┤ ┃ 28 ┃ 224 ┃ Sender protocol (IP) address │ ┣━━━━━━━╋━━━━━╉───────────────────────────────────┤ ┃ 32 ┃ 256 ┃ Target hardware (MAC) Address │ ┣━━━━━━━╋━━━━━┫ ┌─────────────────┤ ┃ 36 ┃ 288 ┃ │Target protocol->│ ┣━━━━━━━╋━━━━━╉─────────────────┼─────────────────┤ ┃ 40 ┃ 320 ┃-> (IP) address │ Padding │ ┣━━━━━━━╋━━━━━╉─────────────────┘ │ ┃ 44 ┃ 352 ┃ │ ┃ 48 ┃ 384 ┃ │ ┃ 52 ┃ 416 ┃ │ ┃ 56 ┃ 448 ┃ │ ┣━━━━━━━╋━━━━━╉───────────────────────────────────┤ ┃ 60 ┃ 480 ┃ CRC32 │ ┗━━━━━━━┻━━━━━┹───────────────────────────────────┘

假设您的网卡 MAC 地址是 
aa:bb:cc:dd:ee:ff

,因此以下数据包是:

广播

:从您的 MAC 地址到 0x0001

 的 ARP 请求数据包(操作码 
ff:ff:ff:ff:ff:ff
0000 ff ff ff ff ff ff aa bb cc dd ee ff 08 06 00 01 0010 08 00 06 04 00 01 aa bb cc dd ee ff 00 00 00 00 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0030 00 00 00 00 00 00 00 00 00 00 00 00

多播

:从您的 MAC 地址到 0x0001(更多详细信息在我的消息末尾)

 的 ARP 请求数据包(操作码 
01:00:5e:00:01:01
0000 01 00 5e 00 01 01 aa bb cc dd ee ff 08 06 00 01 0010 08 00 06 04 00 01 aa bb cc dd ee ff 00 00 00 00 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0030 00 00 00 00 00 00 00 00 00 00 00 00

单播

:从 0x0002 到您的 MAC 地址

的 ARP 回复数据包(操作码 
22:22:22:22:22:22
0000 aa bb cc dd ee ff 22 22 22 22 22 22 08 06 00 01 0010 08 00 06 04 00 02 22 22 22 22 22 22 00 00 00 00 0020 aa bb cc dd ee ff 00 00 00 00 00 00 00 00 00 00 0030 00 00 00 00 00 00 00 00 00 00 00 00

关于多播,MAC 地址最高有效八位字节中的最低有效位是多播位,换句话说,如果 MAC 第一个八位字节如下所示:
???????1

(这就是为什么广播被视为特殊类型的多播)。 请注意,在我的示例中,“您的”MAC 地址以

0xaa
==
0b10101010
开头,因此它不是多播 MAC 地址。
因此,为了发送多播,我使用了 MAC 地址 

01:00:5E:00:01:01

,这是对应于 IPv4 多播地址

224.0.1.1
的 MAC 地址。
这些数据包可以使用

K12格式

保存为文本文件(在文件末尾保留一个空行) +---------+---------------+----------+ 00:00:00,000,000 ETHER |0 |ff|ff|ff|ff|ff|ff|aa|bb|cc|dd|ee|ff|08|06|00|01|08|00|06|04|00|01|aa|bb|cc|dd|ee|ff|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00| +---------+---------------+----------+ 00:00:00,000,000 ETHER |0 |01|00|5e|00|01|01|aa|bb|cc|dd|ee|ff|08|06|00|01|08|00|06|04|00|01|aa|bb|cc|dd|ee|ff|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00| +---------+---------------+----------+ 00:00:00,000,000 ETHER |0 |aa|bb|cc|dd|ee|ff|22|22|22|22|22|22|08|06|00|01|08|00|06|04|00|02|22|22|22|22|22|22|00|00|00|00|aa|bb|cc|dd|ee|ff|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|00|

如果您想要一个更简单的帧,您可以使用 Ethertype 0x9000(环回)进行广播和单播。
我不熟悉这个协议,我不知道你的硬件是否支持它,但你可以尝试让我知道,所以我会更新我的答案。

结构如下:

6 个八位字节:目标 MAC 地址
  • 6 个八位字节:源 MAC 地址
  • 2 个八位字节:以太网类型 0x9000
  • 2 个八位字节:跳过计数 0x0000
  • 2个八位字节:相关功能回复0x0100
  • 2 个八位字节:收据号 0x0000
  • 40 个八位字节:填充
广播

(对于多播,替换目标 MAC ff:ff:ff:ff:ff:ff

0000   ff ff ff ff ff ff aa bb cc dd ee ff 90 00 00 00
0010   01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0020   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030   00 00 00 00 00 00 00 00 00 00 00 00

单播

0000 aa bb cc dd ee ff 22 22 22 22 22 22 90 00 00 00 0010 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0030 00 00 00 00 00 00 00 00 00 00 00 00

© www.soinside.com 2019 - 2024. All rights reserved.