ipv4的一些事
这是18年刚入职不久第一次部门分享的内容,留个念想,顺带水篇文章
- 关于ip地址
- 划分子网
- CIDR
ip地址的基本概念
- TCP/IP协议的网络层使用的地址标识符叫做IP地址
- IP v4中IP地址是一个32位的二进制地址
- 网络中的每一个主机或路由器至少有一个IP地址
- 在Internet中不允许有两个设备具有同样的IP地址
- 如果一台主机或路由器连接到两个或多个物理网络,那么它可以拥有两个或多个IP地址
ip地址的编址方法
- 分类的IP地址 这是最基本的编址方法,在 1981 年就通过了相应的标准协议。
- 子网的划分 这是对最基本的编址方法的改进,其标准[RFC 950]在 1985 年通过。
- 构成超网 这是比较新的无分类编址方法,1993 年提出后很快就得到推广应用。
ip地址结构
- 每一类地址都由两个固定长度的字段组成,其中一个字段是网络号 net-id,它标志主机(或路由器)所连接到的网络,而另一个字段则是主机号 host-id,它标志该主机(或路由器)。
ip地址的作用
- 源ip地址 表示发送分组的主机(源主机)的地址
- 目的ip地址 接受分组的主机(目的主机)的地址
分类的ip地址
IP地址长度为32位,点分十进制(dotted decimal)地址采用x.x.x.x的格式来表示,每个x为8位,
每个x的值为0~255(例如 202.113.29.119)根据不同的取值范围,IP地址可以分为五类
- A类地址的第一位为0 网络号字段为一个字节
- B类地址的前两位为10 网络号字段为两个字节
- C类地址的前三位为110 网络号字段为三个字节
- D类地址的前四位为1110 为多播地址,后28位为多目的广播地址
- E类地址的前五位为11110 保留今后使用
A类地址
- A类IP地址的网络号长度为7位,主机号长度为24位
- A类地址是从:1.0.0.0~127.255.255.255
- 网络号长度为7位,从理论上可以有$$2^7$$=128个网络
- 网络号为全0和全1(用十进制表示为0与127)的两个地址保留用于特殊目的,实际允许有126个不同的A网络
- 由于主机号长度为24位,因此每个A类网络的主机IP数理论上为$$2^{24}$$=16 777 216
- 主机IP为全0和全1的两个地址保留用于特殊目的,实际允许连接16 777 214个主机
B类地址
- B类IP地址的网络IP长度为14位,主机IP长度为16位
- B类IP地址是从:128.1.0.0~191.255.255.255
- 由于网络IP长度为14位,因此允许有$$2^{14}$$-1=16383 (128.0.0.0是不指派的)个不同的B类网络
- 由于主机IP长度为16位,因此每个B类网络可以有$$2^{16}$$=65536个主机或路由器,实际一个B类IP地址允许连65534个主机或路由器
C类地址
- C类IP地址的网络号长度为21位,主机号长度为8位
- C类IP地址是从:192.0.1.0~223.255.255.255
- 网络号长度为21位,因此允许有$$2^{21}$$ -1=2097151(192.0.0.0是不指派的)个不同的C类网络
- 主机号长度为8位,每个C类网络的主机地址数最多为$$2^{8}$$=256个,实际允许连接254个主机或路由器
D类地址
- 地址范围 224.0.0.0~239.255.255.255
- 用于其他特殊的用途,如多播地址Multicasting
E类地址
- 地址范围:240.0.0.0~255.255.255.255
- 用于某些实验即将来使用
常用三种ip地址的使用范围
网络类别 | 最大网络数 | 第一个可用网络号 | 最后一个可用网络号 | 每个网络中最大的主机数 |
---|---|---|---|---|
A | 126 | 1 | 126 | 16,777,214 |
B | 16,383 | 128.1 | 191.255 | 65534 |
C | 2,097,151 | 192.0.1 | 223.255.255 | 254 |
几种特殊的ip地址
直接广播地址
- A类、B类与C类IP地址中主机号全1的地址为直接广播地址
- 用来使路由器将一个分组以广播方式发送给特定网络上的所有主机
- 只能作为分组中的目的地址
- 物理网络采用的是点-点传输方式,分组广播需要通过软件来实现
受限广播地址
- 网络号与主机号的32位全为1的地址为受限广播地址
- 用来将一个分组以广播方式发送给本网的所有主机
- 分组将被本网的所有主机将接受该分组,路由器则阻挡该分组通过
“这个网络上的特定主机”地址
- 主机或路由器向本网络上的某个特定的主机发送分组
- 网络号部分为全0,主机号为确定的值
- 这样的分组被限制在本网络内部
回送地址
- 回送地址是用于网络软件测试和本地进程间通信
- TCP/IP协议规定:
含网络号为127的分组不能出现在任何网络上
主机和路由器不能为该地址广播任何寻址信息
划分子网
两级ip地址的不合理之处
- IP 地址空间的利用率有时很低
- 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏
- 两级的 IP 地址不够灵活
三级的IP地址
- 从 1985 年起在 IP 地址中又增加了一个“子网号字段”,使两级的 IP 地址变成为三级的 IP 地址
- 这种做法叫作划分子网(subnetting) 。划分子网已成为因特网的正式标准协议
划分子网的基本思路
- 划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络
- 从主机号借用若干个比特作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个比特
- 凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据IP数据报的目的网络号net-id,先找到连接在本单位网络上的路由器
- 然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网
- 最后就将 IP 数据报直接交付给目的主机
子网掩码
为什么需要子网掩码
- 从一个IP数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网的划分
- 使用子网掩码(subnet mask)可以找出 IP 地址中的子网部分
默认子网掩码
- A 类地址默认子网掩码 255.0.0.0
- B类地址默认子网掩码 255.255.0.0
- C类地址默认子网掩码 255.255.255.0
从默认子网掩码可以看出只要把各类型的网络号按位置为1,主机号按位置为0,就得到各类地址的默认子网掩码
(IP 地址) AND (子网掩码) = 网络地址
已知 IP 地址是 141.14.72.24,子网掩码是 255.255.192.0,得到其网络地址的步骤如下:
- 转化点分十进制IP地址转化为二进制为 10001101.00001110.01001000.00011000
- 子网掩码转化为二进制为 11111111.11111111.11000000.00000000
- IP地址与子网掩码按位相与 10001101.00001110.01000000.00000000
- 转化为点分十进制141.14.64.0
子网掩码是一个重要属性
- 路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器
- 路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码
- 若一个路由器连接在两个子网上就拥有两个网络地址和两个子网掩码
使用子网掩码的分组转发过程
- 从收到的分组的首部提取目的 IP 地址 D
- 先用各网络的子网掩码和 D 逐位相“与”,看是否和相应的网络地址匹配。若匹配,则将分组直接交付。
否则就是间接交付,执行(3)
- 若路由表中有目的地址为 D 的特定主机路由,则将分组传送给指明的下一跳路由器;否则,执行(4)。
-
对路由表中的每一行的子网掩码和 D 逐位相“与”,若其结果与该行的目的网络地址匹配,则将分组传送
给该行指明的下一跳路由器;否则,执行(5)
- 若路由表中有一个默认路由,则将分组传送给路由表中所指明的默认路由器;否则,执行(6)
- 报告转发分组出错
无分类编址 CIDR
划分子网在一定程度上缓解了因特网在发展中遇到的困难。然而在1992年因特网仍然面临三个必须尽早解决的问题,这就是:
- B类地址在1992年已分配了近一半,眼看就要在1994年3月全部分配完毕
- 因特网主干网上的路由表中的项目数急剧增长(从几千个增长到几万个)
- 整个IPv4的地址空间最终将全部耗尽
同时ip编址问题也在不断的演进
- 1987 年,RFC 1009 就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码。使用变长子网掩码 VLSM (Variable Length Subnet Mask)可进一步提高 IP 地址资源的利用率
- 在 VLSM 的基础上又进一步研究出无分类编址方法,它的正式名字是无分类域间路由选择 CIDR (Classless Inter-Domain Routing)
CIDR最主要的特点
- CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间
- CIDR使用各种长度的“网络前缀”(network-prefix)来代替分类地址中的网络号和子网号
- IP 地址从三级编址(使用子网掩码)又回到了两级编址
- 无分类的两级编址的记法是 IP地址 ::= {<网络前缀>, <主机号>}
- CIDR 还使用“斜线记法”(slash notation),它又称为CIDR记法,即在IP地址后面加上一个斜线“/”,然后写上网络前缀所占的比特数(这个数值对应于三级编址中子网掩码中比特 1 的个数)
- CIDR 将网络前缀都相同的连续的 IP 地址组成“CIDR地址块”
CIDR地址块
- 128.14.32.0/20 表示的地址块共有 $$2^{12}$$ 个地址(因为斜线后面的20是网络前缀的比特数,所以主机号的比特数是 12)
- 这个地址块的起始地址是 128.14.32.0
- 在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”
- 128.14.32.0/20 地址块的最小地址:128.14.32.0
- 128.14.32.0/20 地址块的最大地址:128.14.47.255
- 全 0 和全 1 的主机号地址一般不使用
路由聚合
- 一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由
- 路由聚合也称为构成超网(supernetting)
- CIDR 虽然不使用子网了,但仍然使用“掩码”这一名词(但不叫子网掩码)
- 对于 /20 地址块,它的掩码是 20 个连续的 1。 斜线记法中的数字就是掩码中1的个数
- 10.0.0.0/10 隐含地指出 IP 地址 10.0.0.0 的掩码是 255.192.0.0。此掩码可表示为11111111 11000000 00000000 00000000 (255.192.0.0)
CIDR记法的其他形式
- 10.0.0.0/10 可简写为 10/10,也就是将点分十进制中低位连续的 0 省略
- 网络前缀的后面加一个星号 * 的表示方法
如 00001010 00,在星号 之前是网络前缀,而星号 * 表示 IP 地址中的主机号
举个例子
某个大学分到了206.0.68.0/22地址块,把它用二进制表示11001110.00000000.010001*,可以表示1024个地址,该大学四个系如果想平均分,可以先拿出两位表示四个系,11001110.00000000.01000100/8分给A系,11001110.00000000.01000101/8分给B系,11001110.00000000.01000110/8分给C系,11001110.00000000.01000111/8分给D系,这就保证了每个系下有$$2^8$$个可用地址
最长前缀匹配
- 使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果
- 应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配(longest-prefix matching)
- 网络前缀越长,其地址块就越小,因而路由就越具体
- 最长前缀匹配又称为最长匹配或最佳匹配
举个例子
目的地址: 192.24.15.255
路由表如下:
| prefix | next hop |
| ------ | ------ |
| 192.24.0.0/18 | D |
| 192.24.12.0/22 | B |
路由表: 路由表存储着指向特定网络地址的路径
把目的地址与路由表中每项掩码按位相与,得到网络地址,将得到的网络地址与prefix列的每一项相比较,得到下一跳出口。
目的地址转化为二进制表示: 11000000.00011000.00001111.11111111
通过前缀获得子网掩码:11111111.11111111.11000000.00000000
按位相与得:11000000.00011000.00000000.00000000
转化为点分十进制得:192.24.0.0
目的地址转化为二进制表示: 11000000.00011000.00001111.11111111
通过前缀获得子网掩码:11111111.11111111.11111100.00000000
按位相与得:11000000.00011000.00001111.11111111
转化为点分十进制得:192.24.12.0
综上可见 目的网络既属于192.24.0.0/18网段又属于192.24.12.0/22网段,根据最长前缀匹配原则,选择B作为下一跳出口
使用二叉线索查找路由表
- 当路由表的项目数很大时,怎样设法减小路由表的查找时间就成为一个非常重要的问题
- 为了进行更加有效的查找,通常是将无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索(binary trie)
- IP 地址中从左到右的比特值决定了从根结点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址
- 为了提高二叉线索的查找速度,广泛使用了各种压缩技术
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。