ICMP协议
ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP\/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
Ping
ping命令主要是用于检测网络的连通性。
Ping命令发送一个ICMP请求报文给目的IP,然后目的IP回复一个ICMP报文。
原理:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。
因为ping命令是使用ICMP协议,所以没有端口号,但是有两个域:类型和代码。
TraceRoute
TraceRoute协议是可以让我们看到IP数据报从一台主机到另一台主机所经过的路由。
原理:
TraceRoute程序使用ICMP报文和IP首部的TTL字段(声明周期)。TTL字段是由发送端初始设置一个8bit字段。每个处理数据报的路由器都需要把TTL值进行减1或者减去数据包在路由器上停留的描述。TraceRoute程序发送一份TTL字段为1 的IP数据报给目的主机。处理这份数据包的第一个路由器将TTL值减1,丢弃该数据报,并发回一份超时ICMP报文。这样就得到第一个路由器的地址。然后发送一个TTL字段为2的IP数据包给目的主机,这样我们就得到了第二个路由器的地址。继续这个过程直到该数据报到达目的主机。但是目的主机哪怕接收到了TTL值为1的IP数据包,也不会丢弃该数据报产生超时ICMP报文,这是因为数据包已经到达其最终目的地。我们采用的方法是TraceRoute程序发送一份UDP数据包给目的主机,它选择一个不可能的值作为UDP端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口。从而产生一个“端口不可达”错误的ICMP报文。TraceRoute程序只要判断ICMP报文是超时还是不可达就可以判断出来什么时候结束了。
(trcertroute建立一个UDP数据包,不断修改TTL值并发送出去,如果收到"超时错",表示刚刚到达的是路由器,而如果收到的是"端口不可达"错误,表示刚刚到达的就是目的主机。这样路由跟踪完成,程序结束。)
java的jpcap实现了TraceRoute功能。