网络基础知识(四) 子网与路由

系列回顾

名词解释Subnetting

Subnetting 是将一个大的网络分成若干个独立的子网络的动作, 叫做subnetting.

Subnet Mask 子网掩码

在上一篇系列文章当中, 提到了两个概念 Network IDHost ID. 但是, 当网络被分成若干个子网的时候, 我们就需要一个新的概念来定位子网, 那就是 Subnet ID. 大家都知道, 32位的IP地址已经被全部用来表示Network ID 和 Host ID了, 并没有留位置给Subnet ID, 所以当有子网的时候, Host ID的一些字节需要用来表示Subnet ID. 这样, 一个32位长度的IP地址就可以准确地表示目的地了. 在Internet层面来说, 核心路由只关心Network ID, 然后把datagram送到相应的网关路由; 相应的网关路由会把datagram送到相应的节点或者其他路由. 最后Host ID会被最后一个路由用来把datagram送到对应的节点或者设备上.

那么Subnet ID是怎么被计算出来的呢? 那就是通过 subnet mask 被计算的. Subnet Mask跟IP地址一样, 长度都是32位. 为了跟清楚的说明 subnet mask, 我将用subnet mask和ID地址对应起来说.

假设现在有一个IBM公司的IP地址, 9.100.100.100, 如果将这个IP地址用二进制的形式表示出来, 那么就是 1001.1100100.1100100.1100100; 需要注意的是, IP地址是32位的, 也就是4个octet, 所以当一个octet不满8位的时候, 需要补0. 所以, 这个IP地址应该表示成 0000 1001.0110 0100 0110 0100.0110 0100

一个常用的subnet mask, 255.255.255.0, 用二进制表示, 就应该是1111 1111.1111 1111.1111 1111.0000 0000. 当我们需要计算子网ID的时候, 只需要将IP地址和子网掩码做AND逻辑运算, 得出的结果就是子网ID. 换句话说, 如果我们需要知道9.100.100.1009.100.100.101是否在同一个子网当中, 我们只需要做AND逻辑运算, 得出结果都是 0000 1001.0110 0100. 0110 0100. 0000 0000. 那也就意味着两个IP地址同属于同一个子网.

对于IP地址和子网掩码, 表示方式还有一种. 对于subnet mask 255.255.255.224来说, 它的二进制表示方式是1111 1111.1111 1111.1111 1111. 1110 0000. 开头有27个1, 通常这个subnet mask也会表示成 9.100.100.100/27.

Routing

网络的核心是Routing. 通过Routing, 使得数据在网络中能从一个节点传输到另一个节点.

Router 路由器

Router是一种能够转发网络数据的网络硬件设备. 对于路由来说, 它至少有两个网络接口, 分别连接两个不同的网络.

一般来说, 基本的路由操作是这样的:

  1. 路由器接收到其中一个网络接口的数据包
  2. 路由器检查这个数据包的目标IP地址
  3. 路由器查看routing table来获取这个数据包的目标网络
  4. 路由器讲这个数据包从离目标网络最近的接口转发

再举一个例子

现在一个路由器, 他的两个网络接口接在网络A和网络B上. 网络A的地址空间是 192.168.1.0/24; 网络B的地址空间是10.0.0.0/24.

如果设备A要把一个数据包发送到设备B, 那么它的操作过程是这样的:

  1. 因为设备B的IP地址是10.0.0.10并不在网络A的子网内, 所以设备A将数据包发送到路由器.
  2. 路由器收到数据包之后, 讲Etherframe的其他内容去掉, 只留下IP Datagram的内容.
  3. 路由器验证IP Header来获取这个数据包的目标IP地址, 也就是10.0.0.10
  4. 路由器查询routing table, 得到网络B的是这个数据包的目标网络.
  5. 因为网络B是直接连接在路由上的, 所以大概率在ARP表中可以得到设备B的MAC地址.
  6. 路由器将重新制作一个数据包, 把IP Datagram封装起来, 发送给设备B

看到这里, 可能会出现的疑惑是, 为什么路由器需要重新封装一个数据包? 用原来的数据包不行吗? 答案是 不行. 原因很简单: 在第一步时, 设备A判断目标IP地址不在本地子网内, 所以他讲Ethernet Frame里面的目标MAC地址设置成路由器的MAC地址. 所以, 如果在第六步的时候, 路由器不重新制作数据包, 那么这个数据包将会被丢弃, 因为目标MAC地址与设备B的MAC地址不一致. 同样的, 发送者的MAC地址也会被更改成路由器的MAC地址.

在第六步封装的时候, 还需要注意一个地方, 那就是TTL字段会自减1, checksum也会被重新计算.

Routing Table 路由表

一个最基本的路由表由4列组成

  • Destination Network 目标网络
  • Next Hop
  • Total Hops
  • Interface

Destination Network中储存着路由知道的所有Network, 内容就是Network ID和子网掩码. Next Hop储存着路由器连接着的Network ID和子网掩码. Interface字段记录了每个接口的用途. Total Hops是路由表中最重要的一个字段. 在一个复杂的网络中, 节点A到节点B点路径不止一条, 一般来说, 路由器会选择最短的路径(为了减少延迟); 但是这个最短路径可能会变, 比如说中间一些路由器挂掉了. Total Hops就是用来记录最短路径的.