一、Ping程序:
先看:
//ping C:\WINNT\system32>ping svr00804 Pinging svr00804.sccnj.swirebev.com [192.1.8.12] with 32 bytes of data: Reply from 192.1.8.12: bytes=32 time<10ms TTL=128 Reply from 192.1.8.12: bytes=32 time<10ms TTL=128 Reply from 192.1.8.12: bytes=32 time<10ms TTL=128 Reply from 192.1.8.12: bytes=32 time<10ms TTL=128 Ping statistics for 192.1.8.12: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms ICMP回显请求和回显应答报文格式如下:(以Ping为例)
结构定义如下: typedef struct icmp_hdr
{
unsigned char icmp_type; //类型
unsigned char icmp_code; //代码
unsigned short icmp_checksum; //检验和
unsigned short icmp_id; //标识符
unsigned short icmp_sequence; //序号
} ICMP_HDR, *PICMP_HDR, FAR *LPICMP_HDR;
PING程序把ICMP报文中的标识符字段设置为发送进程的ID号,这样即使在同一台主机同时运行多个ping实例,ping程序也可以识别返回的信息。
二、IP记录路由选项
PING程序为我们提供了查看IP记录路由(RR)选项的机会。每个处理PING请求的路由器都把它的IP地址放入选项字段中。当PING程序收到回显应答时,它就可以打印出这份IP地址清单。 由于IP首部中的首部长度字段只有4bit,因此IP首部最大为60字节。由于IP首部固定长度为20个字节,RR选项用去3个字节,因此存放IP地址的控件只有37个字节,也就是最多放9个IP地址。
code(1) |
len(1) |
ptr(1) |
9个IP地址 |
多余1 |
code:IP选项类型,RR选项为7。 len:RR选项总长度,为39。 ptr:指针字段,存放下一个IP地址的位置,开始为4,放满为40。
IP地址为路由器的出口地址,同时原始主机收到带有RR选项的ICMP回响应答时也把它的入口IP地址放入清单。
三、IP时间戳选项:
Code(1) |
Len(1) |
Ptr(1) |
OF(4bit) |
FL(4bit) |
时间戳 |
Code:时间戳的代码为0x44。 Len: 时间戳选项总长度,一般为36或者40。 Ptr:时间戳数据指针。 OF:溢出字段。 FL:标志字段:0-只记录时间戳 1-每台路由七都记录IP地址和时间戳,在选项列表中只存放4对IP地址和时间戳。 3-发送端对选项列表进行初始化,存放4个IP地址和4个取值为0的时间戳。只有当列表中的下一个IP地址与当前路由器地址相匹配时,才记录它的时间戳。
如果路由器没有控件而不能增加时间戳选项时,那么将设置溢出字段的值。
四、Traceroute程序: Traceroute程序使用ICMP报文和IP首部的TTL字段,发送ICMP回显应答时一般把TTL设置为255。工作原理:开始时发送一个TTL字段为1的数据报,然后每次将TTL字段值加1,以确定路径中的每个路由器。每个路由器在丢弃UDP数据报时都返回一个ICMP超时报文2,而最终目的主机则产生一个ICMP端口不可到达的报文。 报文长度为40:
◆ 20字节的IP首部 ◆ 8字节的UDP首部 ◆ 4字节的序列号,每发一个就加1 ◆ 4个字节的TTL副本 ◆ 4个字节的发送数据报的时间戳。
超时报文格式:
类型11 |
代码0或1 |
检验和 |
保留,必须为0 |
IP首部+原始IP数据报中数据的前8位 |
五、IP选路
IP搜索路由表的步骤:
◆ 搜索匹配的主机地址 ◆ 搜索匹配的网络地址 ◆ 搜索默认选项
1、 路由表: DestinationGatewayFlags Refcnt use
140.252.13.65 140.252.13.35 UGH 0 0
127.0.01127.0.01 UH10
default 140.252.13.33 UG 00
140.252.13.32 140.252.13.34 U 4 25043
说明:U-该路由可以使用(use) G-该路由似到一个网关。(gateway) H-该路由是到一个主机(host) Refcnt-是正在使用路由的进程数 Use-通过该路由发送的分组数
每当初始化一个接口时,系统就为接口自动创建一个直接路由。如果到达主机和网络的路由不是直接相连的,就需要手工加入路由表。 > route ADD 157.0.0.0 MASK 255.0.0.0 157.55.80.1 METRIC 3 IF 2
destination^ ^mask ^gateway metric^ Interface^
如果表中没有默认项,又没有找到匹配项。如果数据报时本地主机产生的,那么就给发送该数据报的应用程序一个差错,或者是“主机不可达差错”或者是“网络不可达差错”。如果是被转发的数据报,那么就给原始发送端发送一份ICMP主机不可达的差错报文。
2、 ICMP重定向差错
如果我们发送一份IP报给R1路由器,R1收到数据报并且检查它的路由表,发线R2是发送该数据报的下一站。当它把数据报发送给R2时,R1检测到它正在发送的接口与数据报到达接口是相同的(即主机和两个路由器所在的LAN)。这样路由器R1就会发送重定向报文给主机。 ICMP重定向差错报文格式:
类型5 |
代码(0-3) |
检验和 |
应该使用的路由器IP地址 |
IP首部+原始IP数据报中前8个字节 |
代码说明:0-网络重定向 1-主机重定向 2-服务类型和网络重定向 3-服务类型和主机重定向 ICMP重定向报文的接受者必须查看三个IP地址:(1)导致重定向的IP地址(2)发送重定向报文的路由器IP地址(3)因该采用的路由器IP地址。 ICMP重定向报文只能由路由器生成,不能由主机生成。 主机收到重定向报文时,在修改路由表前必须做一些检查。
◆ 新的路由器必须直接与网络相连接 ◆ 重定向报文必须来自当前到目的地所选择的路由器 ◆ 重定向报文不能让主机本身作为路由器 ◆ 被修改的路由必须是一个间接路由
3、 ICMP路由器发现报文
主机在引导以后要广播或多播传送一份路由器请求报文。一台或多台路由器响应一份路由器通告报文。另外,路由器定期关波或多播传送他们的路由器通告报文,允许每个正在监听的主机相应地更新它们地路由表。 ICMP路由器请求报文格式:
ICMP路由器通告报文格式:
类型9 |
代码0 |
检验和 |
地址数 |
地址项长度2 |
生存时间 |
路由器地址1 |
优先级1 |
路由器地址2 |
优先级2 |
... |
地址数指的是报文重所包含得地址数。 地址项大小指的是每个路由器地址32bit的数目,始终为2。 生存时间指的是通告地址有效的时间(秒数) IP地址必须是发送路由器的某个地址 优先级是一个有符号的32位整数,指出该IP地址作为默认路由器地址的优先等级,值越大说明优先级越高。优先级的默认值一般设定位0。
六、动态选路协议RIP
当相邻路由器之间进行通信,以告知对方每个路由器当前所在的网络,这就出现了动态选路。路由器上有一个进程叫路由守护程序,它运行选路协议,并于其相邻的一些路由器进行通信。路由器根据它从相邻路由器接收到的信息,更新内核中的路由表。 报文格式:
命令1-6 |
版本1 |
必须为0 |
地址系列2 |
必须为0 |
32位IP地址 |
必须为0 |
必须为0 |
度量(1-16) |
最多24个另外的路由,与前20个字节格式相同 |
RIP报文包含在UDP数据报中。 命令1表示请求,2表示应答,3和4不用,5和6为非正式的命令。请求表示要求其他系统发送其全部或部分路由表,应答则包含发送者全部或部分路由表。 版本字段通常为1,根据实际设定。 地址系列为地址类型,IP地址为2。 由于每个报文最多携带25个路由,因此为了发送整个路由表,经常需要发送多个报文。
1、 运行过程
- 初始化:在启动一个路由守护程序时,它先判断启动了哪些接口,并在每个接口上发送一个请求报文,要求其他路由器发送完整路由表。目的端口号时520。这种请求报文的命令字段为1,但地址系列字段设置为0,度量字段设置为16。这是一种要求另一端完整路由表的特殊请求报文。
- 接收到请求:如果这个请求时刚才提到的特殊请求,那么路由器就将完整的路由表发送给请求者。否则就处理请求中的每一个表项:如果有连接到指定地址的路由,则将度量设置为我们的值,否则将度量设置为16,表示没有到达目的地地路由,然后发送相应。
- 接收到响应:使相应生效,可能会更新路由表或增加新表项,对已有地表项进行修改,或者删除已有表项。
- 定期更新选路:每过30秒,所有或部分路由器会将其完整地路由表发送给相邻的路由器,发送路由表一般是广播形式的。
- 触发更新:每当一条路由的度量发生变化时,就对它进行更新。不需要发送完整路由表,只需发送那些发生变化的表项。
- 每条路由都有与之相关的定时器:如果运行RIP的系统发现一条路由在3分钟未更新,就将该路由的度量设置为16,并标注为删除。
2、度量:
度量是相连通过的接口数,如果是直接相连,则度量是1。如果一个路由器到一个网络有多条路由,则路由器将选择最短的路由。 度量最大值是15,16表示无路由到达该IP地址。
3、 RIP2
RIP2利用RIP报文中必须为0的字段来传递一些额外的信息。其报文格式如下:
命令1-6 |
版本2 |
路由域 |
地址类2 |
路由标记 |
32位IP地址 |
32位子网掩码 |
32位下一站IP地址 |
度量(1-16) |
最多24个另外的路由,与前20个字节格式相同 |
选路域是一个选路守护程序的标识符,指出了这个数据报的所有者。一般是进程号。 选路标记是为了指出外部网关协议存在的。 子网掩码是应用在相应的IP地址上的。 下一站IP地址指明发往目的IP地址的报文该发向哪里。该字段为0表示发往目的地址的报文应该发给发送RIP报文的系统。 RIP2还支持多播,以减少不收听RIP2报文的主机的负载。
|