<< network_layer

Why Subnetworking

第一, IP地址的空间利用率低. 根据IP地址的原始设计, IP地址由网络号和主机号两部分构成, 分为ABC三类网络, 注意到一个A类网络可以连入的最大主机数是1677 7214, 而一个B类网络可以连入的最大主机数是65534, 然而有一些局域网根本不允许这么大的主机数, 例如10BASE-T只允许最多1024台主机, 这就造成了IP地址空间的浪费; 另外, 有一些机构虽然主机很少但是又不愿意申请一个C类地址(最大主机数254), 是由于考虑到今后的发展. 以上情况造成了IP地址空间的浪费.

第二, 给每一个物理网络分配一个网络号会使路由表太大. 我们知道路由表的每一项是从目标网络到下一条地址的映射, 一旦目的网络数过多, 则路由表会变得非常庞大, 项目的查找时间也会随之变长, 从而直接降低整个网络的性能.

第三, 二级路由仅仅区分网络号和主机号不太灵活. 举个例子, 假设一个公司申请了一段B类地址但只用了其中的一小部分, 又希望在另一个地方新开一个网络, 那么就不得不再向IP地址管理机构再申请一块地址, 这样在申请批准之前该公司都不能使用这些IP, 造成了时间的浪费. 我们希望有一种方法能够使机构自由地增加网络.

How Subnetworking

我们将原先的主机号前面几位划分出来, 称为子网号, 剩下的仍然作为主机号. 则我们称该网络被划分成了若干个子网(subnet).

(网络号, 主机号)->(网络号, 子网号, 主机号)

举个例子, 假设我们现在有一个B类网络145.13.0.0, 则其主机号有16位, 我们取其中前面的8位作为子网号, 剩下8位作为主机号, 并且人为将其划分为3个子网: 145.13.3.0, 145.13.7.0和145.13.21.0(这三个子网只是随意取的, 事实上, 如果我们有8位子网号, 一共可以构建[img]个子网, 但是一般都不会构造那么多, 而只是取合法子网号中的一小部分, 就像这三个一样).

为了告知网络实体(通常是路由器)子网划分的信息, 我们一般采用子网掩码(subnet mask)的形式, 子网掩码在网络号和主机号的部分全部置1, 这就明确地表明了哪些是网络号和子网号, 哪些是主机号. 如果我们手里有一个IP地址和该IP地址所对应的子网掩码, 则我们可以通过二者通过逻辑与操作计算出该主机所在网络的网络号+子网号. 对于我们上面划分的三个子网, 假设有一个主机是145.13.3.10, 其子网掩码是255.255.255.0, 则通过逻辑与操作可以得到该主机所在的子网是145.13.3.0.

值得注意的是, 这种子网划分仅仅在网络内部才可见, 网络外的实体并不能看见它被划分为了几个子网, 它对外仍然表现为一个网络.