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 , 2 24 − 1 ] 。主机号 0 和 2241 2 24 − 1 不能用作主机 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 2 14 − 1 个。

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

2.3 C 类网络地址

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

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

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

网络类别最大可指派的网络数第一个可指派的网络号最后一个可指派的网络号每个网络中最大主机数
A 272 2 7 − 2 1126 2242 2 24 − 2
B 2141 2 14 − 1 128.1191.255 2162 2 16 − 2
C 2211 2 21 − 1 192.0.1223.255.255 282 2 8 − 2

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.166, 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 地址结构
  • 知道子网掩码的作用
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值