iCynosure.NET

我喜欢.NET,仅此而已

博客园 首页 新随笔 联系 订阅 管理

看了Jon C.Snader先生的Effective TCP/IP Programming,觉得大有收获。我试着将其中的核心以及自己的理解解释给大家。我的水平比较低微,但这正好为初学网络的朋友提供一些切入点,因为理解我的文章大概不会有什么问题。好的,接着便来讲解正题。

学一个东西我们总要问为什么,子网掩码谁不知道,谁不会用,但是我们还是要问一句:Why We Use Subnet Mask。

还是稍微来回顾一下IP Address吧,我们知道IPv4总共有5类地址:class-A,class-B,class-C,multicast和reserved。他们的结构如下,具体的细节恕不赘述:

id Network ID Host ID

有127个A类地址,每个A类地址具有2^24台主机。
有16384个B类地址,每个65534台主机
他们对应了拥有大量主机数的巨型网络。等等,这和subnet mask有什么关系?

两个问题:
首先,把单一的这类地址分配给单一的用户会造成大量的浪费。
其次,路由表难以维护。因为没有办法用单一的hub连接所有的这些主机。
设想我所在的实验室有一个B类地址,而这些机器分布在两个物理子网上,如下图:
倘若H1要和H2通信,这个自然没有问题,只需要将H2的IP地址映射到其物理地址。那么H1要和H3说话呢?这就有麻烦了,因为处于不同的子网,H1并不知道H3在什么地方,这时需要通过R1中转。可是R1怎么知道必须向R2中转?如果说我们还有R3,R4...?

问题出现在所有的主机所在的网络ID都是一样的。不引入新概念的解决办法可以是让每一个R的路由表中都保留一份所有主机的条目,但这将成为网管们的噩梦。

解决办法2:给两个子网分配不同的地址,当他们所属的网络ID不同的时候,这些问题也就解决了。只是他并没有解决根本的问题。

最终,我们想到并不一定要在物理上真正赋予某一个子网以网络ID,可以通过逻辑子网的概念将他们划分在一起。这就是subnet mask概念的引入。通过mask,我们做到了在逻辑上延伸了Network ID,让他可以按照我们的需要来划分子网。在我们这个情景中的怎么使用subnet mask来解决具体问题我就不介绍了。

刚才我们使用mask实现了subnet,那么接着我们来进一步思考,如果中国电信有那么多的主机,但是却只能分到1个B类地址和若干个C类地址,怎么把多于254台主机在逻辑上划分到一个子网内?即实现一个supernet?

实现的机理是一样的,同样是通过mask来逻辑上更改Network ID,只是一般用的都是增长,这次是缩减。这个操作的专业名称叫做CIDR:classless interdomain routing,也称作“supernetting”。其过程请参考subnet mask的使用。那么如果对路由有概念的朋友一定会问,怎么防止网络ID解析的二义性?比如说,我的ip是200.10.5.33,路由器上有两个条目:200.10.4.0with255.255.252.0 和 200.10.0.0with255.255.0.0,结果两个都匹配,这是很容易出现的,因为我们缩短了网络ID,撞车的机会自然增加了。为了防止这种情况,最终使用的是匹配的最长的条目,比如上述的200.10.0.0with255.255.0.0的条目匹配的仅仅是16位,而200.10.4.0with255.255.252.0匹配的是22位,所以采用200.10.4.0。

要考虑更detail的内容,我建议你去看看RFC1518[Rekhter and Li 1993],因为我这里讲述的都是概念。

posted on 2004-04-08 20:57  iCynosure  阅读(1793)  评论(1编辑  收藏  举报