【问题标题】:IPv6 header structure in linux kernel [duplicate]Linux内核中的IPv6标头结构[重复]
【发布时间】:2021-11-27 03:30:58
【问题描述】:

在查看 linux 的源代码时,我遇到了以下关于 IPv6 标头格式的定义,并且根据字节序对“优先级”和“版本”字段的顺序感到困惑。 我认为这两个字段都是 4 位(半字节)并且它们与字节序无关。 我不明白为什么 linux 内核会这样定义 ipv6 标头。

关于这个结构还有另一个问题。 根据https://en.wikipedia.org/wiki/IPv6_packet,流量类是8位,流标签字段是20位,但这种结构分别定义了4位和24位。

struct ipv6hdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
    __u8            priority:4,
                version:4;
#elif defined(__BIG_ENDIAN_BITFIELD)
    __u8            version:4,
                priority:4;
#else
#error  "Please fix <asm/byteorder.h>"
#endif
    __u8            flow_lbl[3];

    __be16          payload_len;
    __u8            nexthdr;
    __u8            hop_limit;

    struct  in6_addr    saddr;
    struct  in6_addr    daddr;
};

【问题讨论】:

  • __LITTLE_ENDIAN_BITFIELD__BIG_ENDIAN_BITFIELD 与字节的通用字节序无关。它是“位字节序”——某些编译器的内部属性。

标签: linux kernel ipv6


【解决方案1】:

在查看 linux 的源代码时,我遇到了以下关于 IPv6 标头格式的定义,并且根据字节序对“优先级”和“版本”字段的顺序感到困惑。我认为这两个字段都是 4 位(半字节)并且它们与字节序无关。我不明白为什么 linux 内核会这样定义 ipv6 标头。

正如您所说,这些字段与字节序无关,但 您的平台(您的架构)实际上如何将它们保存在内存中。 没有人考虑网络中 TCP/IP 的字节序,这是定义明确、统一且明确的,但您的计算机的字节顺序和#ifs 控制是为了在两种机器上编译相同的源而无需更改。为了使源代码在 {big/low}endian 架构中可编译,必须采取一些措施使字段在数据包中的精确相同位置结束,如果您在 sun sparcstation 中对它们进行编码,则与它们无关,或者英特尔笔记本电脑。

通常完成编码的方式是制作一个精确的字节图像,一个字节一个字节,数据包将如何在网络上序列化。这意味着,如果您是小端机器,则必须交换 32 位整数的字节顺序才能在线路中始终出现最重要的再见。有一些可移植的方法可以做到这一点,但它们通常需要在 cpu 中完成更多的工作,而不仅仅是两个两个交换字节。

我不能说一个字中位域的位分配顺序是否取决于位域本身的顺序,这在 {big/low}endian 机器中的执行方式不同,但正如您所说,如果它完成了所以在 linux 内核中,答案可能是它。 (主要原因是很久以前它就正常工作了,这样的问题会从一开始就中断 tcp/ip 通信)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2014-08-22
    • 2012-09-07
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多