IPv6报头结构在linux内核



当我在查看linux的源代码时,我遇到了关于IPv6报头格式的以下定义,并与"优先级"的顺序混淆了。和";version"根据endenanness字段。我认为这两个字段都是4位(nibble),它们与端序无关。我不明白为什么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;
};

当我在查看linux的源代码时,我遇到了关于IPv6报头格式的以下定义,并与"优先级"的顺序混淆了。和";version"根据endenanness字段。我认为这两个字段都是4位(nibble),它们与端序无关。我不明白为什么linux内核定义ipv6头这样

字段,正如你所说,与端序无关,但是你的平台(你的架构)如何在内存中保存它们。没有人考虑到TCP/IP的端序,这是定义良好的,统一的和明确的,但是你的计算机的端序,以及#if控制的是同一源,可以在两种机器上不加更改地编译。为了使源代码在{大/低}端架构中可编译,必须采取一些措施使字段在数据包中的精确位置结束,无论您是在sun sparcstation还是intel笔记本电脑中编码它们都是独立的。

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

我不能说一个字中位域的位分配顺序是否取决于位域本身的顺序,这在{大/低}端机器中是不同的,但正如你所说,如果它在linux内核中是这样做的,那么答案将是它可能是。(主要原因是它从很久以前就正常工作了,这样的问题从一开始就会中断tcp/ip通信)

最新更新