【云计算 IT 基础知识】5.3.4 IPv6

muzilan 2016-06-21 05:38:49
特点
IPv6的特点包括:
l 层次化的地址结构
IPv6的地址空间采用了层次化的地址结构,利于路由快速查找,同时借助路由聚合,可减少IPv6路由表的大小,提高路由设备的转发效率。

l 地址自动配置
IPv6支持有状态地址配置和无状态地址配置,简化了主机配置。
– 对于有状态地址配置,主机通过服务器获取地址信息和配置信息。
– 对于无状态地址配置,主机自动配置地址信息,地址中带有本地路由设备通告的前缀和主机的接口标识。如果链路上没有路由设备,主机只能自动配置链路本地地址,实现与本地节点的互通。

l 支持QoS
IPv6报头的新字段定义了流量应该被如何标识和处理。通过报文头里的流标记字段完成流量标识,允许路由设备对某一流中的报文进行识别并提供特殊处理。由于IPv6报头可对流量进行识别,即使是带有IPSec加密的报文载荷也可对其QoS进行保证。

l 内置安全性
IPv6将IPSec作为它的扩展报头实现,提供端到端的安全特性。这一特性为解决网络安全问题提供了标准。

l 灵活的扩展报文头
IPv6取消了IPv4报文头的选项字段,并引入了多种扩展报文头,在提高处理效率的同时还增强了IPv6的灵活性,为IP协议提供了良好的扩展能力。

IP地址
表示形式
IPv6的128位IP地址有以下两种表示形式:
l X:X:X:X:X:X:X:X
地址被分为8组,每组的16位用4个十六进制字符(0~9,A~F)来表示,组和组之间用冒号(:)隔开。其中每个“X”代表一组十六进制数值。例如,2031:0000:130F:0000:0000:09C0:876A:130B。有两种简写形式:
– 省略每组中的前导“0”,上述地址可写为2031:0:130F:0:0:9C0:876A:130B。
– 可用双冒号“::”代替地址中包含的连续两个或多个均为0的组,上述地址可写为2031:0:130F::9C0:876A:130B。
在一个IPv6地址中只能使用一次双冒号“::”,否则当计算机将压缩后的地址恢复成128位时,无法确定每段中0的个数。

l X:X:X:X:X:X:d.d.d.d
“X”代表高阶的六组数字,用十六进制数来表示每组的16比特。“d”代表低阶的四组数字,用十进制数表示每组的8比特。后边的部分(d.d.d.d)其实就是一个标准的IPv4地址。具体又分为如下两种类型:
– IPv4的兼容IPv6地址。
地址格式为:0:0:0:0:0:0:IPv4-address,其高阶96bits均为0,其低阶32bits是一个IPv4地址。该IPv4地址必须是IPv4网络中可达的IPv4地址,且不能是组播地址、广播地址、环回地址或未指定的地址(0.0.0.0)。
– IPv4的映射IPv6地址。
地址格式为:0:0:0:0:0:FFFF:IPv4-address。该地址用于将IPv4节点的地址表示为IPv6地址。

结构
IPv6地址由如下两部分组成:
l 网络前缀:n比特,相当于IPv4地址中的网络号码。
l 接口标识:128-n比特,相当于IPv4地址中的主机号码。
地址2001:A304:6101:1:0000:E0:F726:4E58/64(其中/64表示网络前缀为64位)的构成如图5-14所示。


分类
IPv6主要有三种地址:
l 单播地址(Unicast)
唯一标识一个接口,类似于IPv4的单播地址。发送到单播地址的数据包将被传输到此地址所标识的唯一接口。单播地址还可以分为四种,如表5-5所示。


l 任播地址(Anycast)
用来标识一组接口(通常这组接口属于不同的节点)。发送到任播地址的数据包被传输给此地址所标识的一组接口中距离源节点最近的一个接口(最“近”的一个,是指根据路由协议的距离度量)。任播地址提供了很多潜在的重要服务。例如,一个任播地址可以用来允许节点访问提供某种已知服务的服务器集合中的一个服务器,而不需要在每个节点手工配置服务器列表。
任播地址没有独立的地址空间,它们可使用任何单播地址的格式。因此,需要一种语法来区别任播地址和单播地址。

l 组播地址(Multicast)
用来标识属于不同节点的一组接口,类似IPv4的组播地址。发送到组播地址的数据包被传输给此地址所标识的所有接口。IPv6不包括广播地址,广播地址的功能均由组播地址来提供。

