排错工具ping和trace(ICMP协议分析)

提前知晓:

1、ICMP 原理和作用
ICMP 是 Internet Control Message Protocol 的缩写,即互联网控制消息协议。它是互联网协议族的核心协议之一。它用于 TCP/IP 网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使网络管理者可以对所发生的问题作出诊断,然后采取适当的措施解决问题。

ICMP 的原理是这样的:它不像 IP 协议和 ARP 协议一样直接传递给数据链路层,而是先封装成 IP 数据包然后再传递给数据链路层。所以在 IP 数据包中如果协议类型字段的值是 1 的话,就表示 IP 数据是 ICMP 报文。IP 数据包就是靠这个协议类型字段来区分不同的数据包的。

ICMP 协议的类型分为两大类,查询报文差错报文 。查询报文用于测试网络的连通性和性能,例如 ping 命令就是基于 ICMP 的回显请求和回显应答报文来实现的。差错报文用于报告网络中的错误情况,例如目的主机不可达、端口不可达、超时、重定向等。

2、Windows 系统中的 Ping 命令及其各种选项
Ping 命令是一个使用频率极高的网络诊断工具,在 Windows、Unix 和 Linux 系统下均适用。它是 TCP/IP 协议的一部分,用于确定本地主机是否能与另一台主机交换数据报。根据返回的信息,我们可以推断 TCP/IP 参数设置是否正确以及运行是否正常。

Ping 命令的应用格式有三种:
①ping + IP 地址或主机域名;
②ping + IP 地址或主机域名 + 命令参数;
③ping + 命令参数 + IP 地址或主机域名 。

Ping 命令的常用选项有以下几个:

-t 不停地 ping 指定的主机,直到键入 Ctrl+C。

-n count 发送指定的数据包数,默认发送四个。

-l size 指定发送的数据包的大小,默认为 32 字节。

-f 在数据包中设置“不分段”标记。在一般发送的数据包都会通过路由分段再发送给对方,加上此参数以后路由就不会再分段处理。

-i TTL 指定 TTL 值在对方的系统里停留的时间。此参数是帮助检查网络运转情况的。

-w timeout 指定超时间隔,单位为毫秒。

3、Windows 中的 Tracert 命令及其各种选项
Tracert(traceroute)是一个常用的网络工具,用于追踪分析数据包在网络中传输时经过的路径,并输出到目标地址的延迟情况和节点信息。

Tracert 命令的语法格式如下:

tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] [-R] [-S srcaddr] [-4] [-6] target_name

Tracert 命令的参数说明如下:

-d 表示不让 tracert 根据节点主机名查找路由的 IP 地址,直接进行路由跟踪。当路由器不支持 ICMP/UDP/ICMPv6 数据包时,建议使用该选项。

-h maximum_hops 指定最多经过多少个节点进行路由跟踪,默认值为 30。使用该选项可以更改该值。

-j host-list 枚举一个节点列表,并在路由跟踪过程中只走该列表中的节点。

-w timeout 设置等待每个回复消息的超时时间,默认值为 4000 毫秒。使用该选项可以更改该值。

-R 指示 tracert 跟踪路由时,使用“参考路由”而不是“严格源路由”。如果启用了该选项,则可以跨越某些无法到达的能够到达目标的路由器。

-S srcaddr 指定源地址。如果在单个计算机上安装了多个网络适配器,则使用该选项可以指定从哪个适配器发出路由跟踪请求。

-4 强制使用 IPv4 进行路由跟踪。

-6 强制使用 IPv6 进行路由跟踪。

target_name 表示要查询的目标 IP 地址或主机名。

网络连通性测试的方法和工作原理

ping是一种利用ICMP协议发送和接收特定的数据包的工具,它可以测试网络设备之间的可达性和响应时间。ping的工作过程是这样的:发送方向目的方发送一个ICMP回显请求报文,然后等待一个ICMP回显应答报文。如果在一定的时间内收到应答报文,说明目的方是可达的,并且可以计算出往返时延。如果没有收到应答报文,说明目的方是不可达的,或者网络存在故障。ping可以通过设置不同的参数来改变发送的数据包的大小、数量、生存时间、源地址等,以适应不同的测试需求。

wireshark抓包ICMP协议报文分析

常见的一些报文type和code:

报文类型typecodeMessage
差错报文31Host Unreachable——主机不可达
33Port Unreachable——端口不可达
51Redirect for host——对主机重定向
110TTL equals 0 during transit——传输期间TTL为0
120IP header bad (catchall error)——坏的IP首部(包括各种差错)
请求响应报文80Echo request
00Echo reply

ICMP协议请求响应报文:

报文格式:
目的MAC地址:6个字节
源MAC地址:6个字节
协议类型:2个字节
IP数据报固定首部:20个字节
ICMP报文类型(Type):1个字节
ICMP报文代码(Code):1个字节
校验和:2个字节
标识符:2个字节
序号:2个字节
数据:一般大于等于32个字节(使用ping命令数据一般为32,如果使用的ping命令具有额外指定,可能不止32)
校验:4个字节,由于校验比较特殊,我们在wireshark捕获的报文里面不能直接查看,
所以我们一般捕获到的ICMP响应报文总共74字节。
如图所示:
Alt text

