阅读 96

系列TCP/IP协议-ping与traceroute命令(006)

一、引言

在错综复杂的网络的世界里,如何知道对方主机是否可达,链路是否畅通是一个不太简单的问题。现在有两种常用的程序或命令来检查这些问题(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回显请求/应答数据包

图1.ICMP回显请求/应答数据包格式

上图为该数据包格式。

  • 具体的ICMP数据包参见:(5)TCP/IP协议-ICMP协议
  • 当前类型字段值为:0-ICMP回显请求数据包,8-ICMP回显应答数据包。
  • 代码段:都为0
  • 标识符:unix系统通常是设置称品尼高程序的进程ID
  • 序列号:没发送一次新的回显请求就加1

3.抓包

运行ping baidu.com

图2. 运行ping

用wireshark抓包可以看到,有四组ICMP回显请求/应答数据包

图3.四组抓包数据

对于其中一组(47与48)

图4. ping的ICMP回显请求数据包
图5.ping的ICMP回显应答数据包

除了Type字段不同,其他都相同

4.ping命令常用的IP选填字段。

还记得IP数据包有一个选项字段(参见:(3)TCP/IP协议-IP协议的图1)。这个选项区域是可选的。该区域可以做很多事情,如记录每一次的路由跳转ip地址或者传输时间等等。   对于ping命令可以干的事情有记录每一次的跳转路由或者传输时间。这里以记录IP路由为例,其他类似:

图6. 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来查看

图7.linux中的ip路由选填字段

三、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

图8. Linux上运行结果

  • 其中每一行,为路由的一跳。
  • 一行默认重试三次,若ip相同,只显示一遍(如第1跳),若不同分开显示。后面的时间是分别是三次跳转时间。

都看到这里了,要不要扫二维码关注一下微信公众号林湾村龙猫

微信公众号rudy_tan_home

关注下面的标签,发现更多相似文章
评论