数据包格式
扩展包头不是必选部分。仅当需要路由器或目的节点做某些特殊处理时,才由发送方添加一个或多个IPv6扩展包头。IPv6数据报的格式如图5-15所示。


IP数据报中各字段的含义如表5-6所示。


...全文
1271 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
muzilan 2016-09-19
  • 打赏
  • 举报
回复
引用 1 楼 nettman 的回复:
muzilan 2016-09-19
  • 打赏
  • 举报
回复
引用 4 楼 dwa4821 的回复:
1111111111111111111111
快来分享下学习经验
muzilan 2016-09-19
  • 打赏
  • 举报
回复
引用 2 楼 xizhi1215 的回复:
过来学习学习
欢迎欢迎ing
赵4老师 2016-06-24
  • 打赏
  • 举报
回复
muzilan 2016-06-23
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
仅供参考:
//IPv6地址表示
//IPv6地址为128位长,但通常写作8组,每组为四个十六进制数的形式。例如:
//FE80:0000:0000:0000:AAAA:0000:00C2:0002 是一个合法的IPv6地址。
//要是嫌这个地址看起来还是太长,这里还有种办法来缩减其长度,叫做零压缩法。
//如果几个连续段位的值都是0,那么这些0就可以简单的以::来表示,上述地址就可以写成
//FE80::AAAA:0000:00C2:0002。这里要注意的是只能简化连续的段位的0,其前后的0都要保留,
//比如FE80的最后的这个0,不能被简化。还有这个只能用一次,在上例中的
//AAAA后面的0000就不能再次简化。当然也可以在AAAA后面使用::,这样的话前面的
//12个0就不能压缩了。这个限制的目的是为了能准确还原被压缩的0.不然就无法确定每个::代表了多少个0.
//2001:0DB8:0000:0000:0000:0000:1428:0000
//2001:0DB8:0000:0000:0000::1428:0000
//2001:0DB8:0:0:0:0:1428:0000
//2001:0DB8:0::0:0:1428:0000
//2001:0DB8::1428:0000都是合法的地址,并且他们是等价的。但
//2001:0DB8::1428::是非法的。(因为这样会使得搞不清楚每个压缩中有几个全零的分组)
//同时前导的零可以省略,因此:
//2001:0DB8:02de::0e13等价于2001:DB8:2de::e13
#include <stdio.h>
#include <string.h>
char ipv60[]="2001:0DB8:0000:0000:0000:0000:1428:0000";
char ipv61[]="1040::1";
char ipv62[]="fe80::20c:29ff:fe6b:2516";
char ipv63[]="::ffff:c0a8:5909";
unsigned char ip_v6[16];
void show(char *a) {
    int i;
    printf("%-39s=>",a);
    for (i=0;i<16;i++) printf("%02x ",ip_v6[i]);
    printf("\n");
}
void inet_addr6(char *a) {
    char *p;
    int n,i,r,k,j;
    short s;
    k=0;
    p=a;
    while (1) {
        if (*p==':') k++;
        p++;
        if (*p==0) break;
    }
    if (a[0]==':') k--;
    i=0;
    p=a;
    while (1) {
        r=sscanf(p,"%hx%n",&s,&n);
        if (1==r) {
            ip_v6[i]=*((unsigned char *)&s+1);
            ip_v6[i+1]=*((unsigned char *)(&s));
            i+=2;
            if (i>=16) break;
            p+=n;
        } else if (0==r) {
            if (p[0]==':') {
                if (p[1]==':') {
                    for (j=0;j<(8-k)*2;j++) ip_v6[i+j]=0;
                    i+=(8-k)*2;
                    if (i>=16) break;
                    p+=2;
                } else {
                    p++;
                }
            } else {
                printf("Format Error [%s]!\n",a);
            }
        } else break;
    }
}
int main() {
    inet_addr6(ipv60);show(ipv60);
    inet_addr6(ipv61);show(ipv61);
    inet_addr6(ipv62);show(ipv62);
    inet_addr6(ipv63);show(ipv63);
    return 0;
}
//2001:0DB8:0000:0000:0000:0000:1428:0000=>20 01 0d b8 00 00 00 00 00 00 00 00 14 28 00 00
//1040::1                                =>10 40 00 00 00 00 00 00 00 00 00 00 00 00 00 01
//fe80::20c:29ff:fe6b:2516               =>fe 80 00 00 00 00 00 00 02 0c 29 ff fe 6b 25 16
//::ffff:c0a8:5909                       =>00 00 00 00 00 00 00 00 00 00 ff ff c0 a8 59 09
//
赞,还是代码最有说服力
dwa4821 2016-06-23
  • 打赏
  • 举报
