一、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为例)
类型0或8 | 代码0 | 检验和 |
标识符 | 序号 |
结构定义如下:
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地址放入清单。