IP协议/地址(IPv4&IPv6)概要
IP协议/地址(IPv4&IPv6)概要
IP协议
什么是IP协议
协议的特征
- 无连接:发送数据包前不与目标建立连接
- 最大努力:不保证数据包交付。即,如果出错,IP无法重新传输数据包;如果顺序错乱或丢失,则使用数据或上层服务的应用程序来解决此问题。(IP不可靠性)
- 介质无关性:操作与传输数据的介质无关。(无论光纤、铜缆还是无线电)
IP协议类型
- IPv4
- IPv6
IPv4
IPv4数据包结构如上,数据部分是由下层添加的,所以我们在此只详细介绍IPv4数据包报头。报头为目标地址及其以上的部分(也可以视为可选项及其以上)
(图片来源:IP数据包结构 – 甜腻 – 博客园 (cnblogs.com))
IPv4数据包报头
- 版本:包含一个4位二进制值
0100
,用于标识这是个IPv4数据包。(0100转成十进制为4) - 服务类型(ToS):现在叫区分服务或DiffServ(DS)字段。DS字段是一个用于确定每个数据包优先级的8位字段。其中包括DSCP和ECN
-
- DSCP:即区分服务代码点,通过编码值来区分优先级,为DS字段的6个最高有效位。
- ECN:即显式拥塞通知位,占DS字段后两位。通常情况下,当网络中出现拥塞的时候,TCP/IP会主动丢弃数据包。源端检测到丢包后,就会减小拥塞窗口,降低传输速率。但如果端到端能成功协商ECN的话,支持ECN的路由器就可以发生拥塞时在IP报头中设置一个标记,发出即将发生拥塞的信号,而不是直接丢弃数据包。ECN减少了TCP的丢包数量,通过避免重传,减少了延迟(尤其是抖动),提升了应用的性能。[2]
- 标志:占3位,用于分片重组。其中3位按顺序各分为D\DF\MF,但实际上只有后两位即DF\MF有意义。
-
- D
- DF:用于决定是否分片。0为不分片,1为分片。
- MF:用于判断数据分片发送后,该数据包后面是否还有分片。0为后面没有分片,1为后面有分片。
- 段偏移量:占12位。通过相对于原来包的偏移量重组分片后的IP数据包,以8字节位偏移单位。[3]
- 生存时间(TTL):包含用于限制数据包寿命的一个8位二进制值。数据包发送方设置初始TTL值,数据包每经过一次路由器数值就减少1。如果TTL字段的值减少为0,则路由器丢弃该数据包,并向源IP地址发送因特网控制消息协议(ICMP)超时信息。
- 协议代码:占8位,字段用于确定下一级的协议。此字段表示数据包包含的数据负载类型,使网络层将数据传输到相应的上层协议。常用的值包括ICMP(1)、TCP(6)和UDP(17)
- 头校验和:表示IP报头的校验和,用于错误检查。该字段仅用于IP报头的校验和,有效载荷不包 括在校验和计算中。数据报文沿途的每个中间路由器都重新计算和验证该字段(因为路由器 转发数据报文时,TTL值都会变化)。该字段长度为16位。[4]
- 源地址:即源IPv4地址。包含表示数据包源IPv4地址的32位二进制值。源IPv4地址始终为单播地址
- 目的地址:即目的IPv4地址。32位,目的地址可以为单播、组播或广播地址
注:源地址与目的地址在传输中通常不会发生改变。
IPv4局限性
- IP地址耗尽
- Internet路由表膨胀
- 缺乏端到端的连接
IPv4通信
- 单播:从一台主机向另一台主机发送数据包的过程。范围0.0.0.0~223.255.255.255
- 广播:从一台主机向该网路中所有主机发送数据包的过程
- 组播:从一台主机向选定的一组主机(可能在不同网络中)发送数据包的过程。范围224.0.0.0~239.255.255.255
IPv4无类编址
基础
在了解编址前,你需要先掌握一些基础知识
- 二进制与十进制之间的转换
- 逻辑与运算
这不是本文主要内容,因此不过多介绍。
IPv4地址、子网掩码与前缀
地址和子网掩码
首先来看子网掩码,它是个点分4段(每段对应8位二进制)十进制的值,用于描述IP地址的网络地址与主机部分
二进制子网掩码每一位与二进制IPv4地址的位相对应,其中子网掩码为1的位其IP相应位置处为网络位,为0的位则对应主机位
例如下方的子网掩码与其对应的IPv4地址
我们将其转化为二进制的形式
我们对其二进制进行逻辑与运算得到其网络地址的二进制形式
由子网掩码知11000000.10101000.00001111
为网络位,而00000000
为主机位
转换成十进制得其网络地址为
由主机位可知,所以该网络地址下所能容纳的IPv4地址数如下
该网络地址能分配给主机的地址数如下
其中减去的两个地址为网络地址192.168.15.0
与广播地址192.168.15.255
把网络地址最后一位主机位变为1,得到该网络下能分配给主机的最小IP
把最后一位主机位置为0,其他主机位全为1,则得到该网络下能分配给主机的最大IP(若主机位全1则为广播地址)
前缀
前缀是表示网络位的一种简便写法
上文中的例子可以写为
其中/24
就是前缀,表示子网掩码前24位都为1,故子网掩码为255.255.255.0
其他
上述例子中网络部分与主机部分都是处于不同段,该方法同样适用于IP地址某一段既存在网络位又有主机位的情况
例如
其子网掩码为
按照上述方法可得:
网络地址
网络地址下所能容纳的IPv4地址数
该网络地址能分配给主机的地址数
该网络下能分配给主机的最小IP
该网络下能分配给主机的最大IP
注意
我们指出一个设备的IPv4地址时一定要给出其子网掩码或前缀,否则该地址没有意义
IPv4传统有类编址
1981年,使用在RFC 790中Assigned Numbers部分定义的有类编址对互联网IPv4地址进行分配。根据三个类别(A类、B类、C类)之一为客户分配网络地址。
A类
- 范围:0.0.0.0/8~127.0.0.0/8
B类
- 范围:128.0.0.0/16~191.255.0.0/16
C类
- 范围:192.0.0.0/24~223.255.255.0/24
其他
还有D类与E类地址,由于不太重要,此处仅简要概括。
- D类IP地址第一个字节以“1110”开始 。它并不指向特定的网络,这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。[5]
- E类IP地址范围240.0.0.1到255.255.255.254,E类地址保留,仅作为搜索、Internet的实验和开发之用。[6]
IPv6
IPv6数据包报头
IPv6数据包报头如上(此图下方加上数据字段即为IPv6数据包)
- 版本:该字段包含一个4位二进制值
0110
,标志这是个IPv6的数据包 - 流量类别:占8位,与IPv4报头TOS字段类似。
- 流标签:占20位,给属于特殊流分组加上标签(特殊流是发送方要求特殊处理的流),能够对一条流中某些数据或某些应用数据报给出优先权。所有相同标签的包受到路由器相同处理。
- 负载长度:即有效负荷长度。占16位,二进制作为一个无符号整数,表示报头后面的字节数量。(数据字段最大为65535字节)
- 下一报头:占8位,相当于IPv4的协议字段,表示数据字段需要交付给哪个协议(如UDP、TCP)。
- 跳数限制:占8位,类似于IPv4的TTL字段,每台路由器对其减1,减到0则丢弃该包,并向主机转发ICMPv6超市消息来表示未到达目的地。
- 源地址:即源IPv6地址。占128位,表示发送主机地址。
- 目的地址:即目的IPv6地址。占128位,表示接收主机地址。
IPv6数据包还可能包含扩展包头(EH),为可选项,介于报头与数据之间,用于分段、安全性、移动支付等。
注:IPv6源地址与目的地址一般也不会改变。
IPv6编址
IPv6表示方法
- IPv6地址长度为128位,写作八段十六进制的字符串,示例如下
- IPv6无子网掩码,但有前缀长度,表示IPv6地址的前缀,剩下的对应接口ID部分(类似于IPv4的主机部分)。例如前缀位
/64
(目前一般默认/64),则分段如下:
IPv6简写表示
- 省略前导0
- 忽略全0段,并用两个冒号表示
以上文的地址为例,其简写如下:
IPv6地址类型
- 单播:IPv6单播地址用于唯一标识支持IPv6设备上的接口。
- 组播:IPv6组播地址将单个IPv6数据包发送到多个目的地。
- 任播:IPv6任播地址是可分配到多个设备的IPv6任播地址。发送至任播地址的数据包会被路由到最近拥有改地址的设备。
注:IPv6没有广播,因为广播可被视为组播的一种特殊情况
下面将详细介绍三种类型
IPv6单播地址
- IPv6全局单播地址(GUA):其具有全局唯一性,可在IPv6因特网上路由。全局单播地址有三个部分,即全局路由前缀、子网ID、接口ID。
-
- 全局路由前缀:为提供商分配给客户或站点的地址的前缀或网络部分。一般RIR向客户分配
/48
的全局路由前缀(总共64位,如果全局前缀占48位的话,那么子网ID就是16位,用的是/64,他们的总共位数是固定的),如下图所示。 - 子网ID:组织使用子网ID确定其站点子网。子网越大可用子网越多(位数越多,组合出来的子网数就越多)。
- 接口ID:相当于IPv4主机部分
- 全局路由前缀:为提供商分配给客户或站点的地址的前缀或网络部分。一般RIR向客户分配
IPv6组播地址
- IPv6组播地址类似于IPv4组播地址,用于发送单个数据包到一个或多个目的地(组播组)。
- IPv6组播地址前缀为FF00::/8
- IPv6组播地址分为两种类型:分配的组播、请求节点的组播
-
- 分配的组播(相当于IPv4广播):
-
- FF02::1全节点组播组:这是一个包含所有支持IPv6设备的组播组。发送到该组的数据包由该链路或网络上的所有IPv6接口接收和处理。
-
- FF02::2全路由组播组:这是一个所有IPv6均会加入的组播组。发送到该组的数据包由该链路或网络上所有IPv6路由器接收和处理。
-
- 请求节点的IPv6组播地址:请求节点组播地址类似于全节点组播地址。请求节点组播地址的优势在于它被映射到特殊以太网组播地址。这使以太网网卡可以通过检查MAC地址过滤该帧,而不是将它发送给IPv6流程来判断该设备是否是IPv6数据包既定目标。
IPv6任播地址
- 任播地址在移动通信中很有用,接收方只需要是一组接口中的一个即可,这样可以使移动用户在地理位置上不会受过多的限制。[7]
- IPv6任播地址是从单播地址空间中划分出来的,任播地址与单播地址位于同一个地址范围内,任播地址与单播地址有相同的格式,当一个单播地址属于多个接口时,它就是任播地址。仅看地址本身,节点是无法区分单播地址和任播地址的,节点需要使用明确的配置指明该地址是一个任播地址。[7:1]
IPv4与IPv6共存方式
双栈
- 双栈设备同时运行IPv4和IPv6协议栈。双堆栈允许IPv4与IPv6在同一网络中共存
隧道
- 隧道是一种在IPv4网络中传输IPv6数据包的方法
- 基本原理:假定两个IPv6节点要使用IPv6数据包进行交互,但他们是经由中间IPv4路由器互联的。我们将两台IPv6路由器之间的中间IPv4路由器的集合称为一个隧道。借助于该隧道,在隧道发送端的IPv6节点数据可将整个IPv6数据放到一个IPv4数据报的数据(有效载荷)字段中。[8]
转换
- 转换技术是将一种协议版本的数据包报头更改为另一种协议版本的数据包报头,因而解决了IPv4设备与IPv6设备之间的互操作问题。[9]NAT64允许IPv6设备使用与IPv4 NAT类似方法支持IPv4设备通讯。
IPv4与IPv6区别
- IPv6不允许中间路由器对其数据包进行分片,该操作仅限于源与目的地。如果路由器收到的IPv6数据报因太大而不能转发到出链路上,则需丢弃该包,并向发送方返回一个“分组太大”的ICMP差错报文。[10]
- 因为运输层与数据链路层进行检验操作,故IPv6取消了首部校验和字段
- IPv6选项字段可能出现在“下一报头”指出的位置上(注意,选项字段并不在IPv6报头中)
- IPv6基于128位分层编址,而IPv4采用32位,因此IPv6相比IPv4有更大地址空间
- IPv6报头相对与IPv4更加简化,提高了处理效率
- IPv6地址数更大,消除了NAT需求,避免了需要端到端连接的应用遇到有些有NAT引起的问题。
- IPv6地址全0和全1的主机地址可以分配给设备。全1地址是因为IPv6不使用广播地址。全0地址可使用,但它留作子路由器的任播地址,应仅分配给路由器。