第四章 4.6 IPv6
书接上回,之前谈到即使用了无类型域间路由CIDR和可变长子网掩码技术VLSM,IPv4的容量依旧不够用
IPv4的地址长度为4个8位字节,32比特,而IPv6的地址长度则是IPv4的4倍,即128比特,一半写成8个16位(两字节)
从数量级上来看,IPv6应该足以应付了,但是将所有使用IPv4地址的设备替换成IPv6,在互联网已经如此普及的当今,是个十分艰巨的任务。
目前人们正着力进行IPv4和IPv6之间的相互通信与兼容性方面的测试。
接下来就要谈谈IPv6除了在大小上,其他的特点。
首先要提的一点是,IPv6的特性在一定程度上减弱了管理员的负担,因为即使IPv4也具有类似的功能,但可能无法使用或者需要管理员介入才可以实现。
-
IP地址的扩大与路由控制表的聚合
适应互联网分层构造。分配与地址构造相适应的IP地址。
-
性能提升
包首部长度采用固定的值(40字节),不再采用首部校验码。
简化了首部结构,减轻路由器负荷。路由器不用再做分片处理,而是通过路径MTU发现只有发送端主机进行分片处理。
-
支持即插即用功能
即使不支持DHCP功能的服务器,也可以实现自动分配IP地址。
-
采用认证与加密功能
-
多播、Mobile IP成为扩展功能
那么IPv6的标记方法是什么样呢?
简而言之,就是16比特为一组,中间用冒号隔开
还可以省略表示,比如一组里面全是0,那么就可以省略
IPv6的地址结构,同样是通过IP地址的前几位标识IP地址的种类。
接下来这一段我有些没太读懂,大概意思就是,在互联网通信中,有三类地址
- 全局单播地址,是互联网中唯一一个地址,不需要正式分配IP地址
- 限制性网络中,即不连入公网,可以使用唯一本地地址,这个地址根据一定的算法生成随机数,并融合到地址中
- 而在不使用路由器的一个网段中通信时,还可以使用一种叫做链路本地单播地址的IP地址类型
具体见下图:
在IPv6的环境下, 可以同时将这些IP地址全都配置在同一个NIC上,按需灵活使用。
接下来就要详细介绍一下这三类IP地址:
-
全局单播地址
世界上唯一一个,如下图所示,现在的IPv6网络中,n = 48, m = 16, 128 - m - n = 64位.
前64位为网络标识,后64位为主机标识。(和IPv4一样,分成网络和主机两部分)
接口ID常保存MAC地址的64位版,如果不想让对方知道的话,那么就根据操作系统的具体装置,设置一个临时地址。
-
链路本地单播地址
不经过路由器,在同一个链路中进行通信时使用。接口ID常保存MAC地址的64位版。
- 唯一本地地址
在不与互联网进行通信时所用的地址。那么有人就要问了,那么与互联网进行通信时,要用什么地址呢?其实之前讲过,通过NAT以及代理连入公网,就可以了。
这种地址通常在企业等局域网类型中使用。
之前提过IPv4会进行分段处理,IPv6则为了避免给路由器造成额外的负担,使用路径MTU发现功能,就必不可少了。
IPv6中,最小MTU为1280字节,如果在嵌入式那种具有一定系统资源限制的设备里使用,也就不需要进行“路径MTU发现”,而是在发送IP包是直接以1280字节为单位分片送出。
第四章 4.7 IPv4首部
之前在讲述传输层加首部,IP分段,和IPv6的时候,多多少少提到过首部
首部包含了对于使用IP协议时,进行发包控制时所有的必要信息。
接下来就要对每一部分进行介绍了:
-
Version 版本 = 4 Bit
表示IP首部的版本号,IPv4的版本号是4,IPv6的版本号是6,其余的不详细介绍
-
IHL(Internet Header Length) 首部长度 = 4 Bit
对于没有可选项的IP package,首部长度设置为“5”,即4 x 5 = 20 Bytes
-
TOS Type of Service 区分服务 = 8 Bit
用来表明服务质量,在实际中已经很少会设定这个数值了,因为如果要做trade-off,控制算法会十分复杂,也有可能产生不公平的现象。
-
DSCP和ECN = 5 Bit + 2 Bit
DSCP, Differential Services Codepoint,差分服务代码点,是TOS的一部分,现在统称DiffServ,用来进行质量控制
ECN,Explicit Congestion Notification,显示拥塞通告,用来报告网络拥堵情况
第6位的ECN用于通告上层TCP层协议是否处理ECN,路由器转发ECN为1的包的过程中,如果出现网络拥堵的情况,就将CE位设置为1
-
Total Length 总长度 = 16 Bit
表示IP首部与数据部分合起来的总字节数。
IP包的最大长度为65535 = 2^16 - 1,但目前不存在能够传输最大长度为65535字节的IP包的数据链路。
-
ID identification 标识 = 16 Bit
用于分片充足,如果属于同一个分片,那么标识值就相同。
通常,每发送一个IP包,他的值就逐渐递增。
-
Flags 标志 = 3 Bit
这一段在路径MTU发现的时候,提到过,当时直接设置1比特为1.
-
FO Fragment Offset 片偏移 = 13 Bit
用于标识每一个片段相对于原始数据的位置,第一个分片对应的值为0。
最多可以表示8192(= 2^13)个相对位置。
偏移位置的单位是8字节,那么最大的偏移量就是8x8192 = 65536字节
-
TTL Time to Live 生存时间 = 8 Bit
最初的意思是以秒为单位,记录当前包在网络上应该生存的期限。
现在的意思是能够中转多少个路由器。每经过一个路由器,TTL会减1,直到变成0,就丢弃该包。
最大中转次数为256次,可以避免IP包在网络中无限传递的问题。
-
Protocal 协议 = 8 Bit
表示IP首部的下一个首部隶属于哪个协议。目前常使用的协议可以查表,此处不赘述。
-
Header Checksum 首部校验和 = 16 Bit
该字段只校验数据报的首部,不校验数据部分。主要用来确保IP数据报不被破坏。
计算过程是,将校验和所有位置都设置为0,然后用16比特为间隔,划分IP首部,并用1补数计算所有16位字的和。最后将这个和的1补数赋给首部校验和字段。
1补数的计算方法为,如果是正整数,那么其1的补数为原二进制码;如果是负整数的话,将二进制数反转(包括符号位),得到的数即为原二进制的1的补数。
-
Source Address 源地址 = 32 Bit
表示发送端IP地址
-
Destination Address 目标地址 = 32 Bit
表示接收端IP地址
-
Options 可选项
通常只在实验或诊断时使用。包括安全级别、源路径、路径记录、时间戳。
-
Padding 填充
在有可选项的情况下,如果首部长度不是32bit的整数倍,就可以填充至整数倍。换言之,如果没有可选项,那么就没必要有填充部分。
-
Data 数据
就是数据,IP上层协议的首部也可以作为数据进行处理。
接下来就是IPv6的首部格式
相比较于IPv4,省略了首部校验和字段,提高了包的转发效率。
另外,识别码成为了可选项,为了让64位CPU的计算机处理起来更加方便,IPv6的首部及可选项都由8字节构成。
-
Version 版本 = 4 Bit
版本号为6
-
Traffic Class 通信量类 = 8 Bit
相当于IPv4的TOS字段。
-
Flow Label 流标号 = 20 Bit
用于服务质量控制。
不使用时,每一位都可以设置为0.
-
Payload Length 有效载荷长度
是指包的数据部分。IPv4的TL指包括首部在内的所有长度,然而IPv6的Payload Length则不包括首部,只表示数据部分的长度。
-
Next Header 下一个首部 = 8 Bit
相当于IPv4的协议字段。通常表示上一层的协议时TCP或者UDP。
-
Hop Limit 跳数限制 = 8 Bit
和IPv4中的TTL意思相同。
-
Source Address 源地址 = 128 Bit
表示发送端IP地址。
-
Destination Address 目标地址 = 128 Bit
表示接收端IP地址。
另外一提,IPv6还有扩展首部,因为其首部长度固定,所以如果要添加可选项,那么就需要扩展首部。
扩展首部通常位于IPv6首部,和TCP/UDP首部中间。可选项长度也没有限制。
另外注意到的一点,IPv6首部中没有标识以及标志字段,在需要对IP数据包进行分片时,可以使用扩展首部。