ICMP Internet控制报文协议
通常被认为是IP层的组成部分,一般被IP层或更高层(TCP、UDP)使用。
ICMP报文是在IP数据报内部被传输的。如图:
ICMP报文的格式如下:
报文的前4个字节都一样: 8bit类型,8bit代码,16bit检验和。
16bit检验和,算法和计算IP首部检验和一样,ICMP检验和要覆盖整个报文,包括首部和数据。
ICMP报文有不同的报文类型,不同类型由这个8bit的类型和8bit的代码共同决定。一个类型下可能有多个代码。
比如: 类型0表示回显应答(ping应答);类型1表示目的不可达,其中代码0表示网络不可达,代码1表示主机不可达,代码2表示协议不可达,代码3表示端口不可达等等...
报文也分为查询类型还是差错类型。因为有时要对差错报文进行特殊处理,比如对ICMP差错报文进行响应时就不会再生成一个ICMP差错报文...
当发生的是差错报文时,报文始终包含导致产生ICMP差错报文的原IP首部和数据部分的前8个字节(比如传输层的UDP或者TCP,这包含了端口号)。这里的原IP首部中的协议字段和前8个字节的端口号,可以判断出是哪个协议和哪个用户进程。
除了上述的ICMP差错报文不会再产生ICMP差错报文,一般目的地址是广播的数据报不会再产生ICMP差错报文了,这样防止广播风暴...
ICMP地址掩码请求与应答
ICMP时间戳请求与应答
ICMP端口不可达差错:
如果说报文发送到目的主机的未监听的端口,那么目的主机就会返回一个端口不可达的ICMP差错报文。traceroute就利用了这一点。
可以看出ICMP报文的数据部分,包含了原IP的首部和IP数据部分的前8个字节(这里就是UDP首部)。
============Ping==============
ping程序是由Mike Muuss编写,目的是为了测试一个主机是否能到达。
该程序的原理就是向目的主机发送一个请求回显类型(ICMP众多类型的一个,类型是8,代码是0)的ICMP报文,并等待返回ICMP回显应答(ICMP众多类型的一个,类型是0,代码是0)。
一般来说,如果ping不通主机,就表示不能访问那台机器。不过随着Internet安全意识提高,比如现在的路由器和防火墙已经可以提供访问控制列表了,ping不通也不一定是访问不了主机了...
ping程序ICMP回显请求和回显应答的报文格式如下:
Unix系统在实现ping程序时,标识符字段置成发送进程的ID号,这样一台机器启用多个ping的时候,当本机接到应答报文时,就能识别出是哪个ping实例发出的。
ping返回每个序列号,ttl,time...序列号是每发送一个新的回显请求就加1,起始是0。ttl就是过了几个路由(ping局域网内的机器发现ttl就不会减少)。time就是计算的往返时间,发送的时候在数据部分记录下发送时间,收到的时间减去这个发送时间。
ping的时候,往往会发现第一个回来的报文比别的要用的往返时间长,这个多出去的时候就可能是arp寻找mac地址...
ping程序也提供了查看IP记录路由选项的.在IP首部中,还记得有个选项的字段吧~这些个ip记录就放在这个字段里。每经过一个路由,就把这个路由出口的ip(注意这里规范是出口地址),回显应答报文回到源端时仍然会记录下每个路由的出口地址。
IP首部最长是60个字节,减去固定的20字节长度,剩下40个字节。记录路由IP的这个类型项、长度项、记录ip位置的指针各占1个字节,这样存放各个路由ip就只剩下37个字节,一个ip4个字节,因此最多只能记录9个路由...
IP首部的选项还可以记录IP时间戳。这个类似于IP记录路由选项。
============Traceroute==============
traceroute程序--可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由情况。
ping程序中也提供了查看IP记录路由选项,为啥还要再搞一个traceroute咧?主要原因还是因为IP首部选项能存储的ip数量太少了,最多9个。如果只考虑去和回的一个方向,那么最多只能存储4-5个路由,这在现在的互联网规模来看显然是不太满足的。
traceroute几个核心知识:利用TTL通过路由减1,直到变为1或者0时(路由不会传送TTL为0的包),路由就会发送超时类型的ICMP报文通知源端主机。利用UDP发送一般不常见的端口号给目的主机,当真正到达目的主机时,目的主机会发送一个端口不可达错误的ICMP报文(在未到达时,是路由返回的超时类型的ICMP报文,需要辨识开)。源端主机根据这个确认是否到达。TTL开始是1,逐渐递增。
一个细节:对于每个TTL值,都会发送三个包。每接到一个报文,就计算并打印出来往返时间。如果5秒钟内一个包没收到,就打印一个*号,并发送下一份数据报。
ICMP超时报文格式如下:
IP源站选路选项:
通常IP路由是动态的,每个路由都要判断下一站转发给谁。源站选路:就是由发送者指定路由。采用类似Traceroute程序的工具来发现实际的路由。
一般分为严格和宽松的两种。严格的源站,是由发送端确切指明每个路由,如果发现指定的路由不在这个连接的路由上,那么就会发送“源站路由失败”的ICMP报文。
宽松的:发送端指明一个路由的IP地址清单,每两个IP路由之间可以通过其他路由器。
这里指定的路由和IP记录路由选项是一样的,都是利用IP首部的选项字段,格式也很类似。
--