ICMP:internet控制报文协议 PING

ICMP概念:

由图可知ICMP其实比IP层是要高一级的,但是此处将其放在IP层

ICMP种类由八位类型决定有的还需要8位代码

ICMP报文分类:

1:差错报文

为了避免过去允许ICMP差错保温对广播分组相应所带来的广播风暴

1.1 ICMP端口不可达

类型(类型3:代表不可达差错报文)|代码(0-15)|校验和(与IP首部校验和计算方法相同)|未用(必须为0)|

IP首部(包括选项)+原始IP数据报中数据的前八字节

举一个例子,在tftp中,UDP的公共端口号通常是69,但是tftp允许利用connect链接到一个不同的端口,当利用此端口号去找目的主机的端口的时候,就会发生端口不可达的错误,此时利用ICMP报文,传达一个端口不可达的信息

列如


会发现并没有这个报文(在这里其实百度并没有tftp)

并且利用tcpdump观看会看到

返回的ICMP差错报文

1.2ICMP主机与网络不可达


sun % netstat -rn

Rounting tables

Destination                                        gateway                    Flags          Refcnt         Use         Interface

140.252.13.65                                   140.252.13.35            UGH  (正在使用该路由的进程)    (发送的分组)  接口

127.0.0.1                                           127.0.0.1                    UH

140.252.1.183注意这是点对点的另一端IP                   140.252.1.29(这就是本机的另一个端口)              UH(分析,可用U,用H是因为目的端是一个主机,而没有G是因为140.252.1.29是一个接口不是网关

default                                               140.252.1.183            UG

140.252.13.32(以太网)140.252.13.33(出口)            U

在这里当SLIP线路被拔掉的时候3,4行就会消失(因为这两行是SLIP软件启动的时候自动创建的,当SLIP不存在的时候自动取消)

所以当有

svr4% ping gemini

svr4>gemini:icmp:echo request

sun>svr4:icmp:host gemini unreachable

主机不可达,因为找不到路由

类型(类型3:代表目的不可达)|代码(1,代表主机不可达)|校验和(与IP首部校验和计算方法相同)|未用(必须为0)|

IP首部(包括选项)+原始IP数据报中数据的前八字节

1.3ICMP不可达报文(需要分片)

类型(类型3:代表目的不可达)|代码(4,因为设置了IP层不允许分片位,所以对超过了MTU的IP报文不能进行分片,所以发生不可达)|校验和(与IP首部校验和计算方法相同)|未用(必须为0。4个字节)|下一站网络MTU|IP首部(包括选项)+原始IP数据报中数据的前八字节


列如在solaris上面对bsdi发送600字节的数据报(ICMP请求回显报文),可以利用ping程序指定发送字节数,

列如在solaris上面发送数据

solaris > bsdi:icmp:echo request(DF)设置了不分片标志

bsdi > solaris:icmp :echo reply(DF)

sun>bsdi:icmp :solaris unreachable - need to frag mtu = 0(DF)

在bsid上面利用tcpdump上面观察

1.4ICMP重定向错误

类型(类型5:重定向)|代码(0默认)|校验和(与IP首部校验和计算方法相同)|应该使用的路由器IP地址|

IP首部(包括选项)+原始IP数据报中数据的前八字节

概念

重定向是如何发生的:比如主机要发送一份文档给R2,但是R1是主机的默认路由,发给R1后,R1将数据报发送给R2,在发送的时候会发现,数据报接受的端口和发送时候的端口是一致的,因此R1发送ICMP重定向报文

比如说本来有这么一条

Destination                                        gateway                    Flags          Refcnt         Use         Interface

default                                   140.252.1.4            UG  (正在使用该路由的进程)    (发送的分组)  接口

本来只有这一条默认的,现在则应该加上一条重定向的路由表项

140.252.13.35                        140.252.1.183    UGHD 

D:表示是一个ICMP重定向的路由条目
1.5ICMP源站抑制差错

类型(类型4:ICMP源站抑制差错)|代码(0)|校验和(与IP首部校验和计算方法相同)|未用(4字节)|IP首部(包括选项)+原始IP数据报中数据的前八字节

概念,比如说从一个以太网局域网中发送数据给internet上面主机数据,途中经过点对点链路,由于点对点链路速度缓慢,发送的速度小于接受的速度,这就可能造成接受的路由器发送ICMP源站抑制差错报文

2:查询报文

2.1ICMP地址掩码请求与应答

类型(类型17:ICMP地址掩码请求/类型18:ICMP地址掩码应答)|代码(0)|校验和(与IP首部校验和计算方法相同)|标志符|序列号|32位地址掩码

假定icmpaddrmask能够发送ICMP地址掩码请求

icmpaddrmask 140.252.13.63(是一个广播地址)

received mask=ffffffe0,from 140.252.13.33 来自本机

received mask=ffffffe0,from 140.252.13.35 来自bsdi

其中发送是广播发送的,但是应答不是广播发送的

2.2CMP时间戳请求于应答

类型(类型13:时间戳请求/类型14:ICMP时间戳应答)|代码(0)|校验和(与IP首部校验和计算方法相同)|标志符|序列号|发起时间戳(请求端填写发起时间戳)|接收时间戳(应答系统收到的时候填写)|传送时间戳(应答系统发送的时候填写,不过经常传送和接收时间戳相同)

作用可以获得时间

2.3PING程序

类型(类型0:回显应答/类型8:回显请求)|代码(0)|校验和(与IP首部校验和计算方法相同)|标志符(设置成发送进程ID这样运行多个ping程序也可以识别)|序列号(每发送一次新的回显就加1)|选项数据

2.3.1概念:PING并不是一个用户进程,他是在内核中直接实现的,他是一种尽力而为的数据报传送服务,因此可能发生分组的丢失,重复,失序

2.3.2PING程序实际操作

第二张图为tcpdump抓取指令所收到的,分析,ICMP请求报文,id2761,序列号27,length 98=以太网头部14个字节+ip数据报头部20个字节+ICMP报文64个字节(8字节的头部和56字节的数据)

56byte of data是指ICMP有56个数据,下面加上8个字节即为ICMP数据报长度,所以发送的是64个字节

icmp_seq指的是ICMP回显的序列,27(同一个请求和回显序列号相同),长度是64

time是指的往返时间,在发送的时候PING程序会在ICMP报文中存放发送时间,当接到回显应答的时候,将此刻的时间减去发送时间即能得到往返时间

注意当缓存中没有ARP缓存的时候,会在ping程序发送ICMP请求回显报文之前发送一份ARP请求报文,所以按照PING时间计算方法,时间会加长

2.3.2 ping记录路由选项功能 是开启IP数据报的RR选项

ping -R www.baidu.com 显示所经过的路由器 

记录选项格式

code(指明IP选项类型)|len(选项长度,一般是39,可以记录9个IP记录)|ptr(指针指向第几个IP路由)|(IP addr #1)|(IP addr #2)|IP addr #3(<-ptr=12).......|(IP addr #4)<-ptr=40

解释10:31:11.497395 0c:8b:fd:34:db:86 > 58:44:98:f8:a0:0c, ethertype IPv4 (0x0800), length 138

138是指ip数据报加上以太网头部总长度

 (tos 0x0, ttl 64, id 8146, offset 0, flags [DF], proto ICMP (1), length 124:长度是指以IP数据报长度

options (NOP,RR 192.168.43.146, 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0)RR选项记录详细

 192.168.43.146 > 112.80.248.73: ICMP echo request, id 3918, seq 22, length 64:64是指ICMP保温长度

注意只能记录9个,ping外网没用,内网ok!!!!

2.4ICMP路由器发现报文

类型(10:路由器请求报文)|代码(0)|校验和|(未用,设置为0)->为总共八个字节

一般认为主机在引导以后要广播或者多播一份路由器请求报文

2.5ICMP路由器应答报文

类型(9:路由器应答报文)|代码(0)|校验和|地址数(后续有多少个地址)|地址项长度(默认为2)|生存时间(秒数)|路由器地址【1】|优先级【1】(表示作为默认地址的优先级。。。都是默认地址!!!!)

一般情况下,路由器会随机发送路由器应答报文!!!!








posted @ 2016-09-12 09:03  SmileLion_LY  阅读(2859)  评论(0编辑  收藏  举报