在TCP/IP协议中,IP地址是一个最基本的概念,本文就来参考《计算机网络》谢希仁 这本书,总结一下IPv4地址表示法的发展阶段,做个读书笔记。

IP地址的编址方法共经过了三个历史阶段:

  1. 分类的IP地址,这是最基本的编址方法,在1981年就通过了相应的标准协议。
  2. 子网的划分,这是对最基本的编址方法的改进,其标准RFC 950在1985年通过。
  3. 无分类编址,这是比较新的无分类编址方法,1993年提出后很快就得到推广应用。

传统分类的IP地址

概念

传统分类的IP地址就是将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个字段是网络号,它标志主机所连接到的网络。第二个字段是主机号,它标志着该主机。

一个网络号在整个互联网范围内必须是唯一的。

一个主机号在它前面的网络号所指明的网络范围内必须是唯一的。

这里要指出,由于近年来已经广泛使用无分类IP地址进行路由选择,A类、B类和C类地址的区分已成为历史[RFC 1812]

其实还有D类(广播地址)和E类(保留地址)本文暂不考虑。

表示

几种特殊IP

  • 网络号全为0(00000000)

IP地址中的全0表示“这个(this)”。网络号字段为全0的IP地址是个保留地址,意思是“本网络”。

  • 网络号为127(01111111)

保留作为本地环回地址,作为本主机的进程之间通信之用。

  • 主机号全为0

代表整个网络本身,即本网段

  • 主机号为255(11111111)

为广播地址,代表本网络中的所有地址

0.0.0.0 和 127.0.0.1 的通俗解释:

假设你有一台服务器,IP地址为49.233.87.25,在这台服务器上你要配置一个nginx网站。

将nginx监听为0.0.0.0.0:80,那么互联网上的任何人都可以在浏览器中访问49.233.87.25:80,来访问你的站点。

将nginx监听为127.0.0.1:80,你只能在你的服务器上,用curl 127.0.0.1:80来访问你的站点。

localhost 和 127.0.0.1

localhost 是 127.0.0.1 的域名,它俩是一个东西。

地址的指派范围

网络类别 最大网络数 第一个网络号 最后一个网络号 网络中的最大主机数
A类 126(2^7-2) 1 126 16777214
B类 16383(2^14-1) 128.1 191.255 65534
C类 2097151(2^21-1) 192.0.1 223.225.225 254

问题

  • IP地址空间的利用率有时很低

每一个A类地址网络可连接的主机数超过1000万台,而每一个B类地址网络可连接的主机数也超过6万台。然而有些网络对连接在网络上的计算机数目有限制,根本达不到这样大的数值。

有的单位申请到了一个B类地址网络,但所连接的主机数并不多,可是又不愿意申请一个足够使用的C类地址,理由是考虑到今后可能的发展

  • 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏

每一个路由器都应当能够从路由表查出应怎样到达其他网络的下一跳路由器。因此,互联网中的网络数越多,路由器的路由表的项目数也就越多

  • 两级IP地址不够灵活

有时情况紧急,一个单位需要在新的地点马上开通一个新的网络。但是在申请到一个新的IP地址之前,新增加的网络是不可能连接到因特网上工作的。

子网的划分

为解决上述问题,从1985年起在IP地址中又增加了一个“子网号字段”,使两级IP地址变成为三级IP地址,它能够较好地解决上述问题,并且使用起来也很灵活。这种做法叫作划分子网

基本思路

  • 内部可见,外部不变

一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网。划分子网纯属一个单位内部的事情。本单位以外的网络看不见这个网络是由多少个子网组成,因为这个单位对外仍然表现为一个网络。

  • IP地址 = 网络号 + 子网号 + 主机号

划分子网的方法是,从该网络的主机号中借用几位作为子网号,当然主机号也就相应的减少几位。

  • 先找网络号,再找子网号

凡是从其他网络发送给本单位某个主机的IP数据报,仍然是根据IP数据报的目的网络号找到连接在本单位网络上的路由器。但此路由器在收到IP数据报后,再按子网号找到目的子网,把IP数据报交付目的主机。

示例

假设某单位有一个B类地址,网络地址为145.13.0.0,即表示凡目的地址为145.13.x.x的数据报都被送到这个网络上的路由器R1

这里假定子网号占用8位,即主机号还剩余8位可用。将网络划分为三个子网,145.13.3.0,145.13.7.0,145.13.21.0

子网掩码

现在有一个问题就是,假设有一个目的地址为145.13.3.10的数据报转发到了路由器R1,哪R1如何将其转发到子网145.13.3.0呢?

由于32位的IP地址本身以及数据报的首部都没有包含任何有关子网划分的信息,所以为了解决上述问题,必须引入额外信息,这就是子网掩码。

