主要由于ipv4拥有地址空间资源短缺的局限性,ipv6将会成为新一代的网络应用技术规范.所以下面介绍一下ipv6
一、IPv6地址结构定义 } IPv6有128位的地址结构。 例: fffe:ffee:ff22:12:7e:89:e3:10 FF01:0:0:0:0:0:0:101 等价于 FF01::101 } 2.子网掩码表示的不同 IPv6 更习惯用掩码的长度来表示子网掩码。 例:输入ifconfig命令会看到这样的地址表示方式: fffe:ffee:ff22:12:7e:89:e3:10/64 64 就是子网掩码的长度,这是为了表示的方便。相当于FFFF: FFFF: FFFF: FFFF::0 } 3.IPv6地址分类 a.IPv6 地址分为单播地址、泛播地址、多播地址。和IPv4相比,取消了广播地址类型,增加了泛播地址类型;没有了地址划分. b. 多播地址格式前缀为1111 1111, c. } 4.IPv6中特殊的地址 a. 未指定的IPv6地址 格式0::0 b.IPv6 环回地址 格式::1。此地址与IPv4中的127.0.0.1类似 所有格式前缀不是多播格式前缀(1111 1111)的IPv6地址都是IPv6单播格式(泛播和单播格式相同) 连续出现的0可用::代替,但::只能出现一次 1.地址格式 二、IPv6常用命令 1.linux#ifconfig interface inet6 add ipv6-address/prefixlength 使用ifconfig命令给指定接口分配一个静态IPv6地址。inet6 add参数指定添加一个IPv6地址,ipv6-address是分配给接口的静态地址,prefixlength参数定义前缀的长度 2.linux#ip -f inet6 addr add ipv6-address/prefixlength dev interface 使用IP命令给指定接口分配一个静态IPv6地址。-f inet6 addr add参数指定添加IPv6地址,ipv6-address是分配给接口IPv6地址,prefixlength参数定义前缀的长度,dev参数标识给定的接口interface。这个命令和前面的命令提供同样的结果 给接口eth0分配一个前缀长度为64比特的静态IPv6地址fec0:0:0:0::1 3. Linux上添加默认IPv6路由的route和ip命令 linux#route -A inet6 add ::/0 gw gateway[dev interface] linux#ip -f inet6 route add ::/0 via gateway [dev interface] 使用ipconfig的实例: linux#route -A inet6 add ::/0 gw fe80::260:3eff:fe47:1533 dev eth0 使用ip的实例: linux#ip -f inet6 route add ::/0 gw fe80::260:3eff:fe47:1533 dev eth0 使用ifconfig的实例: linux#ifconfig eth0 inet6 add fec0:0:0:0:1::1/64 使用ip的实例: linux#ip –f inet6 addr add fec0:0:0:1::1/64 dev eth0 三、开发中的注意事项
1.Socket编程 增加<netinet/ip6.h>头文件 struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */ }; struct sockaddr_in6 { sa_family_t sin6_family; /* AF_INET6 */ in_port_t sin6_port; /* transport layer port # */ uint32_t sin6_flowinfo; /* IPv6 traffic class & flow info */ struct in6_addr sin6_addr; /* IPv6 address */ uint32_t sin6_scope_id; /* set of interfaces for a scope */ }; struct in6_addr { uint8_t s6_addr[16]; /* IPv6 address */ };例子: struct sockaddr_in6 local; local.sin6_family = AF_INET6; local.sin6_addr = in6addr_any;(相当于ipv4的INADDR_ANY); local.sin6_port = port; skt=socket( AF_INET6, SOCK_DGRAM, 0 ); bind( skt,(struct sockaddr *)&local, sizeof(local); connect( skt, (struct sockaddr *)& local, sizeof(local) );
转换字符串到网络地址 int inet_pton(int af, const char *src, void *dst); 第一个参数af是地址族,转换后存在dst中 例:
struct in6_addr m_ip; inet_pton(AF_INET6,”ff::1”, &m_ip);
转换网络地址成字符串 const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt); 这个函数转换和上面的只是多了一个参数socklen_t cnt,他是所指向缓存区dst的大小,避免溢出