回复
111111111111111111111
赵4老师 2016-06-22
  • 打赏
  • 举报
回复
仅供参考:
//IPv6地址表示
//IPv6地址为128位长,但通常写作8组,每组为四个十六进制数的形式。例如:
//FE80:0000:0000:0000:AAAA:0000:00C2:0002 是一个合法的IPv6地址。
//要是嫌这个地址看起来还是太长,这里还有种办法来缩减其长度,叫做零压缩法。
//如果几个连续段位的值都是0,那么这些0就可以简单的以::来表示,上述地址就可以写成
//FE80::AAAA:0000:00C2:0002。这里要注意的是只能简化连续的段位的0,其前后的0都要保留,
//比如FE80的最后的这个0,不能被简化。还有这个只能用一次,在上例中的
//AAAA后面的0000就不能再次简化。当然也可以在AAAA后面使用::,这样的话前面的
//12个0就不能压缩了。这个限制的目的是为了能准确还原被压缩的0.不然就无法确定每个::代表了多少个0.
//2001:0DB8:0000:0000:0000:0000:1428:0000
//2001:0DB8:0000:0000:0000::1428:0000
//2001:0DB8:0:0:0:0:1428:0000
//2001:0DB8:0::0:0:1428:0000
//2001:0DB8::1428:0000都是合法的地址,并且他们是等价的。但
//2001:0DB8::1428::是非法的。(因为这样会使得搞不清楚每个压缩中有几个全零的分组)
//同时前导的零可以省略,因此:
//2001:0DB8:02de::0e13等价于2001:DB8:2de::e13
#include <stdio.h>
#include <string.h>
char ipv60[]="2001:0DB8:0000:0000:0000:0000:1428:0000";
char ipv61[]="1040::1";
char ipv62[]="fe80::20c:29ff:fe6b:2516";
char ipv63[]="::ffff:c0a8:5909";
unsigned char ip_v6[16];
void show(char *a) {
    int i;
    printf("%-39s=>",a);
    for (i=0;i<16;i++) printf("%02x ",ip_v6[i]);
    printf("\n");
}
void inet_addr6(char *a) {
    char *p;
    int n,i,r,k,j;
    short s;
    k=0;
    p=a;
    while (1) {
        if (*p==':') k++;
        p++;
        if (*p==0) break;
    }
    if (a[0]==':') k--;
    i=0;
    p=a;
    while (1) {
        r=sscanf(p,"%hx%n",&s,&n);
        if (1==r) {
            ip_v6[i]=*((unsigned char *)&s+1);
            ip_v6[i+1]=*((unsigned char *)(&s));
            i+=2;
            if (i>=16) break;
            p+=n;
        } else if (0==r) {
            if (p[0]==':') {
                if (p[1]==':') {
                    for (j=0;j<(8-k)*2;j++) ip_v6[i+j]=0;
                    i+=(8-k)*2;
                    if (i>=16) break;
                    p+=2;
                } else {
                    p++;
                }
            } else {
                printf("Format Error [%s]!\n",a);
            }
        } else break;
    }
}
int main() {
    inet_addr6(ipv60);show(ipv60);
    inet_addr6(ipv61);show(ipv61);
    inet_addr6(ipv62);show(ipv62);
    inet_addr6(ipv63);show(ipv63);
    return 0;
}
//2001:0DB8:0000:0000:0000:0000:1428:0000=>20 01 0d b8 00 00 00 00 00 00 00 00 14 28 00 00
//1040::1                                =>10 40 00 00 00 00 00 00 00 00 00 00 00 00 00 01
//fe80::20c:29ff:fe6b:2516               =>fe 80 00 00 00 00 00 00 02 0c 29 ff fe 6b 25 16
//::ffff:c0a8:5909                       =>00 00 00 00 00 00 00 00 00 00 ff ff c0 a8 59 09
//
dwa4821 2016-06-22
  • 打赏
  • 举报
回复
1111111111111111111111
xizhi1215 2016-06-21
  • 打赏
  • 举报
回复
过来学习学习
nettman 2016-06-21
  • 打赏
  • 举报
回复

448

社区成员

发帖
与我相关
我的任务
社区描述
云计算开发
社区管理员
  • 云计算
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