tcp/ip学习笔记--第9章 ip routing(选路)
参考:
https://download.****.net/download/qq_31567335/10213200
感觉这章比较难,虽然用心读了很久,但是很多细节还是没有理解清楚。我们都知道,一个ip数据包是通过路由器,逐跳发往目的地的。这一章,讲的就是如何选择下一跳路由器的知识。首先讲了选路原理,简单来说是通过维护一张路由表,并在选路的时候搜索这张路由表。然后讲到,在搜索路由表的过程中,可能发现没有匹配的选项,这时候就会产生ICMP主机或网络不可达错误。还介绍了用于优化路由表的ICMP重定向,以及发现路由器的路由发现协议。
1.选路原理。
在搜索ip路由表确定下一跳地址的时候步骤如下:
1)搜索匹配的主机地址。
2)搜索匹配的网络地址。
3)使用默认项。
这个选路的操作步骤可以称之为路由机制(routing mechanism),而路由策略(routing policy)是用来决定哪些路由项应该被加入这个表中,路由策略一般是由路由守护进程提供的。
使用”netstat -nr“命令可以查看主机上的路由表,作者的网络上的一个简单的路由表,如下图:
说说其中的flag项,比较重要,总共有5种标志。
U:表明这个路由器活着
G:表明下一跳是到一个网关,而不是与目的地直接相连。
H:表明最终的目的地是一个主机,如果没有这个标志则说明最终目的地是一个网络。上面提到在搜索ip路由表确定下一跳地址的时候,会先匹配主机,再匹配网络号,就是通过这个标志来区别是主机还是网络号的。
D:是由ICMP重定向报文创建起来的
M:被ICMP 重定向报文修改过
要明白标志G和标志H之间的不同,标志G是用来描述下一跳路由是否是最终目的地,而H是用来描述最终目的地是网络号还是主机号的。
???对于这个路由表中的最后一条记录实在是不太理解:13.34就是svr4自己,为什么发往13.32这个网络的下一跳地址都是发给自己呢?而且没有G标志,也就是说认为这是直达的。比如说svr4要发送13.35,他就发给自己就行了吗?不需要知道13.35的mac地址?
2.路由表的初始化
route 命令显式操作:
一般在系统启动的时候会执行route add命令显示的操作路由表,用法如下:
route add destination gateway metric
最后一个参数代表路由的度量 ( m e t r i c )。r o u t e命令在度量值大于0时要为该路由设置G标志,其他则不设置G标志 。
路由发现协议:
一般认为,主机在引导以后要广播或多播传送一份路由器请求报文。一台或更多台路由器响应一份路由器通告报文。另外,路由器定期地广播或多播传送它们的路由器通告报文,允许每个正在监听的主机相应地更新它们的路由表。
请求和通告报文格式如下:
需要注意的是,ICMP路由发现协议只会修改默认条目。(???为什么呢)
3.ICMP主机或网络不可达错误
在搜索路由表选择下一跳的过程中,如果默认路由选项被删除,同时主机号和网络号都没有匹配的条目,那么路由器将会产生一个主机或网络不可达的错误,以ICMP报文的形式发送给源主机。
4.ICMP 重定向错误
3) 数据报不能用源站选路来转发。
4) 内核必须配置成可以发送重定向报文
首先,不太明白第二三个条件。更重要的是,书中似乎没有说明,是只要满足这些条件就一定产生ICMP重定向报文,还是说是别人负责产生重定向报文,只是发送之前检查这些条件即可。如果是后者,也并没有提到由谁来产生。
接收到重定向报文的主机也要进行一些检查,这是为了防止路由器或主机的误操作,以及恶意用户的破坏,导致错误地修改系统路由表。
1) 新的路由器必须直接与网络相连接。
2) 重定向报文必须来自当前到目的地所选择的路由器。
3) 重定向报文不能让主机本身作为路由器。
4) 被修改的路由必须是一个间接路由。