ethernet 包头中的 type 字段与 IPv4/IPv6 包头中的 version 字段问题

2022-11-10 19:07:26 +08:00
 huangya
ethernet 包头中的 type 字段指明了包的类型,比如 ARP 对应的值是 0806 ,Internet IP ( IPv4 )包对应 type 字段是 0800 ,IPv6 对应的 type 字段是 86DD. 而 IPv4 和 IPv6 网络层又有一个 version 字段。我今天突然在想当初在发展 IPv6 的时候,为什么不与 IPv4 共用相同的 ethernet type 字段呢?网络层的 version 字段不就可以区分到底是 v4 还是 v6 吗?
1264 次点击
所在节点    宽带症候群
16 条回复
Jirajine
2022-11-10 19:17:44 +08:00
因为 ipv6 和 ipv4 的差异不仅仅是在网络层,像 ARP 就没有了改用 NDP 。
huangya
2022-11-10 19:21:44 +08:00
@Jirajine 这个 version 让人容易困惑,特别是当 IPv4 的时候它的值是 4 ,而 IPv6 的时候它是 6.让人感觉 ethernet 数据链路层是一样的。
Tianao
2022-11-10 19:21:55 +08:00
leonshaw
2022-11-10 19:38:14 +08:00
过度设计,当个冗余校验吧
sujin190
2022-11-10 19:52:50 +08:00
@huangya #2 IPv4/IPv6 数据包不止可以在 ethernet 链路上传输,这么说就不困惑了吧
echoechoin
2022-11-11 09:32:08 +08:00
ipv6 和 ipv4 是两个几乎完全不同的协议栈
huangya
2022-11-11 09:46:22 +08:00
@sujin190 你这样说,感觉好像我们两个人的理解仍然有分歧。我知道 IPv4/IPv6 不止可以在 ethernet 链路上传输。我帖子里面其实说的就是都在 ethernet 链路上传输的情况下,为什么在 etherne 链路层的 type 不一样。按理说,两个都是 ethernet 链路上传输,链路层的头部可以一样,只要在 IP 网络层通过 version 区分就可以了。

其他 V 友没有类似的疑问吗?
sujin190
2022-11-11 10:11:32 +08:00
@huangya #7 这话反过来也一样啊,ethernet 也不止可以传输 IPv4/IPv6 数据包

首先 ethernet 是二层协议,有个流量类型只是方便设备间通信与分析以及 qos 、防火墙等的控制,但实际通信过程中二层协议并不会解析四层 IPv4/IPv6 的数据包,所以并不能使用 IPv4/IPv6 的 version 字段,一层是一层互不干扰啊,否则哪天 IPv4/IPv6 协议有调整你的所有硬件设备不全废了,比如局域网交换机之间二层协议通信直接 ethernet 层就完成了,并不会进入网络栈,也不会解析 IPv4/IPv6 协议

再说要按你这么说,更上层的协议包含重复信息更多,既然如此为啥还要分 IPv4/IPv6 ,不直接用应用层协议提供的信息呢,这不是一个逻辑么
sujin190
2022-11-11 10:19:15 +08:00
@huangya #7 还有吧,网卡再收到 ethernet 数据包之后首先得知道这是啥数据包,然后才能决定交给 v4 还是 v6 网络栈处理,或者就是其他类型的数据包,比如带宽协商,ethernet 一般是硬件绑定的,比如你买的网卡出厂就已经告诉你使用的 ethernet 协议,你几乎不可能说改成蓝牙网卡之类的,但你用它来组 IPv4/IPv6 网络这个则是操作系统通过驱动和网络栈来完成的,你要是自己搞搞驱动或网络栈,你也可以自己搞个叫 IPv888 的网络啊
sujin190
2022-11-11 10:24:42 +08:00
@huangya #7 而且吧服务器机房现在 40G 、400G 或者更高速网络使用的网卡很多就不是 ethernet 网卡,厂家自己搞的一套协议,然后同时提供驱动
huangya
2022-11-11 10:39:36 +08:00
@sujin190
>首先 ethernet 是二层协议,有个流量类型只是方便设备间通信与分析以及 qos 、防火墙等的控制,但实际通信过程中二层协议并不会解析四层 IPv4/IPv6 的数据包.
这个地方应该是打错了吧,IPv4/IPv6 是三层包。

> 还有吧,网卡再收到 ethernet 数据包之后首先得知道这是啥数据包,然后才能决定交给 v4 还是 v6 网络栈处理
网卡收到 ethernet 数据包,并不知道它是 v4 还是 v6 吧。解析是什么包,是操作系统 ethernet 链路层的代码做的吧。

根据我的疑问,假设 v6 也是用 0800 的 type.操作系统可不可以这样做: 把 v4 和 v6 的代码放在网络层,ethernet 链路层的代码看到 type 是 0800 ,就把这个包交个网络层的代码来处理和解析,网络层的代码看到 version 是 4 ,就交给 v4 的协议栈,如果是 6 ,就交给 v6 的协议栈。
sujin190
2022-11-11 11:04:43 +08:00
@huangya #11 对,IPv4/IPv6 是三层包。。

ethernet 标识相同 code 是 ip 包然后由操作系统来区分当然也是可以的,但是是否选择这样做的考量点其实是上层协议的广泛和重要程度,也就是成本考量,如果 ethernet 无法区分上层协议是 v4 还是 v6 ,那么也就意味着 ethernet 没有为上层协议优化的可能了,比如 v4 和 v6 的包大小就完全不一样,也许会针对这个在硬件层面做优化,还有链路层针对 IPv4/IPv6 的 qos ,虽然都可以在网络栈里处理,区别就是延时波动、功耗、效率,一个使用更为广泛的协议必然需要考虑更多场景,就算这个场景再小,你不但遇不到甚至都想不到,但也是需要考量的,比如汽车内部使用 ethernet 网的时候对延时波动就有更苛刻的需求,需要内核的网络栈解析就可能大幅降低延时波动的可靠性
huangya
2022-11-11 11:09:54 +08:00
@sujin190 你说在硬件层面可以在 ethernet 方面做优化,这个是我以前不知道的。这个说法很有道理。你这样说,我理解很多了,感谢分享!

其他 v 友如果有更多想法,也欢迎分享!
cwek
2022-11-11 19:02:58 +08:00
其实最简单就是:
1.分层网络
2.链路层,或者以太网上不一定是只跑 IP (历史上网络层以上还有 Novell IPX/SPX ,苹果也有自己一套网络层协议(好像是 AppleTalk ))。同样,网络层,或者 IP 也不知道下面怎样承载它的信息(有没带版本或者网络层标识等,因为链路层可能是一堆鸽子……)

所以,网络层的 IP 需要承载自己的版本号,链路层也可能需要承载起其上面层的标识(只是这个标识可能刚好是 IP 的两种版本)。
huangya
2022-11-12 18:47:39 +08:00
@cwek
>所以,网络层的 IP 需要承载自己的版本号,链路层也可能需要承载起其上面层的标识(只是这个标识可能刚好是 IP 的两种版本)

正是因为“这个标识可能刚好是 IP 的两种版本”, 所以我才产生了这个困惑。
cwek
2022-11-13 08:45:27 +08:00
@huangya

总之就是链路层不知道上面层具体承载什么结构,最多就是知道上面层对应链路层的一个数据标示(可能是 IPv4,IPv6,ARP,IPX )

同样,网络层也不知道链路层怎样承载它的数据,有没数据标识(可能用于区分版本号),所以自己也需要一个版本来区分。

在古老时代,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/894232

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX