从IP地址说起
IP地址就是给因特网上的每一个主机(或路由器)的每一个接口分配一个在全世界范围是唯一的32位的标识符。
IP地址的编址方法共经过了三个历史阶段。这三个阶段是:
(1)分类的IP地址。这是最基本的编址方法,在1981年就通过了相应的标准协议。
(2)子网的划分。这是对最基本的编址方法的改进,其标准RFC950在1985年通过。
(3)构成超网。这是比較新的无分类编址方法。1993年提出后很快就得到推广应用。
分类的IP地址
所谓“分类的IP地址”就是将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成。
其中第一个字段是网络号(net-id),它标志主机(或路由器)所连接到的网络。一个网络号在整个因特网范围内必须是唯一的。
第二个字段是主机号(host-d),它标志该主机(或路由器)。一个主机号在它前面的网络号所指明的网络范围内必须是唯一的。由此可见,一个IP地址在整个因特网范围内是唯一的。
这种两级的IP地址可以记为:
图中的符号“∷=”表示“定义为”。
分类如下:
如图所示,图中的A类、B类和C类地址都是单播地址(一对一通信),是最常用的。
- A类、B类和C类地址的网络号字段分别为1,2和3字节长,而在网络号字段的最前面有1-3位的类别位,其数值分别规定为0,10和110
- A类、B类和C类地址的主机号字段分别为3个、2个和1个字节长。
- D类地址(前4位是1110)用于多播(一对多通信)。而E类地址(前4位是1111)保留为以后用。
近年来已经广泛使用无分类IP地址进行路由选择,A类、B类和C类地址的区分已成为历史。
从IP地址的结构来看,IP地址并不仅仅指明一个主机,而是还指明了主机所连接到的网络。
把IP地址划分为三个类别,当初是这样考虑的。各种网络的差异很大,有的网络拥有很多主机,而有的网络上的主机则很少。把IP地址划分为A类、B类和C类是为了更好地满足不同用户的要求。当某个单位申请到一个IP地址时,实际上是获得了具有同样网络号的一块地址。其中具体的各个主机号则由该单位自行分配,只要做到在该单位管辖的范围内无重复的主机号即可。
对主机或路由器来说,IP地址都是32位的二进制代码。为了提高可读性,我们常常把32位的地址中的每8位用其等效的十进制数字表示,并且在这些数字之间加上一个点这就叫做点分十进制记法( dotted decimal notation)。如图表示了这种方法,这是一个B类IP地址。显然,128..3.31比1000000001010000000111起来要方便得多。
IP地址具有以下一些重要特点:
(1)每一个IP地址都由网络号和主机号两部分组成。从这个意义上说,IP地址是一种分等级的地址结构。分两个等级的好处是:第一,IP地址管理机构在分配IP地址时只分配网络号(第一级),而剩下的主机号(第二级)则由得到该网络号的单位自行分配。这样就方便了IP地址的管理。第二,路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间以及查找路由表的时间。
(2)实际上IP地址是标志一个主机(或路由器)和一条链路的接口。当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的IP地址,其网络号必须是不同的。这种主机称为多归属主机( multihomed host。由于一个路由器至少应当连接到两个网络,因此一个路由器至少应当有两个不同的IP地址。
(3)按照因特网的观点,一个网络是指具有相同网络号 net-id的主机的集合,因此,用转发器或网桥连接起来的若干个局域网仍为一个网络,因为这些局域网都具有同样的网络号。具有不同网络号的局域网必须使用路由器进行互连。
(4)在IP地址中,所有分配到网络号的网络(不管是范围很小的局域网,还是可能覆盖很大地理范围的广域网)都是平等的。
IP地址与物理地址(MAC地址)
从层次的角度看,物理地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址(称IP地址是逻辑地址是因为IP地址是用软件实现的)。
在发送数据时,数据从高层下到低层,然后才到通信链路上传输。使用IP地址的IP数据报一旦交给了数据链路层,就被封装成MAC帧了。MAC帧在传送时使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在MAC帧的首部中。
连接在通信链路上的设备(主机或路由器)在接收MAC帧时,其根据是MAC帧首部中的硬件地址。在数据链路层看不见隐藏在MAC帧的数据中的IP地址。只有在剥去MAC帧的首部和尾部后把MAC层的数据上交给网络层后,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址。
总之,IP地址放在IP数据报的首部,而硬件地址则放在MAC帧的首部。在网络层和网络层以上使用的是IP地址,而数据链路层及以下使用的是硬件地址。在上图中,当IP数据报放入数据链路层的MAC帧中以后,整个的IP数据报就成为MAC帧的数据,因而在数据链路层看不见数据报的IP地址。
举一个例子来说明数据传输中的IP地址与MAC地址
上图画的是三个局域网用两个路由器R1和R2互连起来。现在主机H1要和主机H2通信。这两个主机的IP地址分别是IP1和IP2,而它们硬件地址分别为HA1和HA2(HA表示 Hardware Address.通信的路径是:H1→经过R1转发→再经过R2转发→H2.路由器R1因同时连接到两个局域网上,因此它有两个硬件地址,即HA3和HA4.同理,路由器R2也有两个硬件地址HA5和HA。
这里要强调指出的是:
(1)在IP层抽象的互联网上只能看到IP数据报。虽然PP数据报要经过路由器R1和R2的两次转发,但在它的首部中的源地址和目的地址始终分别是IP1和IP2.图中的数据报上写的“从IP1到IP2”就表示前者是源地址而后者是目的地址。数据报中间经过的两个路由器的IP地址并不出现在IP数据报的首部中。
(2)虽然在数据报首部有源站IP地址,但路由器只根据目的站的IP地址的网络号进路由选择。
(3)在局域网的链路层,只能看见MAC帧。PP数据报被封装在MAC帧中。MAC帧在不同网络上传送时,其MAC帧首部中的源地址和目的地址要发生变化。开始在H1到R1间传送时,MAC帧首部中写的是从硬件地址HA1发送到硬件地址HA3,路由器R1收到此MAC帧后,在转发时要改变首部中的源地址和目的地址,将它们换成从硬件地址HA4发送到硬件地址HAs。路由器R2收到此帧后,再改变一次MAC帧的首部,填入从HA6发送到HA2,然后在R2到H2之间传送。MAC帧的首部的这种变化,在上面的IP层上也是看不见的。
(4)尽管互连在一起的网络的硬件地址体系各不相同,但IP层抽象的互联网却屏蔽了下层这些很复杂的细节。只要我们在网络层上讨论问题,就能够使用统一的、抽象的IP地址研究主机和主机或路由器之间的通信。
主机或路由器利用ARP协议知道应当在MAC帧的首部填入什么样的硬件地址
地址解析协议ARP和逆地址解析协议RARP
在实际应用中,我们经常会遇到这样的问题:已经知道了一个机器(主机或路由器的IP地址,需要找出其相应的物理地址;或反过来,已经知道了物理地址,需要找出相应的IP地址。地址解析协议ARP和逆地址解析协议RARP就是用来解决这样的问题的。
逆地址解析协议RARP在过去曾起到重要作用。但现在的DHCP协议已经包含了RARP协议的功能。因此现在已经没有人再使用单独的RARP协议了。因此这里不再进一步介绍RARP协议。我们只需要了解,逆地址解析协议RARP的作用是只知道自己硬件地址的主机能够通过RARP协议找出其IP地址。
网络层使用的是IP地址,但在实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但IP地址和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系(例如,IP地址有32位,而局域网的硬件地址是48位)。此外,在一个网络上可能经常会有新的主机加入进来,或撤走一些主机。更换网络适配器也会使主机的硬件地址改变。地址解析协议ARP解决这个问题的方法是在主机ARP高速缓存中应存放一个从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)。
每一个主机都设有一个ARP高速缓存( ARP cache),里面有本局域网上的各主机和路由器的P地址到硬件地址的映射表,这些都是该主机目前知道的一些地址。那么主机怎样知道这些地址呢?
举一个小栗子:
当主机A要向本局域网上的某个主机B发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址。如有,就在ARP高速缓存中查出其对应的硬件地址,再把这个硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。
也有可能查不到主机B的IP地址的项目。这可能是主机B才入网,也可能是主机A刚刚加电,其高速缓存还是空的。在这种情况下,主机A就自动运行ARP,然后按以下步骤找出主机B的硬件地址。
(1)ARP进程在本局域网上广播发送一个ARP请求分组。下图是主机A广播发送ARP请求分组的示意图。ARP请求分组的主要内容是表明:“我的IP地址是209.005,硬件地址是00-00-C0-15-AD18.我想知道IP地址为209006的主机的硬件地址。”
(2)在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。
(3)主机B在ARP请求分组中见到自己的IP地址,就向主机A发送ARP响应分组,并写入自己的硬件地址。其余的所有主机都不理睬这个ARP请求分组,见下图。ARP响应分组的主要内容是表明:“我的IP地址是209.0.0.6,我的硬件地址是08-002B00EE0A。”请注意:虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。
(4)主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射。
当主机A向B发送数据报时,很可能以后不久主机B还要向A发送数据报,因而主机B也可能要向A发送ARP请求分组。为了减少网络上的通信量,主机A在发送其ARP请求分组时,就把自己的IP地址到硬件地址的映射写入ARP请求分组。当主机B收到A的ARP请求分组时,就把主机A的这一地址映射写入主机B自己的ARP高速缓存中。以后主机B向A发送数据报时就很方便了。
可见ARP高速缓存非常有用。如果不使用ARP高速缓存,那么任何一个主机只要进行次通信,就必须在网络上用广播方式发送ARP请求分组,这就使网络上的通信量大大增加。ARP把已经得到的地址映射保存在高速缓存中,这样就使得该主机下次再和具有同样目的地址的主机通信时,可以直接从高速缓存中找到所需的硬件地址而不必再用广播方式发送ARP请求分组。
ARP把保存在高速缓存中的每一个映射地址项目都设置生存时间(例如,10~20分钟)。凡超过生存时间的项目就从高速缓存中删除掉。设置这种地址映射项目的生存时间是很重要的。设想有一种情况。主机A和B通信。A的ARP高速缓存里保存有B的物理地址。但B的网络适配器突然坏了,B立即更换了一块,因此B的硬件地址就改变了。假定A还要和B继续通信。A在其ARP高速缓存中查找到B原先的硬件地址,并使用该硬件地址向B发送数据帧。但B原先的硬件地址已经失效了,因此A无法找到主机B。但是过了段不长的时间,A的ARP高速缓存中已经删除了B原先的硬件地址(因为它的生存时间到了),于是A重新广播发送ARP请求分组,又找到了B。
但是ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。
如果所要找的主机和源主机不在同一个局域网上,例如,在下图中,主机H1就无法解析出主机H2的硬件地址(实际上主机H1也不需要知道远程主机H2的硬件地址)。主机H1发送给H2的IP数据报首先需要通过与主机H连接在同一个局域网上的路由器R1来转发。因此主机H1这时需要把路由器R1的IP地址IP3解析为硬件地址HA3,以便能够把I数据报传送到路由器R1.以后,R1从转发表找出了下一跳路由器R2,同时使用ARP解析出R2的硬件地址HA5.于是IP数据报按照硬件地址HAs转发到路由器R2.路由器R2在转发这个P数据报时用类似方法解析出目的主机H2的硬件地址HA2,使IP数据报最终交付给主机H2。
从IP地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知IP地址的主机或路由器进行通信,ARP协议就会自动地把这个P地址解析为链路层所需要的硬件地址。
下面我们归纳出使用ARP的四种典型情况。
(1)发送方是主机,要把IP数据报发送到本网络上的另一个主机。这时用ARP找到目的主机的硬件地址。
(2)发送方是主机,要把IP数据报发送到另一个网络上的一个主机。这时用ARP找到本网络上的一个路由器的硬件地址。剩下的工作由这个路由器来完成。
3)发送方是路由器,要把I数据报转发到本网络上的一个主机。这时用ARP找到目的主机的硬件地址。
(4)发送方是路由器,要把IP数据报转发到另一个网络上的一个主机。这时用ARP找到本网络上的一个路由器的硬件地址。剩下的工作由这个路由器来完成在许多情况下需要多次使用ARP。但这只是以上的几种情况的反复使用而已。
为什么不直接使用MAC地址(硬件地址)
由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此由用户或用户主机来完成这项工作几乎是不可能的事。但统一的IP地址把这个复杂问题解决了。连接到因特网的主机只需拥有统一的IP地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为上述的调用ARP的复杂过程都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。
因此,在虚拟的IP网络上用IP地址进行通信给广大的计算机用户带来很大的方便。
参考: