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】(表示作为默认地址的优先级。。。都是默认地址!!!!)
一般情况下,路由器会随机发送路由器应答报文!!!!