本帖最后由 李龙超 于 2024-5-6 14:19 编辑
IP协议的任务是选择合适的路线,每当一个数据帧到达一个节点的时候,下一步要去往哪个地方,这就是路由的过程;而实际上要怎么将数据帧送到下一个节点,是数据链路层的任务。 就好比唐僧西天取经的时候,每到一个地方就要停下来问去西天下一个地方要怎么走(对应IP层),然后他就可以选择步行或者骑马继续上路(对应数据链路层)。下面我们主要了解的是如何基于现有的路由表进行路由转发,不介绍路由表的创建。 一、查看路由表 1、查看路由表的指令 Linux下查看路由表的指令是 route,Windows是 route print。下面就以Linux环境为例。 2、路由表部分字段 当前云服务器的路由表如下: 二、路由转发的宏观思路 路由转发的宏观思路是 先根据IP地址找到目标网络,然后取到目标网络的路口路由器,再将报文在内网进行转发,最终到达目的主机。 就好比我们要去上海市的世纪大道地铁站,我们的第一步是先到达上海,第二步在上海内乘坐地铁去往世纪大道。在此过程中,我们可能会需要不停地询问“到达上海应该怎么走”,路上的人无非就是两个回答,第一,给你明确地方向;第二,自己不知道,于是让你去找 熟悉路况的人。下面的两个案例分别对应了这两种情况。
三、基于现有路由表进行路由转发的过程 主机X在发送报文之前会先查询当前主机上的路由表,看一下要发给哪个路由器,这就属于局域网通信的内容了,感兴趣的可以参考:局域网通信的过程 我们假设主机X将报文发给了路由器A,下面展示的是路由器A的路由表,后面通过两个案例来了解 路由器A收到报文以后,如何将报文转发出去的。 1、案例一:目标IP为192.168.56.3 路由器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) 2、案例二:目标IP为 202.10.1.2 跟第一条路径的子网掩码按位与得到网络号为192.168.56.0,不匹配,比对下一条路。 跟第二条路径的子网掩码按位与得到的网络号也是192.168.56.0,不匹配,比对下一条路。 ... 结果到最后发现,所有的路都不匹配。换成现实中的例子就是问的人都不知道路,于是就会让我们去找熟悉路况的人。这里也是同理,路由器A通过默认接口,也就是最后一条路径,将你的报文从eth0发送给路由器(192.168.10.1),即让这个报文去查其他路由器的路由表。 补充:将子网掩码与目标IP按位与,其实就是将目标IP以同样的划分方式转换成对应的网段,以此来比对网段是否匹配。就好比我们在比较二进制和十进制的时候,一般都是先将二进制按照对应的规则,转化成十进制,然后再比较。 四、目标IP为127.0.0.1的路由转发 我们经常会用到这个IP来表示当前主机,路由转发的过程也很简单,其实就是报文在向下封装的时候,到达网络层查询路由表发现,目标IP就是当前主机,此时就不会继续向下封装,而是直接向上交付。 |