系列回顾
名词解释Subnetting
Subnetting 是将一个大的网络分成若干个独立的子网络的动作, 叫做subnetting.
Subnet Mask 子网掩码
在上一篇系列文章当中, 提到了两个概念 Network ID 和 Host 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.100
和 9.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是一种能够转发网络数据的网络硬件设备. 对于路由来说, 它至少有两个网络接口, 分别连接两个不同的网络.
一般来说, 基本的路由操作是这样的:
- 路由器接收到其中一个网络接口的数据包
- 路由器检查这个数据包的目标IP地址
- 路由器查看routing table来获取这个数据包的目标网络
- 路由器讲这个数据包从离目标网络最近的接口转发
再举一个例子
现在一个路由器, 他的两个网络接口接在网络A和网络B上. 网络A的地址空间是 192.168.1.0/24
; 网络B的地址空间是10.0.0.0/24
.
如果设备A要把一个数据包发送到设备B, 那么它的操作过程是这样的:
- 因为设备B的IP地址是
10.0.0.10
并不在网络A的子网内, 所以设备A将数据包发送到路由器. - 路由器收到数据包之后, 讲Etherframe的其他内容去掉, 只留下IP Datagram的内容.
- 路由器验证IP Header来获取这个数据包的目标IP地址, 也就是
10.0.0.10
- 路由器查询routing table, 得到网络B的是这个数据包的目标网络.
- 因为网络B是直接连接在路由上的, 所以大概率在ARP表中可以得到设备B的MAC地址.
- 路由器将重新制作一个数据包, 把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就是用来记录最短路径的.