IP地址和子网掩码按位与(AND),即可得到网络号。

现在因特网的标准规定:所有的网络都必须使用子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏。

如果一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码。默认子网掩码中1的位置和IP地址中的网络号字段正好相对应。

A类地址,默认子网掩码 255.0.0.0

B类地址,默认子网掩码 255.255.0.0

C类地址,默认子网掩码 255.255.255.0

路由转发

要注意,使用子网划分后,路由表必须包含以下三项:目的网络地址子网掩码,和下一跳地址

源主机H1(128.30.33.13)向目的主机H2(128.30.33.138)发送数据时的过程如下:

  1. 目的IP地址与网络1的子网掩码按位与得到128.30.33.128,不等于网络1的地址128.30.33.0,即H1和H2不在同一个子网内,所以数据转发给路由器R1
  2. R1收到数据报后,逐行检查路由表,最终发现128.30.33.138和255.255.255.128按位与,得到128.30.33.128,匹配第二行,所以R1将数据报从接口1直接交付给目的主机H2

问题

划分子网在一定程度上缓解了因特网在发展中遇到的困难。但是在1992年因特网依旧遇到如下问题:

  1. B类地址在1992年已分配了近一半,眼看很快就将全部分配完毕!
  2. 因特网主干网上的路由表中的项目数急剧增长(从几千个增长到几万个)。

无分类编址CIDR

概念

CIDR消除了传统的A类、B类和C类地址以及划分子网的概念,把32位的IP地址划分为两个部分,前面是网络前缀,用来指明网络,后面的部分用来指明主机。CIDR是无分类的两级编址,IP地址 = 网络前缀 + 主机号

CIDR计法在IP地址后面加上斜线“/”,然后写上网络前缀所占的位数

地址块

CIDR把网络前缀都相同的连续的IP地址组成一个“CIDR地址块”,我们只要知道地址块中的任何一个地址,就可以知道这个地址块的起始地址和最大地址,以及地址块中的地址数。

举例:

已知128.14.35.7/20是某CIDR地址块中的一个地址

128.14.35.7/20 = 10000000000011100010001100000111

可知:

最小地址:128.14.32.0 = 10000000000011100010000000000000

最大地址:128.14.47.255 = 10000000000011100010111111111111

地址数:2^12个

地址掩码

为了更方便地进行路由选择,CIDR使用32位的地址掩码,地址掩码由一串1和一串0组成,而1的个数就是网络前缀的长度。

例如,/20地址块的地址掩码是:11111111 11111111 11110000 00000000(20个连续的1)

注意:虽然CIDR不再使用子网,但是由于目前一些网络还使用子网划分和子网掩码,因此CIDR使用的地址掩码也可以继续称为子网掩码。

“CIDR不使用子网”是指CIDR并没有在32位地址中指明若干位作为子网字段。但分配到一个CIDR地址块的单位,仍然可以在本单位内根据需要划分出一些子网。

这些子网也都只有一个网络前缀和一个主机号字段,但子网的网络前缀比整个单位的网络前缀要长些。

例如,某单位分配到地址块/20,就可以再继续划分为8个子网(即需要从主机号中借用3位来划分子网)。这时每一个子网的网络前缀就变成23位(原来的20位加上从主机号借来的3位),比该单位的网络前缀多了3位。

地址聚合

如上图所示,假定某ISP拥有地址块206.0.64.0/18(相当于有64个C类网络)

ISP可以给该大学分配一个地址块206.0.68.0/22(相当于有4个C类网络)

这个大学然后可自由地对本校的各系分配地址块

而各系还可再划分本系的地址块

CIDR的地址块分配有时不易看清,这是因为网络前缀和主机号的界限不是恰好出现在整数字节处,只要写出二进制表示形式,就清晰了

从上图就可以清楚地看出地址聚合的概念。这个ISP共拥有64个C类网络。如果不采用CIDR技术,则在与该ISP的路由器交换路由信息的每一个路由器的路由表中,就需要有64个项目。(如第二节中的R1路由器,路由表中就有三个子网的信息)

但采用地址聚合后,就只需用路由聚合后的一个项目206.0.64.0/18就能找到该ISP。(即构成超网)

最长前缀匹配

在CIDR中,由于采用了网络前缀这种记法,IP地址由网络前缀和主机号这两部分组成。因此路由表的每条记录由网络前缀下一跳组成。

但是,在查找路由表的时候,可能有多条记录匹配,应当从匹配结果中选择具有最长网络前缀的路由,即最长前缀匹配。

参考资料

《计算机网络》谢希仁 编著

B类地址第一个可分派的网络号为什么不是128.0?

Special-Use IPv4 Addresses

IPv4地址表示法详解的更多相关文章

  1. IP地址、子网掩码详解

    如何通过子网掩码划分网段 资料一: 一.缺省A.B.C类地址,子网掩码:  二.子网掩码的作用:  code:  IP地址 192.20.15.5 11000000 00010100 00001111 ...

  2. RAII惯用法详解

    [1]什么是RAII惯用法? RAII是Resource Acquisition Is Initialization的缩写,意为“资源获取即初始化”. 它是C++之父Bjarne Stroustrup ...

  3. CentOS 最新版的下载地址 + 版本选择详解

    CentOS 最新版的下载地址 + 版本选择详解 发现越来越多的机关单位.事业单位开始使用 Linux 作为主要服务器,毕竟,Linux的稳定性和高效性是众所周知的,所以我也打算把自己这一块技术加强一 ...

  4. PHP转换IP地址到真实地址的方法详解

    本篇文章是对PHP转换IP地址到真实地址的方法进行了详细的分析介绍,需要的朋友参考下   想要把IPv4地址转为真实的地址,肯定要参考IP数据库,商业的IP数据库存储在关系型数据库中,查询和使用都非常 ...

  5. IPv6地址表示方法详解

    IPv6是互联网协议的第六版:最初它在IETF的 IPng选取过程中胜出时称为互联网新一代网际协议(IPng),IPv6是被正式广泛使用的第二版互联网协议. 现有标准IPv4只支持大概40亿(4×10 ...

  6. NAT(地址转换技术)详解

    目录 NAT产生背景ip地址基础知识NAT技术的工作原理和特点静态NAT动态NATNAT重载(经常应用到实际中)NAT技术的优缺点优点缺点NAT穿越技术应用层网关(ALG)ALG的实际应用NAT技术的 ...

  7. SLAM入门之视觉里程计(6):相机标定 张正友经典标定法详解

    想要从二维图像中获取到场景的三维信息,相机的内参数是必须的,在SLAM中,相机通常是提前标定好的.张正友于1998年在论文:"A Flexible New Technique fro Cam ...

  8. KKT条件和拉格朗日乘子法详解

    \(\frac{以梦为马}{晨凫追风}\) 最优化问题的最优性条件,最优化问题的解的必要条件和充分条件 无约束问题的解的必要条件 \(f(x)\)在\(x\)处的梯度向量是0 有约束问题的最优性条件 ...

  9. HS 光流法详解

    前言 本文较为详细地介绍了一种经典的光流法 - HS 光流法. 光流法简介 当人的眼睛与被观察物体发生相对运动时,物体的影像在视网膜平面上形成一系列连续变化的图像,这一系列变化的图像信息不断 &quo ...

随机推荐

  1. C语言数据类型char

    char简介 char是C/C++中的基本数据类型,可容纳单个字符的一种基本数据类型. char占一个字节,也就是8个bit(二进制位),0000 0000 ~ 1111 1111,在无符号类型时ch ...

  2. vue2.0一个弹窗组件

  3. idea如何使用git

    1.安装好git(我下载的2.23.0版本百度网盘分享)  提取码  7ie1 2.配置git环境变量  Path   路径是你安装的git 目录下的bin目录   安装好后窗口命令输入git 可以测 ...

  4. numpy的基础计算2

    import numpy as np A = np.arange(14,2,-1).reshape((3,4)) #平均值 print(np.mean(A)) print(A.mean()) prin ...

  5. 常用JS代码片段

    1.隐藏部分数字,如手机号码,身份证号码 1 2 3 function (str,start,length,mask_char){ return str.replace(str.substr(star ...

  6. lvs/dr+keepalived搭建成功后,开启防火墙,虚拟IP不能访问,但是真实IP却可以访问

    lvs/dr+keepalived搭建成功后,开启防火墙,虚拟IP不能访问,但是真实IP却可以访问,如果关闭防火墙虚拟IP就可以访问网站了,这个问题肯定是防火墙在作怪. 经过这两的不懈奋斗和大家的帮助 ...

  7. Mybatis分页插件的使用流程

    如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件.该插件支持任何复杂的单表.多表分页. 1.引入PageHelper的jar包 在pom.xml中添加如下依赖: 12345 ...

  8. 用jekyll和github把网站建起来!

    先把这些天学习的用jekyll在github上搭建网站的步骤记录下来,留作参考. #安装jekyll 确定系统安装 Git, Ruby, RubyGems, Nodejs, Python2.7. 如何 ...

  9. 【C#】WechatPay-API-v3 使用平台证书加密内容与应答|通知验签(SHA256 with RSA)

    官方暂时没有维护应答与通知签名的验证C#示例,找了些资料被困扰了一天终于调试通了,贴出来下 . 此类提供两个方法: 1.敏感信息加密,如身份证.银行卡号.(特约商户进件接口需要): 2.应答与通知签验 ...

  10. Python——8函数式编程①

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...