TCP/IP协议详解卷一:Chapter9 笔记
TCP/IP协议详解卷一:Chapter9 笔记
Chapter 9 IP选路
守护程序(daemon):运行在后台的进程。它代表整个系统执行某些操作。daemon一般在系统引导时启动,在系统运行期间一直存在。在Unix系统中,大多数普通的守护程序都是路由程序和网关程序。
9.2节 选路的原理
路由表中的信息决定了IP层所作的所有决策。IP搜索路由表的几个步骤为:
- 搜索匹配的主机地址;
- 搜索匹配的网络地址;
- 搜索默认表项。
匹配主机地址始终发生在匹配网络地址之前。IP层执行选路机制,即搜索路由表并决定向哪个网络接口发送分组。路由守护程序提供选路策略,即一组决定把哪些路由放入路由表的规则。
简单路由表
在svr4主机上使用 netstat -r 命令打印路由表,选项 -n 表示以数字格式打印出IP地址。第一列Destination表示目的地,第二列Gateway表示要把分组转发过去的网关(路由器)。第三列标志Flags有五种不同的值:
U:表示该路由可以使用。
G:表示该路由是到一个网关(和目的地不是直接相连的)。
H:该路由是到一个主机(目的地只是一个完整的主机地址,而不是一个网络地址,即主机号部分为0)。
D:该路由是由重新定向报文创建的。
M:该路由已被重新定向报文修改。
标志G区分了间接路由和直接路由。发往直接路由的分组中具有目的端IP地址及其链路层地址。发往间接路由的分组中,IP地址是最终目的地,但链路层地址指明的是网关(即下一站路由)。netstat为直接路由打印出来的网关地址就是本地接口所用的IP地址。
第四列参考计数Refcnt (Reference count)给出的是正在使用路由的活动进程的个数。第五列Use显示的是通过该路由发送的分组数。最后一列Interface是本地接口的名字。
上图中netstat命令输出的第二行是环回接口,名字始终为lo0。输出的第三行default代表默认路由。输出的最后一行是所在的以太网,目的地址144.252.12.32是一个网络地址。它的低五位主机号为0(32 = 二进制100000)。由于是一个直接路由,对应的Gateway列给出的IP地址是外出地址。
初始化路由表
每当初始化一个接口时(通常是用ifconfig命令设置接口地址),就为接口自动创建一个直接路由。对于点对点链路和环回接口来说,路由是到达主机(例如,设置H标志)。对于广播接口来说,如以太网,路由是到达网络。
到达主机或网络的路由如果不是直接相连的,那么就必须加入路由表。一个常用的方法是在系统引导时显式地在初始化文件中运行route命令。初始化路由表的其他方法还包括运行路由守护程序或者用较新的路由器发现协议。
没有到达目的地的路由
如果数据报是由本地主机产生的,就给发送该数据报的应用程序返回一个“主机不可达差错”或者“网络不可达差错”;
如果是被转发的数据报,就给原始发送端发送一个ICMP主机不可达的差错报文。
一般都假定主机不转发IP数据报,除非对它们进行特殊配置而作为路由器使用。
9.5节 ICMP重新定向差错
只有当主机可以选择路由器发送分组的情况下,我们才可能看到ICMP重定向报文。重定向一般用来让具有很少选路信息的主机逐渐建立起更完善的路由表。主机启动时路由表中可以只有一个默认表项,一旦默认路由发生差错,默认路由器将通知它进行重定向,并允许主机对路由表做相应的改动。
ICMP重定向报文只能由路由器生成(供主机使用),而不能由主机生成。
为Ping程序指定 -v 选项可以看到主机接收的任何ICMP报文(-s 选项指定要发送数据的字节数,缺省值为56字节)。
在收到ping程序的第一个响应之前,主机收到一份来自默认路由器gateway发来的ICMP重定向报文(ICMP Host redirect from gateway gateway to netb for bsdi)。如果此时使用 netstat -rn 命令查看路由表,就会发现增加了新的表项(第二行黑体)。
第三列中的选项D表明该路由是被ICMP重定向报文创建的。第二列Gateway对应间接路由netb的IP地址。
ICMP重定向报文 = 1字节类型(=5)+ 1字节代码(0~3)+ 2字节校验和 + 4字节应该使用的路由器IP地址 + IP首部(包括选项)+ 原始IP数据报中的数据前8字节
有4种不同的代码字段:0表示网络重定向,1表示主机重定向,2表示服务类型和网络重定向,3表示服务类型和主机重定向。
ICMP重定向报文的接收者必须查看三个IP地址:导致重定向的IP地址(ICMP报文的数据的IP首部中)、发送重定向报文的路由器IP地址(包含重定向信息的IP数据报中的源地址)、应该采用的路由器IP地址(ICMP报文中的4~7字节)。
9.6节 ICMP路由器发现报文
上文提到,可以在配置文件中指定静态路由以初始化路由表。此外,还可以利用ICMP路由器请求和通告报文。RFC 1256 定义了这两种报文的格式。
一般认为,主机在引导以后要广播或多播传送一份路由器请求报文。一台或更多台路由器响应一份路由器通告报文。另外,路由器定期地广播或多播传送它们的路由器通告报文,允许每个正在监听的主机相应地更新它们的路由表。
ICMP路由器请求报文 = 1字节类型(=10)+ 1字节代码(=0)+ 2字节检验和 + 4字节未用(置0)
ICMP路由器通告报文 = 1字节类型(=9)+ 1字节代码(=0)+ 2字节检验和 + 1字节地址数 + 1字节地址项长度(=2) + 2字节生存时间 + 4字节路由器地址#1 + 4字节优先级#1 + 4字节路由器地址#2 + 4字节优先级#2 + …
地址数是指报文中所包含的地址数。地址项长度指的是每个路由器地址含32bit的数目,始终等于2。生存时间是通告地址有效的时间(秒数)。优先级是一个有符号的32bit整数,指出了该IP地址与子网上其它路由器相比作为默认路由器地址的优先等级,值越大优先级越高。优先级的默认值一般为0。优先级为0x80000000说明不能作为默认路由器地址使用。
路由器发现报文一般由用户进程(守护程序)创建和处理。