关于IP网段间互访的问题——路由是根本

来源:互联网 发布:查询淘宝小号信誉 编辑:程序博客网 时间:2024/05/04 23:39

文章出处:http://blog.csdn.net/dog250/archive/2010/02/09/5303291.aspx

 

    之所以IP网段间可以互相访问,完全靠的就是路由,因此路由是IP通信的根本。IP是机器可以进行通信的资格证书,而路由决定该机器的数据可以到哪以及如何到,没有路由就不可能有IP网络。IP其实就是一个标号,而IP路由就是精心设计的基于这种标号的寻址机制,这种逻辑上的解决方案使整个世界连接在了一起从而成为一个整体。前面说过,IP提供了一个逻辑的物理层,而传输层就是逻辑上的链路层,那么整个IP网络就是一个逻辑网络,这个逻辑网络丝毫不会在意下面的物理网络,也就是说不会在意下面的链路层和物理层。逻辑网络和下面的物理网络比如以太网建立关系的时候,就是给网卡分配IP地址的时候,毕竟IP网络只是一个逻辑意义上的网络,想要实际传输数据还是要靠物理网络承载,将IP地址分配给网卡就是表示需要这个网卡作为IP数据传输的载体,就是需要这个网卡传输到这个IP或是从这个IP发出的数据,网卡只是一个承载层,当然可以承载多个IP的数据,就好比一辆卡车可以装载多种货物一样,一个人也可以身兼数职,这里人是物理概念,而职位是逻辑概念,职位给了一个人,这个人只是这个职位行为的执行者,具体如何执行还要看职位本身的指示,因此将IP地址给了网卡,网卡不知道如何传输IP数据,网卡的作用再次重申,就是一个承载方,它只提供物理连接的两点传输机制而已,记住是物理相连的两点,如果想让一切工作起来,那么就要靠路由,路由就是IP逻辑网络这个“职位”的规则,它指示如何传输数据

    原则上你可以给一块网卡分配任意数量的IP,然后为这些IP地址指定路由就可以了,在这块网卡上你只能指示往哪个目的IP地址的数据往哪个网口走,给这块网卡分配多个IP地址意味着这些IP可以被寻到,也就是说有数据是以这些IP地址为目的的,因此你必须保证在别的机器或者路由器上配置指向这些IP的路由,只有这样,数据才能有去有回来往畅通。每个路由记录会指示数据怎么走,走的时候还是要一步一步走的,一步一步走就是通过底层的物理承载网络走的。只要你指定了路由,那么数据就可以通信,逻辑IP网络和物理的链路层网路的关系除了承载与被承载之外其实并不大,也就是说并不是一个物理网络的IP地址也必须是一个网段的。举个例子:

将一台单网卡的Linux机器的M1的eth0配置如下两个IP(ip addr add):

eth0:

inet  192.168.0.152/24  brd  192.168.0.255  scope  global  eth0

ient  172.16.0.5/32  scope  global  eht0

然后将另一台单网卡的Linux机器M2的eth0配置如下的一个IP:

eth0:

inet  10.2.2.5/24  brd  10.2.2.255  scope  global  eht0

保证两台机器在一个物理以太网即可,然后在M2上ping 192.168.0.152不通,ping 172.16.0.5也不通,难道是因为一个物理网络的IP也必须在一个逻辑网段吗?根本不是那么回事,记住,IP逻辑网络中最重要的是路由,只要有路由就能通,和物理网络没有关系,于是为M2配置如下的路由:

172.16.0.5/32  dev  eht0  scope  link

