目录
IP协议的任务是选择合适的路线,每当一个数据帧到达一个节点的时候,下一步要去往哪个地方,这就是路由的过程;而实际上要怎么将数据帧送到下一个节点,是数据链路层的任务。
就好比唐僧西天取经的时候,每到一个地方就要停下来问去西天下一个地方要怎么走(对应IP层),然后他就可以选择步行或者骑马继续上路(对应数据链路层)。下面我们主要了解的是如何基于现有的路由表进行路由转发,不介绍路由表的创建。
Linux下查看路由表的指令是 route,Windows是 route print。下面就以Linux环境为例。
当前云服务器的路由表如下:
字段名 | 字段含义 | 备注 |
Destination | 目标网段 | 代表当前设备所直接连接的目标子网(路由器或者主机)。 |
GateWay | 下一跳的IP地址 | * 表示直接连接的是主机,xx.xx.xx.xx表示直接连接的是路由器 |
Genmask | 子网掩码 | 无 |
Flags | 标志位 | U可以理解为Using,表示当前跳转路径是有效的,即使用中;G可以理解为GateWay,表示下一跳的设备是一个路由器,如果没有G标识,说明下一条直接去往目标子网,无需经过路由器转发。 |
Iface | 接口名 | 这个接口用于收发数据,当前服务器只有一个接口来收发数据 |
路由转发的宏观思路是 先根据IP地址找到目标网络,然后取到目标网络的路口路由器,再将报文在内网进行转发,最终到达目的主机。
就好比我们要去上海市的世纪大道地铁站,我们的第一步是先到达上海,第二步在上海内乘坐地铁去往世纪大道。在此过程中,我们可能会需要不停地询问“到达上海应该怎么走”,路上的人无非就是两个回答,第一,给你明确地方向;第二,自己不知道,于是让你去找 熟悉路况的人。下面的两个案例分别对应了这两种情况。
主机X在发送报文之前会先查询当前主机上的路由表,看一下要发给哪个路由器,这就属于局域网通信的内容了,感兴趣的可以参考:局域网通信的过程
我们假设主机X将报文发给了路由器A,下面展示的是路由器A的路由表,后面通过两个案例来了解 路由器A收到报文以后,如何将报文转发出去的。
Destination | GateWay | Genmask | Flags | Metric | Ref | Use | Iface |
192.168.10.0 | * | 255.255.255.0 | U | 0 | 0 | 0 | eth0 |
192.168.56.0 | 10.1.2.1 | 255.255.255.0 | UG | 0 | 0 | 0 | eth1 |
127.0.0.0 | * | 255.0.0.0 | U | 0 | 0 | 0 | lo |
default | 192.168.10.1 | 0.0.0.0 | UG | 0 | 0 | 0 | eth0 |
路由器A收到一个数据帧以后,路由器也有自己的网络协议栈,需要先向上交付,因为目标IP在网络层的报头中,我们需要先去掉数据链路层的报头才能取出网络层的报头。假设路由器A的网络层已经拿到了目标IP地址(192.168.56.3),根据路由转发的宏观思路,我们需要先找到目标网段。
先将目标IP(192.168.56.3)跟第一条路径的子网掩码(255.255.255.0)按位与得到网络号(192.168.56.0),这么做的目的是判断目标IP所处子网 是否等于 当前路由器直接相连的子网。目标所处子网是192.168.56.0,而第一条路径直接连接的网段是192.168.10.0,很显然地址不一致,然后比对下一条路。
将IP地址(192.168.56.3)跟第二条路径的子网掩码(255.255.255.0)按位与得到网络号,网络号为 192.168.56.0。第二条路径直接相连的网络是192.168.56.0,网段一致,说明就是这个方向。然后路由器A就会通过对应的接口eth1发送给下一个路由器(10.1.2.1)
跟第一条路径的子网掩码按位与得到网络号为192.168.56.0,不匹配,比对下一条路。
跟第二条路径的子网掩码按位与得到的网络号也是192.168.56.0,不匹配,比对下一条路。
...
结果到最后发现,所有的路都不匹配。换成现实中的例子就是问的人都不知道路,于是就会让我们去找熟悉路况的人。这里也是同理,路由器A通过默认接口,也就是最后一条路径,将你的报文从eth0发送给路由器(192.168.10.1),即让这个报文去查其他路由器的路由表。
补充:将子网掩码与目标IP按位与,其实就是将目标IP以同样的划分方式转换成对应的网段,以此来比对网段是否匹配。就好比我们在比较二进制和十进制的时候,一般都是先将二进制按照对应的规则,转化成十进制,然后再比较。
我们经常会用到这个IP来表示当前主机,路由转发的过程也很简单,其实就是报文在向下封装的时候,到达网络层查询路由表发现,目标IP就是当前主机,此时就不会继续向下封装,而是直接向上交付。