一、引言
在错综复杂的网络的世界里,如何知道对方主机是否可达,链路是否畅通是一个不太简单的问题。现在有两种常用的程序或命令来检查这些问题(ping与traceroute命令)。 "ping"这个名字来源于航海的声纳定位操作。其操作类似于声纳定位。只不过这里发送的是ICMP数据包而不是声波。该命令的目的是用于确定某个主机是否可达,距离当前主机多远。 traceroute,正如它的名字一样,该命令用来打印出主机A到主机B中间走过的路由IP地址。
二、ping命令
1.原理
ping的原理实际上很简单。就是主机A想要知道主机B的某些信息(如是否可达)。这时候主机A就像主机B发送一份ICMP回显请求数据包,并且为主机B回应等待一段时间(超时);主机B收到ICMP回显请求数据包后回应一个ICMP回显应答数据包给主机A,若主机B不可达或出错,主机A会超时或收到ICMP不可达差错数据包。需要注意的是
ping命令只会检查到某个主机而不能够具体到某个端口号。
2.ICMP回显请求/应答数据包
上图为该数据包格式。
- 具体的ICMP数据包参见:(5)TCP/IP协议-ICMP协议
- 当前类型字段值为:0-ICMP回显请求数据包,8-ICMP回显应答数据包。
- 代码段:都为0
- 标识符:unix系统通常是设置称品尼高程序的进程ID
- 序列号:没发送一次新的回显请求就加1
3.抓包
运行ping baidu.com
用wireshark抓包可以看到,有四组ICMP回显请求/应答数据包
对于其中一组(47与48)
除了Type字段不同,其他都相同
4.ping命令常用的IP选填字段。
还记得IP数据包有一个选项字段(参见:(3)TCP/IP协议-IP协议的图1)。这个选项区域是可选的。该区域可以做很多事情,如记录每一次的路由跳转ip地址或者传输时间等等。 对于ping命令可以干的事情有记录每一次的跳转路由或者传输时间。这里以记录IP路由为例,其他类似:
- code:一个字节,指明该选项是什么选项。对于RR选项(Route Record,记录IP路由)来说,为7。
- len:一个字节,指明总的字节数,通常该值为39。
- ptr:一个字节,指针字段,指向存放下一个IP地址的位置。可以把该字段后面的当成一个栈,ptr指向栈顶。
- 后面的字段:每4个字节为一个IP地址。由于IP地址最大首部长度的限制,最多存放9个IP地址。
可以window通过命令ping -r 9 baidu.com
来查看,linux通过ping -R baidu.com
来查看
三、traceroute命令
我们描述了IP记录路由选项。为什么不使用这个选项而另外开发一个新的应用程序?有三个方面的原因:
- 不是所有的路由器都支持IP记录路由选项;
- 记录路由一般是单向的选项。发送端设置了该选项,那么接收端不得不从收到的IP首部中提取出所有的信息,然后全部返回给发送端;
- IP首部中留给选项的空间有限,不能存放当前大多数的路径;这是最主要的原因。
1.原理
- traceroute程序使用ICMP数据包(超时与端口不可达)和IP首部中的TTL字段(生存周期,初始值一般是64)。
- 每个处理数据报的路由器都需要把 TTL的值减1。如果路由器转发数据报的时延超过1秒,那么它将把TTL值减去所消耗的时间(秒数)。TTL字段的目的是防止数据报在选路时无休止地在网络中流动。
- 当路由器收到一份IP数据包,如果其TTL字段是0或1,则路由器不转发该数据报(接收到这种数据报的目的主机可以将它交给应用程序,这是因为不需要转发该数据报。
- 发送过程:
- 它发送一份TTL字段为1的IP数据包给目的主机。
- 处理这份数据报的第一个路由器将TTL值减1,丢弃该数据报,并发回一份超时ICMP数据包。
- 这样就得到了该路径中的第一个路由器的地址。
- 然后 traceroute程序发送一份TTL值为2的数据报,这样我们就可以得到第二个路由器的地址。
- 继续这个过程直至该数据报到达目的主机。
- 但是目的主机哪怕接收到 TTL值为1的IP数据报,也不会丢弃该数据报并产生一份超时ICMP数据包,这是因为数据报已经到达其最终目的地。由于traceroute发送的是一份UDP数据包,选择一个不可能的值作为 UDP端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口,因此,当该数据报到达时,将使目的主机的UDP模块产生一份“端口不可达”错误的ICMP数据包。这样,traceroute程序所要做的就是区分接收到的ICMP数据包是超时还是端口不可达,以判断什么时候结束。
2.举例
在liunx上运行traceroute baidu.com
或window上运行tracert baidu.com
。
- 其中每一行,为路由的一跳。
- 一行默认重试三次,若ip相同,只显示一遍(如第1跳),若不同分开显示。后面的时间是分别是三次跳转时间。
都看到这里了,要不要扫二维码关注一下微信公众号林湾村龙猫。