ICMP传递差错报文以及其他需要注意的信息,通常被IP层或传输层使用。
ICMP基础:
ICMP报文格式如下:
所有ICMP报文的前4个字节是一样的,其他互不相同。
类型字段可以有15个不同的值,以描述特定类型的ICMP报文。
某些ICMP报文还使用代码字段的值来进一步描述不同的条件。
1,ICMP地址掩码请求用于误判系统在引导过程中获取自己的子网掩码。
2,ICMP时间戳请求允许系统向另一个系统查询当前的时间。
ping程序:
常用的ping程序就是基于ICMP协议,其发送一份ICMP回显请求,并等待ICMP回显应答。
约定发送ping请求的guest,被ping的主机为host,一般ping服务器并不是app进程,而是在内核中实现。
ping程序的ICMP请求和应答报文如下图:
unix将标识符填充为发送进程的ID,序号从0开始,每新发送一个新的加1.
trackroute程序:
traceroute程序可以让我们看到IP数据包从一台主机传导另一台主机上所经过的路由,还可以让我们使用IP源路由选项。
traceroute使用ICMp报文和IP首部中的TTL(生存周期)字段。
每个处理数据包的路由器都需要把TTL的值减1或减去数据报在路由器中停留的秒数。
由于大多数的路由器转发数据报的时延都小于1s,所以TTL最终成为一个跳站得计数器。
当路由器收到一份IP数据报,如果其TTL字段为0或1,则路由器不转发该数据报,且将该数据报丢掉,并给信源机发送一个ICMP超时信息,包含这份ICMP信息的IP报文的信源地址就是该路由器的IP地址,这就是traceroute的实现原理。通过发送TTL从1开始的数据报给目标主机,然后加1,直到达到主机,就能遍历出所有的路由器地址。
那么怎么判断到达目标主机呢?
traceroute发送一份UDP数据报给目的主机,但是选择一个大于30000的值作为端口,那么就会产生端口不可达错误,那么当traceroute接收到端口不可达的ICMP回显时就结束遍历。