TCP/IP V6 浅识
挖来的帖子是2006年的,有点老,O(∩_∩)O~~当作知识积累吧!原文有些图片已经失效,特此说明!
水平有限,若有疏漏,还请海涵。。。
什么是Tcp/Ip V6?Tcp/Ip V6就是Tcp/Ip 版本6。:)//
其实这个名词没啥特别的,Tcp/Ip V6就是对现在大家用的Tcp/Ip V4协议的升级。那么为什么要升级Tcp/IpV4呢?最简单的回答就是:僧多粥少了,Tcp/IpV4已经不够用了,于是乎就出来这么一个新的Tcp/Ip协议。这个协议干什么用的?就是应付Tcp/Ip V4地址不够分配而产生的。
IPv4表示方法是点分10进制
先解释一个概念,为什么Tcp/Ip V4不够用了?
首先讲一个定义,Tcp/Ip V4地址定义的IP地址是32位的,那么这个Tcp/Ip V4尽可能最大分配的地址是2的32次方个地址。先看下Tcp/Ip V4地址的分配情况:
Tcp/Ip V4地址一共分为ABCDE5类,范围分别是(掩码为默认情况):
A类:1.0.0.0-126.255.255.255 (8)
B类:128.0.0.0-191.255.255.255 (16)
C类:192.0.0.0-223.255.255.255 (24)
D类:224.0.0.0-239.255.255.255
E类:240.0.0.0-254.255.255.255
其中,ABC是用在我们的Internet上的,D类用于组播通信,E类用于科研。实际上我们使用的只能是ABC这3类。但是ABC这3类的Tcp/IpV4地址在现在并不能给每一个上网的计算机分配一个合法的Tcp/Ip V4地址,所以,为了让更多的人上网,就出现这么一个东西:NAT地址转换。原理是:一个局域网使用私网地址,通过网关的共网地址,使用NAT,把内网的请求转换为共网的IP,然后访问,数据回送时,先通过网关,再转回到内网。
付:所有的私网IP(掩码为默认情况):
A类:10.0.0.0-10.255.255.255(8)
B类:172.16.0.0-172.31.255.255(16)
C类:192.168.0.0-192.168.255.255(24)
使用NAT地址转换的缺点:
1.加密的数据包无法进过转换。
2.为了适应NAT转换,应用程序的复杂性大大提升。
总之,NAT地址转换只是延长Tcp/Ip V4共网地址空间使用寿命的权宜之计。
PS:在这里说一下几个基本概念。
1.为什么说Tcp/Ip V4地址是32位的?
首先,计算机是一个电器设备,那么注定的计算机只能识别0和1,我们所使用的类似192.168.0.1这样的IP地址用2进制表示为:
11000000.10101000.00000000.00000001
这样一共是32个数字,所以是32位。
小知识:怎么从10进制换算2进制:
首先我们要知道,2的N次方是换算的基础。先给一组标准数:
128 6432168421
这些都是2的N次方,128前面还可以加上2的9次方等等。
咱们先算192的2进制,首先192大于128,那么192是可以被128减的,那么在128上标示为1,192-128=64,那么64-64刚好减完,所以在64上标示为1,其他数字全是零,然后,我们可以得到,192对应的二进制是11000000。
再例如,算110的二进制,首先110不可以被128减,所以,128标示为0。
那么110可以被64减,那么在64上标示为1,减得46
而46可以被32减,那么在32上标示为1,减得为14
14不能被16减,所以16标示为0
而14能被8减,那么8上标示为1
减得6,6可以被4减,得2,4上标示为1
而2不能被4减,所以4上标示为0
然后2可以被2减,2标示为1
最后得1标示为0。那么110得二进制为:011011010
会了吧,那么,对于一个2进制怎么换算10进制?首先还是那排标准数
128 6432168421
假如现在算10110011这个二进制,那么我们开始对应标准数每位乘起来再相加
1*128+0*64+1*32+1*49+0*8+0*4+0*2+0*1=179
会算了吧,这个比短除法简单多了吧。嘿嘿。
2.192.168.0.0-192.168.255.255(24)后面括号里得24是什么意思?
其实类似192.168.0.1/24这样得写法。24标示掩码中二进制1的个数。
例如(8)
掩码就是
11111111.00000000.00000000.00000000
根据上面的方法,换算成10进制就是255.0.0.0
比如(24)
掩码就是
11111111.11111111.11111111.00000000
换算成十进制就是255.255.255.0
明白???
上面说完了,Tcp/Ip V4是32位的,那么Tcp/Ip V6是多少位的呢?Tcp/Ip V6被定义为成128位了,那么他有多少个IP地址呢?一共是2的128次方个。
换算下来一共是:340282366920938463463374607431768211456个地址。
这么多地址有多少呢?实际上来讲,这么打的地址池可以给地球表面每平方米分配6.64×10的23次方个地址。
怎么来的呢?
首先地球陆地面积是197299019×2.59×10的6次方平方米
Tcp/Ip V6地址有3.4×10的38次方个。
一除,正好是约6.64×10的23次方个地址
IPv6表示方法是冒号分16进制
那么,这么大的地址是不是会让人迷失的,其实Tcp/Ip V6地址是由2部分组成的。
64位的子网标识符+64位的接口标识符。
一个典型的Tcp/Ip V6地址类似这样:
21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A
这是一个可集聚全球单播地址,说白就是类似Tcp/Ip V4的共网地址。
这个地址中,21DA:00D3:0000:2F3B是子网标示符,而后面的:02AA:00FF:FE28:9C5A是接口标识符。
那么Tcp/Ip V6地址怎么划分的:
分配 前缀格式 占总空间比例
保留 0000 0000 1/256
为网络服务接入点分配保留(NSAP) 0000 001 1/256
可集聚全球单播地址 001 1/8
链路本地单播地址 1111 1110 10 1/1024
站点本地单播地址 1111 1110 11 1/1024
多播地址 1111 1111 1/256
以上是目前分配的Tcp/Ip V6地址,其他没有写出来的都是未分配的,已经划分的地址占总Tcp/Ip V6地址池的12.7%
Ps:以上前缀格式都是2进制的,一个Tcp/Ip V6地址标示成二进制为
0000000000000000:0000000000000000:0000000000000000:0000000000000000:0000000000000000:0000000000000000:0000000000000000:0000000000000000
前缀格式是说从第一端最左边开始的数字。
先概述一下这些地址吧:
可集聚全球单播地址:
简称全球地址,可集聚全球单播地址对应的是Tcp/Ip V4的公共地址。
例如:
21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A
链路本地单播地址与站点本地单播地址:
链路本地单播地址用于同一链路上的邻接点之间和邻接点发现过程。
它其实类似Tcp/Ip V4的私有地址:如169.254.0.0/16
例如:
FE80:5EFE: 0000:0000:0228:00FF:FE43:9A52
站点本地单播地址用于同一机构中的节点之间的通信。
它类似Tcp/Ip V4的私网地址(注意,上面是私有地址,这个是私有地址):如
A类:10.0.0.0-10.255.255.255(8)
B类:172.16.0.0-172.31.255.255(16)
C类:192.168.0.0-192.168.255.255(24)
例如:
FEC0:5EFE: 0000:0000:0228:00FF:FE43:9A52
和上面的区别在于最前面,一个是FE80一个是FEC0
PS:什么是私有地址
引用一段windows服务器中文站风间子的文章的一段
原文在:http://www.winsvr.org/info/info.php?sessid=&;infoid=14
当DHCP客户端计算机处于以下三种情况之一时,触发DHCPDISCOVER广播消息:
当TCP/IP协议作为DHCP客户端(自动获取IP地址)进行初始化(DHCP客户端启动计算机、启用网络适配器或者连接到网络时);
DHCP客户端请求某个IP地址被DHCP服务器拒绝,通常发生在已获得租约的DHCP客户端连接到不同的网络中;
DHCP客户端释放已有租约并请求新的租约。
此时,DHCP客户端发起DHCPDISCOVER广播消息,向所有DHCP服务器获取IP地址租约。此时由于DHCP客户端没有IP地址,因此在数据包中,使用0.0.0.0作为源IP地址,然后广播地址255.255.255.255作为目的地址。在此请求数据包中同样会包含客户端的MAC地址和计算机名,以便DHCP服务器进行区分。
如果没有DHCP服务器答复DHCP客户端的请求,DHCP客户端在等待1秒后会再次发送DHCPDISCOVER广播消息。除了第一个DHCPDISCOVER广播消息外,DHCP客户端还会发出三个DHCPDISCOVER广播消息,等待时延分别为9秒、13秒和16秒加上一个长度为0~1000毫秒之间的随机时延。如果仍然无法联系DHCP服务器,则认为自动获取IP地址失败,默认情况下将随机使用APIPA(自动专有IP地址,169.254.0.0/16)中定义的未被其他客户使用的IP地址,子网掩码为255.255.0.0,但是不会配置默认网关和其他TCP/IP选项,因此只能和同子网的使用APIPA地址的客户端计算机进行通讯。
简单来说,就是对于一个网卡,你即没有DHCP给他分配地址,也没有手工指定地址,它就会用169.254.0.0/16这个私有地址端暂时自己分配一个地址。
多播地址:主要是用在广播的,在Tcp/Ip V6里,没有了组播地址,没有了广播地址,代替他们的是多播地址。
例如:
FF01:0000:0000:0000:0000:0000:0000:0001(节点本地范围所有的多播地址)
还有用于路由公告的
FF01:0000:0000:0000:0000:0000:0000:0002(节点本地范围所有路由器的多播地址)
此外还定义了几个特殊地址
0000:0000:0000:0000:0000:0000:0000:0000
这个是未指定地址。就是Tcp/Ip V4的0.0.0.0,用于DHCP请求前的。
还有
0000:0000:0000:0000:0000:0000:0000:0001
这个就是回环地址,就是Tcp/Ip V4的127.0.0.1
还有一些兼容地址,是为了保证Tcp/Ip V4到Tcp/Ip V6的过渡,这个以后讨论。
PS:关于Tcp/Ip V6地址的简写
这么长的地址写起来肯定麻烦,那么我们可以压缩零位来写。
比如0000:0000:0000:0000:0000:0000:0000:0001回环地址。
压缩零位就是::1
例如
FF01:0000:0000:0000:0000:0000:0000:0001
压缩零位就是
FF01::1
但是这样的压缩是不允许的
例如
FF01:0000:0000:1111:0000:0000:0000:0001
不能压缩为FF01::1111::1
只能是FF01::1111: 0:0:0:1
还有,类似
FF01:0010:0101:1111:0000:0100:0000:0001
不能压缩为
FF01: 1:11:1111:: 1
只能压缩为
FF01: 10:101:1111:: 1
压缩法则:
不能把一个位端的有效0压缩了。
一.多播Tcp/Ip V6地址
在一个Tcp/Ip V6的网络中,任意一个Tcp/Ip V6节点都可以监听多播通信流。这与Tcp/Ip V4的运行方式基本一样。在任意Tcp/Ip V6节点可以同时监听多个多播地址。
下图描述了一个典型的多播地址结构:
http://www.lengo.cn/other/ipv6/3/1.jpg
在上图中,有以下几个元素
标记:这个是表示在多播地址上设置的表记。他有2个值。
当为1时,表示当前的多播地址是有IANA分配的一个永久分配的多播地址。
当为2时,表示当前的多播地址时一个临时的多播地址。
范围:这个表示这个多播信息是发给哪个范围的。目前已经定义了下面几项:
0 保留
1 节点本地范围
2 链路本地范围
5 站点本地范围
8 机构本地范围
E 全球范围
F 保留
例如:FF02::3的多播具有链路本地范围,但是Tcp/Ip V6的路由器不会对这个包进行转发。
组ID:这个字段在当前范围内是唯一的,用来标示多播组。从FF01::到FF0F::的多播地址是保留的专用地址。
有以下几个特殊地址:
关于所有节点的:
FF01::1节点本地范围所有的节点多播地址
FF02::1链路本地范围所有的节点多播地址
关于所有路由器的:
FF01::2节点本地范围所有的路由器多播地址
FF02::2链路本地范围所有的路由器多播地址
FF05::2站点本地范围所有的路由器多播地址
注意:Tcp/Ip V6的多播地址 FF02::1 代替了所有的Tcp/Ip V4的广播地址!
由于上图组ID太过于广泛,所以RFC 2373建议使用这个多播地址:
在上图的范围后从组ID里划分出一个80位全0的元素,再后面紧跟32位的组ID,这个32位的组ID映射到一个唯一个以太网多播MAC地址。
二.泛播地址
在Tcp/Ip V6中,一个泛播地址被分配给多个接口。到现在位置,泛播地址仅仅用作目标地址,并只分配给路由器。一个给定的目标单播地址是否也是一个泛播地址是无法确定的。
例如:
3FFE:29:D005:6178:2AA:FF:FE89:6B9A 这是一个泛播地址。
其中主机路由在分配了48位的前缀3FFE:29:D005::/48的机构的路由结构中广播。
泛播地址比较简单,因为到目前为止还没定义完全泛播地址的作用域,所以我也只能描述这么多了。
三.主机的Tcp/Ip V6地址
主机的Tcp/Ip V6地址比较好理解,在Tcp/Ip V4中,每一个网卡都会分配一个或多个Tcp/Ip V4地址。在Tcp/Ip V6中,一个网卡也会分配多个Tcp/Ip V6地址。比如说:
一个网卡分配了下面几个地址:
1. 回环地址::1
2. 每个接口的链路本地地址 (Tcp/Ip V4的私有地址)FE80::
3. 全球可集聚单播地址(Tcp/Ip V4的公网地址)2XXX:XXX::
上面三个地址是必须存在的。
当然,一个处在LAN中的网卡会监听来自以下地址的信息:
1. FF01::1节点本地范围所有的节点多播地址
2. FF02::1链路本地范围所有的节点多播地址
3. 每个单播地址的请求
4. 同组(也就是同LAN)的多播地址。
四.路由器的Tcp/Ip V6地址
一个处在Tcp/Ip V6网络中的路由器上的接口具有以下的单播地址。
1. 每个接口的链路本地地址
2. 每个接口的附加单播地址
3. 回环地址
当然,为了路由发现,他们还必须具备下面的泛播地址。
1.每个子网的子网-路由器泛播地址
2.附加的泛播地址(这个我没学清楚是怎么回事)
但是光发送可不行,必须要有监听地址
1.FF01::1节点本地范围所有的节点多播地址
2.FF02::1链路本地范围所有的节点多播地址
3.FF01::2节点本地范围所有的路由器多播地址
4.FF02::2链路本地范围所有的路由器多播地址
5.FF05::2站点本地范围所有的路由器多播地址
6.每个单播地址的请求节点地址
7.同组的多播地址
对于一个在网络上的路由器,上面的地址可以保证路由器从学习到转发的实现过程。
五.Tcp/Ip V6定义的MAC地址
这个也叫接口标识符。
回忆一下可集聚全球单播地址的抽象图
http://www.lengo.cn/other/ipv6/3/3.jpg
后面有一个64位的接口ID,这个接口ID是有固定长度的。是64位,这个固定64位的地址可以和现在现有的48位MAC所兼容,也就是说,为了和48位的地址进行映射。
首先我们回忆一下现在用的MAC地址,也叫IEEE802地址,也叫链路层地址,也叫物理地址,也叫网卡地址。。。。。。。晕。。
查看方法,在运行里输入cmd
然后输入IPCONFIG /all后得到这张图:
http://www.lengo.cn/other/ipv6/3/2.jpg
画红色的就是MAC地址。这个是一个48位的地址。
为什么说是48位呢?因为把这个地址写成2进制,正好有48个数字。
复习一下这个地址的格式。
首先前24为是IEEE分配给网卡制造商的,当网卡制造商拿到这个地址后,就可以自由分配后面的24位地址了。
其中,第一字节中的数字标示的是单播地址或者广播地址。1就是广播地址,0就是单播地址。
准确说,MAC地址一共有2的48次方个这么多,但有一部分保留,可能不到这个数字。
说白了,这个地址也会和IPv4的地址一样枯竭的。
在Tcp/Ip V6中,IEEE定义了新的接口地址,叫IEEE EUI-64地址。
在这个规范中,接口ID被扩展到64位。
前24位是IEEE分配给网卡制造商的,网卡制造商可以生产40位的接口ID。
如何从一个48位的地址映射成64位的地址呢?
IEEE规定,在原先48位地址的中间,加入一个FF-FE构成一个映射地址。
例如
00-00-8E-3A-6B-1C这个48位的地址,在进行映射的时候,在IEEE管理的地方和网卡制造商管理的地方加入FF-FE变成
00-00-8E-FF-FE-3A-6B-1C
构成一个IEEE EUI-64地址。
我们在上面说了,可聚集全球单播地址后面的64位接口ID就是根据这个来的。比如一个网卡地址是00-00-8E-FF-FE-3A-6B-1C,那么对应的全球可聚集单播地址就是
21DA:00D3:0000:2F3B:0000:8EFF:FE3A:6B1C
OK,到此,我已经把所有的Tcp/Ip V6地址都讲述完了,现在我简单的总结一下。用IPv4和IPv6对比
IPv4 IPv6
Internet类 无
组播地址(224.0.0.0/4) 多播地址(FF00::/8)
广播地址 无
0.0.0.0未指定 ::
回环地址127.0.0.1 ::1
公共地址 可聚集全球单播地址
私网地址(192.168.0.0/16等) 站点本地地址(FEC0::/48)
私有地址(169.256.0.0/16) 链路本地地址(FE80::/64)
一、典型的分层数据报结构
对于一个分层通信模型来说,上层数据传递给下层时,每经过一层,就会对上层传来的数据包进行封装各层的报头,举个例子:
http://www.lengo.cn/other/ipv6/4/1.jpg
上图描述了一个典型的IPv6数据包结构,位于前面的是40字节的IPv6报头,后面的扩展报头加上上层数据构成了整个数据包的有效载荷。其中:
IPv6报头总是固定存在,长度固定为40字节。
扩展报头在整个IPv6数据包中可以包含多个或者单个或者没有,注意一下:IPv6报头中的下一个报头字段指向第一个扩展报头,每一个扩展报头都含有下一个扩展报头的指针,最后一个扩展报头指向上层数据单元。
上层数据描述了从通信模型上层传下来的数据,可以是TCP数据,也可以是UDP、ICMP数据。
另外,一般来说,IPv6的有效载荷为65535个字节,当一个IPv6的有效载荷大于整个数值,它就称为超大包,也是可以发送的。
二、IPv4报头
在学习IPv6报头格式前,我们先复习一下IPv4的报头格式,用于对比IPv6的报头格式。
http://www.lengo.cn/other/ipv6/4/2.jpg
上图描述了一个典型的IP v4的报头格式。现在我将简要的作下介绍。
版本:标示了这个报头的版本号,因为是Tcp/Ip v4,所以这个字段应该是4。这个字段长度4位。
报头长度:全称Internet报头长度,也是4位,用于标示整个Ip V4报头的长度。只是报头长度。
服务类型:这个字段8位,用于标示IP v4这个数据包在网络中传输时想要得到的服务,包括优先级、延迟、吞吐量、可靠性和代价等。
总长度:标示了整个数据包的长度,即报头+有效载荷。其中不包括链路层的帧。长度16位,所以他最大能传输2的16次方字节的数据包。65535个字节。
标示:当数据包经过网络时被拆分成小的包,这个字节起到排序序列号的作用,对端接受到所有的被拆开的数据包时,可以根据这个字段进行重组。这个字段16位。
片段偏移量:标示向对于原始的IP v4有效载荷起始位置的相对位置。13位长度。
生存时间:即TTL值,当数据包经过一个路由器时,这个值会减一,也可以在路由器上定义每次减的数值,当这个值被减到0时,路由器会丢掉这个包,并返回ICMP的信息,这个主要防止数据包在路由环路里打转转。8位长度。
协议:用于标示上层协议。如TCP、UDP。8位长度。
报头校验和:注意,这个校验和不是校验整个数据包的信息,只是校验报头信息,因为在上层数据包内,都有自己的校验和,所以这个校验和只校验IP v4报头的信息,这个信息每经过一个路由器都会重新计算,如果出错,则丢弃。16位长度。
源地址:32位长度,即发送主机的IP地址
目标地址:同上,只是接受机的IP地址
选项:扩展选项,有时候用来填充整个报头为4字节块的倍数。
三、IPv6报头
IPv6 报头去掉了IPv4 报头很少使用甚至不用的字段。一下是一个IP v6的报头格式。
http://www.lengo.cn/other/ipv6/4/3.jpg
版本:规定了本报头的版本号,这次为6。长度4位。
通信流类别:标示本数据包的类或者优先级,累死IP v4的服务类型字段。长度8位。
流标签:标示这个数据包属于源节点和目标节点之间的一个特定序列。这个字段需要IP v6的路由器进行特殊处理,对于默认的路由器处理,这个字段为0,但目的地址与源地址有多个源时,这个值会不同。长度为20位。
有效载荷长度:有效载荷长度包括扩展报头和上层PDU。如果长度大于65535,这个值为0。长度为16位。
下一个报头:标示第一个扩展报头的类型或者上层PDU的协议。长度为8位。
跳限制:同TTL值,当值被减之0时,路由器会丢掉本包。并范围ICMP信息。
源地址:IP v6的发送端地址,长度128位。
目标地址:同上。
附表:下一个报头字段的值
http://www.lengo.cn/other/ipv6/4/4.jpg
四、IPv6 MTU
整个IPv6协议要求的MTU最小值位1280字节(MTU为链路层的数据包大小),对于那些不支持这种长度的MTU。IPv6必须提供一个透明的链路层的拆分与重组方案。而对于支持这个长度的MTU,RFC2460建议他们使用1500这个值。
IPv6提供了一个对于这种不规范帧的解决方案,即路径MTU发现过程。这个过程允许传输长度大于1280字节的IPv6数据包。
付:常用的LAN和WAN技术的MTU(IP v6)
http://www.lengo.cn/other/ipv6/4/5.jpg
五、上层校验和
对于Ipv4的TCP、UDP和ICMP实现方案中,将一个即有源字段,又有目标字段的伪报头加进了他们的校验和计算中。IP v6对这个进行了改进,产生了新的IPv6伪报头,使得新的TCP、UDP和ICMP必须使用这个伪报头。 哎,这东西太复杂了,搞不懂啊
页:
[1]