99-IPv4 地址

很久以前我们非常简单的讨论过 《IPv4 地址》,那时候是出于网络编程基础的需要,介绍了和 IP 地址相关的函数。这一次,我们来详细的讨论下 IP 地址的结构。

1. IPv4 地址分类

1981 年,标准就制定了一种基本的编址方法32 位的 IP 地址由 {netid, hostid} 两部分构成,根据这个规则,依据 netid 将 IP 地址分成 5 大类:


这里写图片描述
图1 五类 IP 地址

比如 IP 地址 128.1.1.1 就是一个 B 类 IP 地址。这里需要提一点的是,近年来,A 类、B 类、C 类地址的区分已成为历史,仅管是这样,那还不要要学呢?这个问题留给你自己回答吧。

2. 常用 IP 地址

2.1 A 类地址

A 类地址的网络号占用 1 字节,第 1 位固定成 0,范围是 0 到 127 (包含 127),一共 128 个。但是,可指派的网络号只有 126 个,其中 网络号 0 和 127 我们不使用,它们用作特殊含义:

  • 网络号为 0,表示本网络。
  • 网络号为 127,保留作本地软件环回测试(loop test)本主机进程之间的通信之用。如 127.0.0.1

A 类地址的主机号占用 3 字节,它的范围是 [0,2241]。主机号 0 和 2241 不能用作主机 IP 地址,它们的含义如下:

  • 主机号 0 表示该 IP 地址是“本主机”所连接到的单个网络地址(例如,一主机 IP 地址是 5.6.7.8,则该主机所在的网络地址就是 5.0.0.0)。
  • 主机号为全 1,表示“所有的”,即表示该网络上所有主机。(这是一个广播地址。)

2.2 B 类网络地址

B 类地址的网络号占 2 字节,前 2 位固定(10),范围是 128.0 到 191.255。然而,[COME06] 规定,128.0 这个网络号是不能指派的!因此,B 类网络号最小也只能是 128.1,也就是说最小的网络地址 128.1.0.0. 所以 B 类能用的网络数只有 2141个。

B 类网络上最大的主机数是 2162 个,主机号全 0 表示网络地址,主机号全 1 表示广播地址。

2.3 C 类网络地址

C 类地址的网络号占用 3 字节,前 3 位固定(110),它的范围是 192.0.0 到 223.255.255,然而,[COME06] 规定,192.0.0 是不可使用的。因此 C 类地址能用的网络总数是 2211 个。

C 类网络上最大的主机数是 282=126 个,主机号全 0 表示网络地址,主机号全 1 表示广播地址。

下表总结了 IP 地址指派的范围:

网络类别 最大可指派的网络数 第一个可指派的网络号 最后一个可指派的网络号 每个网络中最大主机数
A 272 1 126 2242
B 2141 128.1 191.255 2162
C 2211 192.0.1 223.255.255 282

3. 划分子网

鉴于基本的编址方法有以下缺陷:

  • IP 地址空间利用率低
  • 给每个物理网络分配一个网络号使路由表变得太大,使网络性能变坏
  • 两级 IP 地址不够灵活,比如想添加一个新的网络,就得去因特网管理机构申请。

为了解决上面的问题,1985 年起在 IP 地址中又增加了一个“subnetid”,即子网号字段,它的结构如下:

IP 地址 = {netid, subnetid, hostid}

划分子网的方法是从网络的主机号中借用若干位作为子网号 subnetid,当然这也造成了主机号也就相应的减少了同样的位数。

3.1 子网掩码

图 2 所示的网络,将 192.168.166.0 网络划分成了两个子网,在这个网络中,192.168.166.34 的三级结构是 {192.168.166, 1, 2},即 netid = 192.168, subnetid = 1, hostid = 2.

而 192.168.166.17 的 netid = 192.168.166, subnetid = 2, hostid = 1. 为什么是这样的结果?因为这是人为强制设置的,后面会解释。

根据上面的叙述,192.168.166.0 划分出了两个子网,分别是 192.168.166.16 以及 192.168.166.32.

假设 PC4 发送了一份 IP 数据报给目标主机 192.168.166.34 主机,PC4 并不知道目的主机所连接的网络是否进行了子网划分(要知道,IP 协议首部并不包含子网掩码的信息)。

