如IEEE 802.3第 3.2.6 节所述,前一个 Ethertype 字段可用作值 <= 1500 的长度字段。现在我想知道如何处理有关上层的此类数据包。使用长度字段的以太网帧是否仍然包含例如 IP 数据包?如果是,路由器或PC如何检测到这一点?路由器通常会如何处理使用长度而不是以太网类型的帧?
或者更普遍的问题:如果没有指定 Ethertype 但长度,接收器将如何决定如何处理有效载荷数据?
如IEEE 802.3第 3.2.6 节所述,前一个 Ethertype 字段可用作值 <= 1500 的长度字段。现在我想知道如何处理有关上层的此类数据包。使用长度字段的以太网帧是否仍然包含例如 IP 数据包?如果是,路由器或PC如何检测到这一点?路由器通常会如何处理使用长度而不是以太网类型的帧?
或者更普遍的问题:如果没有指定 Ethertype 但长度,接收器将如何决定如何处理有效载荷数据?
使用长度字段的以太网帧是否仍然包含例如 IP 数据包?
是的,您问的是RFC 1042 中涵盖的 802.3 SNAP 帧上的 IP 。
802.3 SNAP IPv4 帧看起来像这样......
+----+----+----+----+----+----+----+----+---------+-----+
| DA | SA | L | DS | SS | CL | OI | ET | Payload | FCS |
+----+----+----+----+----+----+----+----+---------+-----+
DA
: 目标 Mac 地址 (6 字节)SA
: 源 Mac 地址 (6 字节)L
:长度(2字节);(长度 <= 0x05DC 十六进制,或 1500 十进制)DS
: DSAP (1 字节); (DSAP == 0xAA 十六进制,或 170 十进制)SS
: SSAP (1 字节); (SSAP == 0xAA 十六进制,或 170 十进制)CL
:控制(1字节);(控制 == 0x03 十六进制,或 3 十进制)OI
:组织唯一标识符(3 个字节);(OUI == 0x000000 十六进制,或 0 十进制)ET
:以太网类型(2字节);(以太网类型 == 0x0800 十六进制,或 2048 十进制)Payload
:以太网有效载荷(以太网有效载荷 <= 1492 字节);此有效负载大小包括IPv4 标头的大小。FCS
: 帧校验和(4 字节)如果是,路由器或PC如何检测到这一点?
通过“检测此”,我假设您的意思是 802.3 SNAP 上的 IP;SNAP 帧首先与 Ether II / ARPA 帧区分开来,因为 Type / Length <= 0x05DC hex。然后路由器查看上面指定的其他字段......
计算机必须明确配置 SNAP 封装,以包含低于正常的 MTU(IP MTU <= 1492 字节)。虽然理论上可以将 802.3 SNAP IPv4 作为以太网 II (ARPA)包含在广播域中,但大多数人会认为您这样做很疯狂。
路由器通常会如何处理使用长度而不是以太网类型的帧?
剩下的 802.3 IP SNAP 网络不多了... Cisco IOS 用于在平底船路径中通过 SNAP 处理 IPv4;但我已经很久没有深入研究了。
为了使用最近的 Cisco IOS 进行测试,我尝试debug ip icmp
使用 802.3 SNAP IPv4 帧ping 我的一台 Cisco 3560 交换机(已启用),但该交换机只是给了我愚蠢的外观...
[mpenning@tsunami ~]$ sudo python
Python 2.7.3 (default, Jan 2 2013, 13:56:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from scapy.all import SNAP, Dot3, LLC, IP, ICMP
>>> from scapy.all import srp1
>>> pak = Dot3(dst="64:ae:de:ad:be:ef", src="80:ee:73:20:00:00") / LLC() / SNAP() / IP(src="10.0.0.5", dst="10.0.0.1") / ICMP()
>>> pak
<Dot3 dst=64:ae:de:ad:be:ef src=80:ee:73:20:00:00 |
<LLC dsap=0xaa ssap=0xaa ctrl=3 |<SNAP code=0x800 |
<IP frag=0 proto=icmp dst=10.0.0.1 |<ICMP |>>>>>
>>> srp1(pak)
Begin emission:
Finished to send 1 packets.
...................^C
Received 19 packets, got 0 answers, remaining 1 packets
Christian说:这个问题的背景是这样的:我想在 802.3 MAC 帧之上实现一个专有协议并使用长度字段。那么,使用长度字段对其他硬件和软件意味着什么?例如,将此类帧发送到 cots 系统是否安全,该系统不知道我的内部协议。
我个人不鼓励您实施私有以太网协议;二十或三十年前,人们一直在做这种事情,但今天找到自定义协议的情况越来越少。
为什么?就您所问的确切原因而言,这完全没有意义。实际上,全世界都在 IPv4 或 IPv6 之上使用“某种东西”。
如果您构建自己的协议会发生什么?
即使在同一个以太网广播域中,也很难与其他任何事物交谈……因为其他事物总是使用 IP 和以太网类型(RFC 894) 帧。
您没有路由(即能够跨多个以太网广播域发送流量,例如人们在城市和国家之间建立的网络);这也意味着你可以做一些事情,比如跨互联网桥接,这需要建立 IP 隧道。
你想要网络服务吗?猜猜你要构建什么:
从广义上讲,自定义以太网协议需要所有相关操作系统的内核驱动程序;您真的要构建和分发内核驱动程序吗?如果您使用 IP,那就更简单了,因为您可以让服务在现有 IP 内核驱动程序之上进行侦听;只需绑定到端口号并利用内置 IP 内核驱动程序即可。
然而,使用 IP 构建的代价是使用以太网 II (ARPA) 封装(即以太网帧中没有长度字段)。
也许您仍然想使用自己的自定义以太网协议;至少现在你对相关的权衡有了更多的了解。
当 MAC 帧具有长度字段 (L/T <= 05-DC) 时,有效载荷将发送到 LLC 层,而不是 IP。它用于 MAC 控制平面,例如用于生成树。
最好的问候,米歇尔