欢迎您访问我爱IT技术网,今天小编为你分享的电脑教程是网络协议方面的经验知识教程:KAME IPv6的地址结构简析,下面是详细的分享!
KAME IPv6的地址结构简析
KAME 中常见的关于Ipv6的3个地址结构
struct sockaddr {
unsigned char sa_len;
sa_family_t sa_family;
char sa_data[14];
};
struct sockaddr_dl {
u_char sdl_len;
u_char sdl_family;
u_short sdl_index;
u_char sdl_type;
u_char sdl_nlen;
u_char sdl_alen;
u_char sdl_slen;
char sdl_data[46];
};
struct sockaddr_in6 {
u_int8_t sin6_len;
u_int8_t sin6_family;
u_int16_t sin6_port;
u_int32_t sin6_flowinfo;
struct in6_addr sin6_addr;
u_int32_t sin6_scope_id;
};
如果你接触过freeBSD的代码,你会发现,前两个结构并不是IPv6特有的,在IPv4中就已经有使用。而struct sockaddr_in6 类似于IPv4下的结构struct sockaddr_in
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
而其中用于v6的struct in6_addr和用于v4 struct in_addr对比如下
struct in6_addr {
union {
u_int8_t __u6_addr8[16];
u_int16_t __u6_addr16[8];
u_int32_t __u6_addr32[4];
} __u6_addr;
};
struct in_addr {
in_addr_t s_addr;
};
所以相对于IPv4而言,IPv6的地址结构并没有大的变动(除了地址从4bytes扩展到16bytes了)。struct sockaddr还是同样的套接字地址,而struct sockaddr_dl 和struct sockaddr_in6是位于不同层(layer)的实际地址格式。
struct sockaddr_dl struct sockaddr_in6和struct sockaddr_in的第一个字节都是长度,第二个地址是代表地址类型的xxx_family。所以虽然他们都可以强制转换成struct sockaddr类型,但是需要检查过第二个字节的内容(并不管你这个字节叫什么名字),才能决定余下字节的含义。
在IPv4的时候,因为struct sockaddr和struct sockaddr_in大小一样,所以会让人误解为这两个结构可以随意转换。正确的做法是,根据实际的需要定义你的地址结构是struct sockaddr_in还是struct sockaddr_in6,甚至还是struct sockaddr_dl(这个定义决定了你地址所占内存的大小),然后你可以将你的结构转换成struct sockaddr类型来传递,一般是通过指针struct sockaddr* 来传递。
如果你并不确定你的地址是v4还是v6的,或者两者都可以,你可以使用struct sockaddr_storage,它有足够的大小放下v6地址。
struct sockaddr_storage {
unsigned char ss_len;
sa_family_t ss_family;
char __ss_pad1[_SS_PAD1SIZE];
__int64_t __ss_align;
char __ss_pad2[_SS_PAD2SIZE];
};
作者 coreProtocol
以上就是关于KAME IPv6的地址结构简析的网络协议知识分享,更多电脑教程请移步到>>电脑教程。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
