为什么有了MAC地址还要有IP地址?

我想先从最常听见的名词之一IP来开始这一节,同样是用来表示主机的,既然有了唯一的MAC地址为什么还要再弄一个IP地址?其实我觉得这个就和身份证号码和你的名字的关系是一样的:

  • 身份证号码一串数字很长,除了前几位和生日那几位就没有什么特别的规律,难以记忆。
  • 身份号码上可能除了能看到你是哪个地方的(而且还是很不直观的),生日之外,很难有能反应你来自哪个家族等一些有组织的信息。
  • 名字短小并且至少可以反映出一部分你的组织信息,便于记忆也好称呼。
    MAC地址与IP地址和这个道理差不多,MAC地址一串16进制数字并且极端的没有规律。你不可能通过MAC地址看到一个主机和另外一个主机到底有没有联系,有什么联系,没有层次感也不便于管理。而IP地址就可以克服这个困难,通过合理的编码方式自然可以组织成肉眼方便可见的或者通过简单计算就可以获得的主机间的简单关系。那么就从IP地址的分类来认识一些有关IP的知识好了。

A,B,C,D,E类

IP地址在当今分为IPv4,和IPv6,v4就是第四版,v6就是第六版,为什么没有1,2,3和5呢?因为这些都是没有公开发表过实验版本。IPvx,有一个也不知道怎么形容的故事,有兴趣的可以去搜一下IPv9,看完之后五味杂成。

IPv6现在应该说是在初步普及阶段,因为所有IPv4地址已经在2011年分配完毕。一般对于IPv4的地址都会用三个点隔开的四个数来表示,这种标识方法是有意义的,这个意义就在于这样可以清晰的了解IP地址的层次。看到这个SMB包里两个IP地址分别是:

 IP地址  - 图1

IPv4地址一共有32位,也就是4个字节。上面的这种格式被称之为点分十进制,每个由点隔开的部分使用一个十进制数表示,范围从0-255。但是有一点是要搞清楚的,这只是为了方便人的阅读才标识成的格式,计算机是不知道啥点不点的,对于计算机,只是一串0和1而已。这一点也可以从数据包中找到,c0 a8 c7 85 对应砂锅面就是192.168.199.133,同样后面紧跟的四个字节就是Dst的IP地址:

 IP地址  - 图2

前面说了,采用IP地址的原因一个是为了更加直观的表示,第二个是为了能够方便的进行层级分类。最初的分类方式很简单,前8位高字节标识网络号,后面剩下的标识主机号,按照这种方法,比如说155.0.0.10,那么一眼就能看出来这是第155号网络里面的第10号主机。这样随着网络规模的不断发展,由于一个8字节最多也只能包括256个网络号(其实扣除特殊作用的0和255,只有254个数字可用),很明显这个数目太少了,所以聪明的设计者们又想出了更加合理的既能和已存在的IP地址空间兼容又更加合理的方法。在这种方法利用前缀把IP地址分为5类,同样延承采用网络号和主机号的概念,具体方案可由下面的表格表示:

类别前缀网络数量主机数量
A类0128(8位用来标识网络)16,777,214(24位)
B类1016,384(16位)65,534(16位)
C类1102,097,152(24位)254(8位)
D类1110未定义未定义
E类1111未定义未定义

就像我在第一篇里说过那样,在网络的设计里,有很多不经意但是却很有设计的东西,比如说上面这个表里的前缀,为什么B类地址不用01来表示?因为这样假如一个计算机程序读入了前缀,发现是第一位是0,那么他还需要再读入第二位才能判断是不是B类地址,而且这样还会出现很严重的由于不合理的编码而造成的空间浪费。但是如果是按照上表的方式,那么只要在高字节读入0,就知道一定是一个A类地址,如果是1,再读入下一位,如果是0就是B类地址并停止操作,依次类推。我猜这种思想应该是从hoffman编码而来,又不得不说一句,数学真的是一切自然科学,工程技术的教父啊。

因为要考虑到和最原始的单纯用8位表示网络号兼容,所以在分类结构中,至少要用前8位表示网络号。那么这个网络数量和主机数量是怎样算出来的呢?以A类地址为例:

  • 第一位为0表示A类的地址,第一位为1标识剩下的B,C,D,E类地址,考虑到前8位表示网络号,那么2的8次方除以2就是128了。
  • 前8位表示网络号,那么后24位就是表示主机数量了,2的24方应该是16,777,216,为什么表中是16,777,214呢?因为在A类地址中全0和全1都有特殊的用处,不会分配给单独的主机。全0主机号一般表示网络地址,全1标识广播地址,广播的概念也会在后面详细的叙述。
    这里还要特殊说明的是D类地址和E类地址,D类地址被规定用来作为组播地址,后面也会详述,而E类地址作为保留使用。大部分的计算机设计里都会有保留这个概念,也是设计人员为了日后的扩展费尽了心力。

按照这个方法,其实很容易的就能得出这5类地址一个范围:

类别IP范围
A类0.0.0.0-127.255.255.255
B类128.0.0.0-191.255.255.255
C类192.0.0.0-223.255.255.255
D类224.0.0.0-239.255.255.255
E类240.0.0.0-255.255.255.255

虽然前面说全0或者全1的不是给主机分配的ip,但是它们仍然是合法的IP地址,如果你不清楚这个范围是怎么算出来的,那么把他们转化成二进制再对应第一个表就一目了然了。按照这个范围,很容易看到我们SMB截图里面的地址是一个C类地址。

除了上面说的这些,一些特殊的IP地址被保留了用作特殊的用途,你可以在RFC3330里面找到他们。

掩码

掩码,英文原文是mask,这个词也有面具的意思,我觉得好恰当啊。面具嘛,可以把一些地方遮去而露出一些关键部分,这要是掩码的作用。

上面描述了不同类别的地址和每类地址所能蕴含的主机数量,但是这样的两级结构还是不够方便,比如B类地址,一个网络号下面可以有6万多个地址,这个数量还是太多了。所以,为了更加便于管理,设计者们又提出了子网的概念,也就是使用主机号甚至网络号的一部分来作为子网号。比如一个C类地址,192.168.199.138,我们第一个子网号xxx.168.199,那么这个138就是这个子网的第138号主机。这样无论对于人眼阅读还是网络设备的假设,都更加的清晰。

掩码严格的说其实不是一个计算机网络的概念,他是一个计算机科学里面的概念。在网络里,利用掩码可以很快的计算出子网号和主机号,比如用上一节的例子,为了能快速的计算出主机号,我们只需要构造一个255.255.255.0的掩码,也就是前3个字节全1。这样如果和地址192.168.199.138进行与运算,那么主机号就会被过滤掉,得出子网号是192.168.199.0。因为位运算在计算机里是很快的,所以如果在路由选路的时候就可以很快的得到目的子网号从而选择正确的路由。

IPv6

对于IPv6,虽然是现在大力推广的项目,但是我接触的很少,所以也不好在这里瞎扯淡。但是我知道两点,第一个是IPv6是用128位的数表示一个网络地址,第二个就是任何一个IPv4地址经过按照规则的转换都能转化成为一个IPv6的地址。这一节待我以后真正的领悟了再补上吧。