这条路由的意义是往IP地址172.16.0.5/24的数据请走eth0,现在再试试ping  172.16.0.5,还是不行,是不是有啥问题了呢?一点问题也没有,首先说说物理网络的行为,IP逻辑网络与物理网络还有一个相联系的地方就是arp机制,如果路由配置好了,那么在路由指导下进行实际传输,但是实际传输是在物理网络进行的,因此必须要有物理地址,这就是arp的作用。以太物理网络是广播网络,因此肯定可以随意传输数据的,我们不是已经有了去往目的地址172.16.0.5的路由了吗?那么在访问172.16.0.5之前首先需要172.16.0.5的MAC物理地址,因为我们是在一个物理网络内的,因此M2的网卡就开始了询问:“谁的IP地址是172.16.0.5,请把你的MAC地址告诉我,我的地址是10.2.2.5。”然后把这条arp询问广播出去,因为是广播所有的机器都接收到这个询问,M1拥有172.16.0.5,因此M1做出回答,然后将它的MAC地址打包发给10.2.2.5,可是出事了,它不知道怎么到10.2.2.5啊,于是MAC地址便送不到10.2.2.5,于是直接阻碍了物理传输,于是就ping不通了,现在已经找到问题了,于是解决问题,就是很简单的给M1配置到10.2.2.5的路由:

10.2.2.5/32  dev  eth0  scope  link

做完了以后,再在M2上试试ping 172.16.0.5,肯定通了。

    因此可以看出逻辑网络是否连通和物理网络的结构没有关系,只和路由器有关,即使刚才哪个arp引起的逻辑网络不同的问题也和路由有关,只要有路由,一切自由连通。如果物理网络是不同的网络,比如不同的以太网,那么道理一样,只不过情况更复杂罢了,本质还是创建路由。既然可以为网卡指定IP地址,那么可不可以说IP属于网卡呢?不能,网卡只是传输媒介罢了,IP是属于主机的,IP是提供给应用的一个逻辑概念,并不是网卡的内秉属性,还是以卡车为例,车上的货物是物主的而不是卡车的,以人的职位为例,职位是属于国家机器的而不是属于人的,人只是它的执行代理,这个人不干了还可以换人,但是该职位永远属于国家机器。

    一个古老的问题就是路由器和交换机的区别,按照这种逻辑网络和物理网络的理解,路由器就是指示IP数据如何走的机器,交换机指导物理数据帧怎么走,它只能提供物理连接的两点之间的物理传输机制,其实路由就是一个逻辑上的交换机,它的层次更高罢了。如果把路由当作寻址来理解的话,物理网络也有一个路由机制,交换机中也有一个“路由表”,那就是交换机学习到的MAC地址和端口的映射关系。虽然路由需要人为指定,但是有一种路由器确是在为网卡指定IP时自动生成的,这就是链路层发现的路由,该路由指导了和指定IP为一个网段的数据包该怎么走。规范将这个“显然”的事实作为一条自动路由生成了,规范将IP地址存在相同部分的主机作为一个IP网段,一般的,导线直接相连的两个网口是一个网段的,事实上这已经成了约定,于是协议就会认为这个网口的那一端一定和本网口指定的IP是一个网段的,于是就有了链路层自动发现路由一说,含义就是:到和本网口同一IP网段的数据一定从本网口出去!这初看起来就是事实,难道不是吗?我们不都是这么配置网络的吗?很不幸,这不是事实。看看我刚才举的那个例子吧,那么混乱的配置,几乎没有在同一网段的地址,竟然ping通了!这就印证了另一个真正的事实,就是IP网络的连通在于路由而不是别的,协议自动生成的那条链路层路由其实是为了方便而不是真的必要,比如把上述混乱配置的例子中的链路层自动路由删除,照样可以ping通,其实那种混乱的配置下,我们根本就不用自动的链路层路由,那条路由是为常规配置准备的。仔细看看链路层路由,它实际上是借用了物理网路的方便,因为常规上尽量把一个IP逻辑网段映射到一个物理网段,所以可以借用这个常规的假设,因此叫做链路层路由。真正纯粹意义的IP逻辑网和物理网是没有关系的,不应该有上述的网段一致映射,但是规范中建议了那种映射。上面的混乱搭配的例子才是真正理论上的IP逻辑网络,可是很不实用,但是对于理解概念十分有用。