V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huangya
V2EX  ›  宽带症候群

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

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

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

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

    再说要按你这么说,更上层的协议包含重复信息更多,既然如此为啥还要分 IPv4/IPv6 ,不直接用应用层协议提供的信息呢,这不是一个逻辑么
    sujin190
        9
    sujin190  
       2022-11-11 10:19:15 +08:00
    @huangya #7 还有吧,网卡再收到 ethernet 数据包之后首先得知道这是啥数据包,然后才能决定交给 v4 还是 v6 网络栈处理,或者就是其他类型的数据包,比如带宽协商,ethernet 一般是硬件绑定的,比如你买的网卡出厂就已经告诉你使用的 ethernet 协议,你几乎不可能说改成蓝牙网卡之类的,但你用它来组 IPv4/IPv6 网络这个则是操作系统通过驱动和网络栈来完成的,你要是自己搞搞驱动或网络栈,你也可以自己搞个叫 IPv888 的网络啊
    sujin190
        10
    sujin190  
       2022-11-11 10:24:42 +08:00
    @huangya #7 而且吧服务器机房现在 40G 、400G 或者更高速网络使用的网卡很多就不是 ethernet 网卡,厂家自己搞的一套协议,然后同时提供驱动
    huangya
        11
    huangya  
    OP
       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
        12
    sujin190  
       2022-11-11 11:04:43 +08:00   ❤️ 2
    @huangya #11 对,IPv4/IPv6 是三层包。。

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

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

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

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

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

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

    在古老时代,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2746 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:00 · PVG 17:00 · LAX 01:00 · JFK 04:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.