闲聊计算机IP网络

记得刚上第一节《计算机网络》课的时候,下课时就记得网络分为通信子网和资源子网,当时觉得这是多么的教条,时隔多年以后,再来回味这个通信子网和资源子网的划分,还真是能牵扯出来不少东西呢...

通信子网和资源子网的划分是横向的划分,而纵向的划分就是诸协议栈。

什么是通信子网呢?通信子网就是负责网络交通的子网,它的任务就是路由寻址。什么是资源子网呢?资源子网中存储资源数据。一般而言,处在末梢端的网络都是资源子网,主干部分的则是通信子网。这么解释还是太教条了,如果理解了IP地址的话,冲着这个资源子网和通信子网分类,可以洋洋洒洒上千字了...

IP地址和IP寻址

IP地址

IP地址可以分为网络位和主机位,其中网络位标识网络,用来执行IP路由寻址,主机位用来标识主机。那么很显然,IP地址的网络位就可以表示通信子网,而主机为则可以表示资源子网。

IP寻址

IP寻址的机制就是IP路由,IP理由的实质就是“局部逐跳地沿着链路向前推进”。根据目的地和当前位置的关系,IP路由的路由项可以分为四类,分别是:

1.Global路由:本机距离目的地之间需要跨越其它的路由器,其中包含路径的下一个路由器的IP地址,需要下一跳解析协议解析其链路层地址。

2.Link路由:本机距离目的地之间不需要跨越其它路由器,目的地就在连接本机的链路的另一端,其中不包含下一个路由器的地址,因为已经可以直接用下一跳解析协议直接解析目的地了。Link路由即直连路由。

3.Host路由:本机就是目的地,即数据包已经到达。本机配置的所有IP地址都会是Host路由。

4.Blackhole路由:黑洞路由,即数据包永远都到达不了目的地。

现在我们来看一下一个数据包从源头到目的地的经历。不考虑遇到黑洞的情形,基本可以分为以下的过程:

1.数据包始发,通过查找路由表发现目的地路由是一条Global路由,于是将包传递到下一跳;

2.路径上可能会持续命中Global路由多次,逐跳传递包;

3.数据包在某台路由器上匹配到了一条Link路由,直接解析目的地的链路层地址,数据包继续前进;

4.数据包匹配到一条Host路由,终于到达了目的地,该设备的第四层接收例程开始处理数据包。

为了保证上述的过程,路由器需要确保:对于Global路由,下一跳一定是Link可达的。也就是说在添加Global路由的时候,要执行一次针对下一跳的路由查找,确保查找结果是一条Link路由。当然,在支持路由递归查询的路由器上,可以不必要求下一跳一定是Link的,然而在内部,最终递归查找的结果还是Link上的下一跳。

主机标识-最后一跳

数据包在到达目的地的过程中,对于目标是逐步接近的,如果将Global路由,Link路由,Host路由来做一个排序的话,数据包在经过更后面的路由类型后,是绝对不可能在经历一次前面的路由类型的,比如数据包的路径上的路由类型匹配序列不可能是:Global,Global,Link,Global。

可以肯定的是,数据包的最后一跳的依据是一条Link路由,接下来数据包就到达了目的地。但是并不能保证它能被上层接收,因为还需要匹配一条Host路由,也就是说,目标IP地址必须是本机的一个IP地址才可以。虽然有些实现中,在上一跳的“下一跳解析协议”执行的时候,这一点就能保证了,但是标准的IP路由还是需要去匹配路由表的Host路由项。在Linux中,arp_process中,对于REQUEST,目标IP地址一定要是Local表中的Host路由项才会回复REPLY。

关于直连路由

直连路由是内核自动生成的。基本上业内没有人不知道这句话,然而关于直连路由的认识,很多人附加了一些内容,即直连路由不能手工配置。不能手工配置和不需要手工配置是完全不同的两回事。其实直连路由也是可以手工配置的。这也就是说,我们可以配置32位掩码的IP地址,这样就不会生成直连路由,然后我们手工配置一条直连路由即可。实质上,所谓的直连路由,就是指出到达某IP网段的数据包可以在路由指出的网卡上解析目标IP地址。

直连路由即Link路由,上文提到过,在添加Global路由的时候,要确保下一跳是Link可达的,这一点就是通过针对下一跳地址做路由查找来实现的,如果返回的路由不是Link路由,则添加不成功。现在我们来看一下Link路由的生成。有三种生成方式:

第一种:自动生成

当你添加了一个IP地址在网卡上,协议栈就会根据你的IP地址掩码解析出其网络ID,根据IP地址以及其路由原则,属于同一网络的所有主机必须处在同一链路内,系统会生成一条链路层路由,即直连路由。

第二种:手工添加

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/19221.html