当路由器 R1 接收到了发给 C 类网络地址 192.168.166.34 的数据报后,应该如何才能将其转发到子网 192.168.166.32 上呢?此时就需要子网掩码来帮我们搞定它。


这里写图片描述
图2 将 C 类网络 192.168.166.0 划分成了 2 个子网

具体做法就是从 hostid 拿出若干位,用来表示 subnetid,在图 2 这个例子中,我们从 hostid 中拿出了 4 位做子网号。

例如 192.168.166.34 拆分成 2 进制(只拆分最后一段):

192.168.166.00100010 --> {192.168.166}{0010}{0010}

因此子网号是 0010,即 10 进制的 2,而主机号是 0010,10 进制的 2.

为了能让路由器方便的从目的 IP 地址中提取出要找的子网的网络地址,就需要使用子网掩码。子网掩码是由一串 1 跟随一串 0 组成,子网掩码中 1 对应于 IP 地址中原来的 netid 加上 subnetid 部分,而 0 对应于 hostid 部分。

在图 2 这个例子中,192.168.166.0 这个网络中的主机的子网掩码是 255.255.255.240. 图 3 演示了如何根据子网掩码计算 netid, subnetid 和 hostid.


这里写图片描述
图3 根据子网掩码计算 netid, subnetid,以及 hostid

给路由器的每个接口设置了子网掩码后,路由器就可用“与”的计算方式,找到 netid 和 subnetid 部分啦。

假设没有做子网划分,还要设置子网掩码吗?标准规定,都要设置(虽然可以不用设置,此时使用默认的子网掩码,按照 A、B、C 类网络划分)。

4. 数据转发流程

接下来,我们看看 PC4 给 PC6 发数据包,路由器是如何动作的(参考图 2)。

  • PC4 将 PC6 的 IP 地址(192.168.166.34)与自己的子网掩码相与,发现其在 192.168.166.0 网络上,和自己并不在同一网络(自己在 192.168.3.0 上),故将 IP 数据报交由默认网关 192.168.3.1.
  • 路由器 R2 收到 PC4 发来的数据报,将目的 IP 地址 192.168.166.34 和路由表中每一项的子网掩码做与操作,得到网络地址 192.168.166.0,然后根据此网络地址查找路由表,得知下一跳地址是 Ethernet0/0 出口(如图 4)。于是将数据报从 Ethernet0/0 出口转发出去。

注:Ethernet0/0 出口就是 192.168.1.2 那个出口。


这里写图片描述
图4 查看 R2 的路由表

  • 路由器 R1 收到数据报后,将目标 IP 地址 192.168.166.34 和路由表中的第一项与子网掩码做与操作,首先应该是和 255.255.255.240 这个掩码相与,得到子网号为 192.168.166.32,然后查找路由表,得知下一跳地址是 Ethernet0/1 出口。接下来将 IP 数据报从 Ethernet0/1 出口转发出去。

注:Ethernet0/1 出口就是 192.168.166.35 那个出口


这里写图片描述
图5 查看 R1 的路由表

  • 接下来,交换机查找自己的 MAC 地址转换表,找到 PC6 的 MAC 地址,将数据报递送给 PC6


这里写图片描述
图6 从 PC4 ping PC6 主机

5. 专用地址

RFC 1918 指明了一些专用地址(private address),这些地址只能用于一个机构内部通信,而不能用于和因特网上的主机通信(通常就是我们说的内网)。换句话说,这些专用地址绝对不能出现在互联网上,对于互联网上的路由器,如果看到目的地址是专用地址,一律不进行转发。RFC 1918 指明的会用地址如下:

  • 10.0.0.0 到 10.255.255.255 (或记为 10/8,它又称为 24 位块)
  • 172.16.0.0 到 172.32.255.255 (或记为 172.16/12,它又称为 20 位块)
  • 192.168.0.0 到 192.168.255.255 (或记为 192.168/16,它又称为 16 位块)

上面三个地址块分别相当于一个 A 类网络,16 个连续的 B 类网络和 256 个连续的 C 类网络。

有同学会问,我主机的 IP 地址明明就是 192.168 开头的,为什么还能上网?这个话题,再讲就跑远了,如果你感兴趣,你可以自行搜索关键词:NAT 协议。

6. 总结

  • 掌握 IPv4 地址结构
  • 知道子网掩码的作用

说明:本文转自blog.csdn.net,用于学习交流分享,仅代表原文作者观点。如有疑问,请联系我们删除~