首页 > 代码库 > 信息在网络中的漫游(二)

信息在网络中的漫游(二)

上一篇文章主要介绍了公共因特网的拓扑,或者说物理结构,那么这一篇文章要介绍IP——就是网络中每个节点或者端系统的识别问题。现实中,道路的端点是一个个村庄或城市,它们都是有名字的,但是网络世界中,用名字来标示每一台主机是一件不太明智的事,于是人们发明了IP这种方式来识别主机。

IP是二进制数字,共有32位,理论上可以有2的32次方(大约40亿)个不同0、1组合,于是可以标示这么多主机,每个组合就是一台主机的名字。如下图是一个IP的例子:

11000001 00100000 11011000 00001001

显然,这样不方便记忆以及书写,于是人们发明了点分十进制法来做替换,具体就是,把每八个位用一个十进制数字代替,然后十进制数字之间用点号分隔,于是上面那个IP就可以表示为:

193.32.216.9

不难想象,路由器既然要做中转站,必然要与多台主机/端系统相连,路由器伸出多条链路连接到各个主机,每个主机被分配一个IP地址。那么路由器的IP是怎样的呢?实际上路由器有多个IP或者说它本身是没有IP的,因为IP是一个与接口相关的概念,而不是一台机器。所谓接口就是一台机器和一条链路的交接处。表面上看,一条链路连接的是两台机器,但深入到机器内部,这条链路的两端却是机器里的网卡(在路由器中又称线路卡)。所以接口的本质是这块网卡,IP是与这块网卡绑定在一起的。每个网卡具有一个全球唯一的IP,于是每个端系统就可以被唯一定位或者识别出来,但是路由器却有很多个网卡,所以可以说有很多个IP,也可以说这些IP都不代表这个路由器本身。其实定位路由器本身也是没有什么意义的,下面我们就会知道。

首先要了解一下,路由器本身是如何工作的以及每台端系统是如何得到自己的IP的。路由器内部维护着一个转发表,其内容就是IP和自己接口的映射关系。IP是指该路由器接收到的分组的目的IP,而内部的每块网卡(即接口)都是有编号的。举个例子:

192.0.0.1 ———— 1 —————— A

192.0.0.2 ———— 2 —————— B

192.0.0.3 ———— 3 —————— C

192.0.0.4 ———— 4 —————— D

路由器根据自己的转发表来转发分组,上图中的转发表决定了目的IP是192.0.0.1的分组要发送到1号接口,然后一号接口通过一条链路与主机A相连,然后A的IP就顺理成章的成为192.0.0.1,同理B、C、D的IP依次是192.0.2/3/4。

看到这里也许你就能明白,所谓IP不过就是路由器转发表中的一个数字,或者说,你的IP其实不是你的,你自己是用不到它的,只有你的路由器才需要它。路由器需要一个IP来决定把一个分组扔到哪个接口(也就是链路)。或许有一条链路把你的主机和路由器的一个接口固定起来,但是这并不意味着你的IP也是固定的,因为路由器随时可以改变转发表,修改掉你的路由器接口和IP之间的映射关系。比如大学时代,我们宿舍每个人的桌子底下都有一个网线插口,这个插口肯定通过一条链路和学校路由器的某个接口固定,但是我发现自己电脑的IP并非是固定的。

小结:IP的决定权不在端系统手中,而在与它相连的那台路由器手中。


上面例子中的那台路由器的工作还是非常低级的,因为每个接口直接连接了一台端系统,或者说该路由器中转发表中的接口编号对应的是一个个再具体不过的IP。实际上真正的路由器是不屑于干这种活儿的,因为太大材小用了。现实世界中,这种活儿往往由以太网交换机或集线器承担,以太网是局域网的一种实现思路。为什么说大材小用呢?因为路由器转发表中接口编号对应的其实不是具体的IP,而是IP的一个范围,如下所示:

192.0.0.0~192.0.0.63 ———— 1 —————— A

192.0.0.64  ~ 192.0.0.127 ———— 2 —————— B

192.0.0.128 ~ 192.0.0.191 ———— 3 —————— C

192.0.0.192 ~ 192.0.0.255 ———— 4 —————— D

这样,路由器接收到一个分组,会检查它的目的IP出于哪个范围,然后扔到对应的接口。注意,这个图中,A~D不再是具体的端系统了,而是局域网中的交换机或集线器,它们收到分组后再继续决定把分组发送到哪个具体端系统。

这样做的好处就是:减轻了路由器的负担,它的转发表不需要维护那么多的映射。


现在我们把目光集中到上例中IP范围上,我们把192.0.0.0~192.0.0.63转换成二进制就是:

11000000 00000000 00000000 00000000 ~ 11000000 00000000 00000000 00111111

可以发现,处在这个范围中的数(二进制),其前26位是相同的,都是11000000 00000000 00000000 00,只有后面六位不一样。人们发明了一种方法来表示这个有规律可循的范围,即:192.0.0.0/26,26表示这一范围的地址的前26位都是相同的,称之为IP地址的前缀;192.0.0.0是这个范围的起始IP。

同样道理,192.0.0.64  ~ 192.0.0.127表示为192.0.0.64/26;192.0.0.128 ~ 192.0.0.191表示为192.0.0.128/26;

192.0.0.192 ~ 192.0.0.255表示为192.0.0.192/26。

那么现在,路由器的每个接口连到一个交换机(交换机本身没有IP的)上,交换机再与各个端系统相连,并且与这个交换机相连的每个接口都有相同的前缀:各个端系统就不必多言了,为什么路由器上的那个接口也要保持相同的前缀呢?虽然前面说过它也有自己的IP,但没说具体是怎样的。实际上,这个路由器的接口和交换机那一头的端系统形成了一个子网,同一子网内的所有接口必须具有相同的前缀,这样我们就可以给出这个子网的地址,也就是上面所说的起始IP(注意到起始IP的末尾几位都是0,国际规定,一个IP除去前缀后的末尾几位若都是0,则这个IP代表这个子网的IP,且该IP不能用做子网内任意一台端系统的IP)。

再来谈谈这个路由器接口的IP,其实我觉得可以把它看做子网派到路由器内部的外交官,是为了子网内部的其他端系统方便寻找路由器而设定的。从上面的分析中我们可以看到,在路由器内部是不会用到这个接口的IP的,因为路由器直接给了它一个内部编号。


好了,上面的那台路由器算是入门级的了,它下面有4个子网(而且网段很平均),这当然是一种理想化的状态,现实中可能要复杂的多。可以想到,这台路由器下面的4个子网其实构成了另一个大一点的子网,而这台路由器就是高级一点的交换机,这个大一点的子网的地址不难看出就是192.0.0.0/24,前24位是相同的。

子网是一个相对的概念,我们也可以说真个中国的网络也是一个子网,因为它上面也还有高级路由器。显然,子网的范围越大,其前缀越短;子网越小,前缀越长。ISP们其实就是拿到了某个子网的分配权,然后出卖IP地址。越高级的ISP管理的子网的范围越大。那么谁是终极大BOSS呢?哈哈,ICANN,DNS也是归他管的,谷歌一下吧。


还有一个问题:在最底层的那种路由器中(也称为网关路由器),为什么需要一个交换机才能与各个端系统相连呢?难道不能从一个接口伸出很多条线路然后连接各个主机?呃,这个问题我也还没想明白。。

信息在网络中的漫游(二)