目的MAC地址、源MAC地址、协议类型:

Alt text

IP数据报固定首部:

  • 版本(Version)和首部长度(IHL):1字节,表示IP协议的版本,目前为4,即IPv4。IHL表示IP首部的长度,通常为20字节,最大为60字节。
  • 区分服务(TOS):1字节,表示数据报的优先级和服务质量,目前很少使用,一般为0。
  • 总长度(Total Length):2字节,表示数据报的总长度,包括首部和数据,单位为字节,最大为65535字节。
  • 标识(Identification):2字节,表示数据报的唯一标识,用于分片和重组。
  • 标志(Flag):1字节,表示数据报是否允许分片,以及是否还有更多的分片。
  • 片偏移(Fragment Offset):2字节(这两字节包含了标志的一字节),表示分片在原始数据报中的相对位置,单位为8字节。
  • 生存时间(TTL):1字节,表示数据报在网络中的最大跳数,每经过一个路由器,该值减1,当为0时,数据报被丢弃。
  • 协议(Protocol):1字节,表示数据报携带的数据所使用的协议类型,如TCP、UDP、ICMP等。
  • 首部校验和(Header Checksum):2字节,表示数据报首部的校验和,用于检测首部是否有错误,每经过一个路由器,该值需要重新计算。
  • 源IP地址(Source Address):4字节,表示数据报的源IP地址。直接十六进制转换
  • 目的IP地址(Destination Address):4字节,表示数据报的目的IP地址。直接十六进制转换
    Alt text

ICMP报文类型(Type)、ICMP报文代码(Code)、校验和、标识符、序号、数据:
在右边窗口的左边表示十六进制的数据,右边是ASCII表的对应数据,通过查表可得。
Alt text

ICMP协议差错报文:

ICMP协议的差错报文和响应报文在报文格式上面有以下区别:

差错报文的数据部分的值都是小于等于31的,而响应报文的数据部分的值都是大于等于32的。

差错报文的数据部分都包含了引发差错的IP数据报的首部和数据部分的前8个字节,而响应报文的数据部分则根据不同的类型有不同的内容,例如回显请求和回答报文的数据部分包含了一个标识符字段和一个序号字段,时间戳请求和回答报文的数据部分包含了三个时间戳字段等。

差错报文的代码字段(Code)的值都表示了差错的原因或者细节,而响应报文的代码字段的值都是0,没有特殊含义。

报文格式:
目的MAC地址:6个字节
源MAC地址:6个字节
协议类型:2个字节
IP数据报固定首部:20个字节
ICMP报文类型(Type):1个字节
ICMP报文代码(Code):1个字节
校验和:2个字节
Unused:4个字节

标识符的2个字节和序号的2个字节不再显示,而是显示成Unused,Unused一般为全0.

对应的请求报文的IP数据报固定首部:20个字节
对应的请求报文的ICMP报文类型(Type):1个字节
对应的请求报文的ICMP报文代码(Code):1个字节
对应的请求报文的校验和:2个字节
对应的请求报文的标识符:2个字节
对应的请求报文的序号:2个字节

校验:4个字节,同样校验比较特殊,我们在wireshark捕获的报文里面不能直接查看,
所以总共有70个字节

这里只看不一样的地方:
其中这个对应的请求报文的校验和,在原来的报文中会显示为correct,但是这里会变成unverified
Alt text

网络路径跟踪的方法和工作原理

网络路径跟踪的工作原理是利用IP协议的生存时间(TTL)字段和ICMP协议的超时和不可达报文。
1.源主机向目的主机发送一系列的数据包,每个数据包的TTL值从1开始递增,每次发送3个相同的数据包。
2.当数据包到达中间的路由器时,路由器会减少TTL值,如果TTL值变为0,路由器会丢弃数据包,并向源主机返回一个ICMP超时报文,包含路由器的地址。
3.当数据包到达目的主机时,目的主机会检查数据包的目的端口,如果是一个未使用的端口,目的主机会返回一个ICMP不可达报文,包含目的主机的地址。
通过这样的方式,traceroute可以收集到从源主机到目的主机的所有路由器和网络节点的地址,以及每一跳的延迟和丢包率。

如图所示:从图中可以看到源主机每次发送三个TTL相同的数据包,路径上的不同路由器回复三个ICMP超时报文
Alt text

发送的报文在格式上与ICMP请求报文一模一样,但是在字节长度上tracet发送的ICMP报文数据共64字节,内容为全0

MTU 的概念和 IP 分片操作

MTU(Maximum Transmission Unit)是指网络链路层能够传输的最大数据包的大小,单位是字节。不同的物理网络有不同的MTU值,例如以太网的MTU是1500字节。

IP分片操作是指当IP层要发送的数据包的长度超过了链路层的MTU值时,就需要将数据包切分成多个小的片段,每个片段的长度都小于或等于MTU值,然后在目的主机重新组合成原始的数据包。IP分片操作需要修改数据包的首部中的标志、分片偏移和总长度字段,以便于重组。

比如在终端中使用命令:ping -n 1 -l 1500
这条命令会向主机192.168.22.3发送一个长度为1500字节的数据包,如果链路层的MTU值小于1500字节,那么这个数据包就会被分片。

如图所示:
Alt text