之前的博客已经初步介绍了IP路由的步骤,《TCP/IP详解卷一》中花费了一章讲解,这一章提到了一些新的知识点,所以在此做一个总结。
主机也可以被配置成路由器(操作系统中有相应的配置参数),否则,主机在接收到不属于自己的报文时会丢弃该报文,路由表的每隔30s更新一次,接收到ICMP重定向报文后会立刻更新,IP层进行的选路实际上是一种选路机制,它搜索路由表并决定向哪个网络接口发送分组。这区别于选路策略,它只是决定把哪些路由放入路由表的规则。
在windows下,输入netstat -rn,可以看到路由表,下面来看看Linux下的路由表:
Destination:路由的终点。
Gateway:负责转发的路由器。
Genmask:子网掩码。
Flags:各字段意义如下:
U:路由可用。
G:这条路由到达的是路由器,若没有这个字段,表示直接相连。
H:这条路由到达的是主机,若没有设置,表示到达的是一个网络。
D:路由来自重定向。
M:路由被重定向修改。
G字段非常重要,该字段可以区分无向路由和有向路由,有向路由不会设置G字段,两者的区别如下:
无向路由:报文上的目的IP地址为目的地的IP地址,MAC地址为下一跳路由器的地址。
有向路由:报文上的目的IP地址和MAC地址均为目的地的地址(即直接相连)。
Ref:指定该路由有多少使用者(例如TCP在该路由上建立了连接)。
use iface:指定发送接口的名称。
Metric:路由算法用来确定到达目的地的最佳路径的计量标准
路由表的初始化
当一个接口在配置时,有向路由会被直接配置,对于点到点链接和环回接口,目的地址为主机,对于直连到某个网络的接口,目的地址为网络地址。
添加路由的方式:
1、使用route指令,在windows命令行下输入route,可以看到相关用法。
2、通过路由协议(只有路由器可以使用,相关知识请查看路由协议)。
3、路由发现协议。(运用ICMP路由发现报文)
若没有默认路由和匹配路由导致无法转发或是发送报文怎么办?有如下两种情况
1、发送源主机没找到路由,则会返回错误信息给应用程序。
2、无法转发,则会返回ICMP主机不可达错误给发送源。
ICMP主机和路由不可达错误
当路由器接收到不可转发(不是TTL区域为1或0,而是路由表中没有对应的路由)的报文时会返回ICMP主机不可达错误
ICMP重定向错误
当IP数据报应该被发送到另一个路由器时,收到报文的路由器就要发送ICMP重定向错误报文给发送源,只有当主机可以选择路由器发送分组的情况下,我们才可能看到ICMP重定向报文。
并不是说报文被发错,而是说发送源的路由不是最佳路由,打个比方,去A地有b、c两条路径,b比c短,而我们的主机却选择了路径c。
下面举个例子,例子来源于《TCP/IP详解卷一》
假设主机与R2在同一个网络上,主机的默认路由为R1,主机要发送报文给R2。
1、主机将报文发送给默认路由R1。
2、R1选择路由转发报文,但此时R1发现用于转发的接口和接收报文的接口一致,说明下一跳的路由器和发送源在同一个网络上。
3、R1返回ICMP重定向错误报文给发送源,修改发送源的路由表的对应路由。
何时发送ICMP重定向报文呢?
ICMP重定向报文结构:
代码数值的含义:
服务类型指的是IP头部的TOS。
ICMP重定向报文由路由器产生,不是主机,只能被主机利用,不能被路由器使用,路由器中的路由改变和路由协议有关。
ICMP路由发现报文
该报文用于设置默认路由
在引导后,主机广播或是组播路由器请求报文,报文结构如下:
路由器接收到该报文后,发送ICMP路由器通告报文给发送源,报文结构如下:
地址数:路由器地址的个数。
地址项长度:一项的字节长度(图中的路由器地址和优先级即为一项),计算公式为地址项长度*32.
生存时间:通告的地址有效的时间,单位为s。作用下面会讲。
路由器地址:发送通告报文的路由器拥有的诸多IP地址中的一个。
优先级:作为默认路由的优先级,越大表示优先级越高,默认为0, 优先级为0x80000000的路由器地址不会作为默认路由。
路由器操作
当路由器启动时,它定期在所有广播或多播传送接口上发送通告报文。准确地说,这些通告报文不是定期发送的,而是随机传送的,以减小与子网上其他路由器发生冲突的概率。一般每两次通告间隔450秒和600秒。一份给定的通告报文默认生命周期是30分钟。
生存时间的作用:当路由器上的某个接口被关闭时。路由器可以在该接口上发送最后一份通告报文,并把生存时间设为0.
除了定期发送主动提供的通告报文以外,路由器还要监听来自主机的请求报文,并发送路由器通告报文以响应这些请求报文。如果子网上有多台路由器,由系统管理员为每个路由器设置优先等级。例如,主默认路由器就要比备份路由器具有更高的优先级。
主机操作
主机在引导期间一般发送三份路由器请求报文,每三秒钟发送一次。一旦接收到一个有效的通告报文,就停止发送请求报文。主机也监听来自相邻路由器的请求报文。这些通告报文可以改变主机的默认路由器。另外,如果没有接收到来自当前默认路由器的通告报文,那么默认路由器会超时。只要有一般的默认路由器,该路由器就会每隔10分钟发送通告报文,报文的生命周期是30分钟。这说明主机的默认表项是不会超时的,即使错过一份或两份通告报文。