ICMP
先来看看ICMP协议的全程 : Internet Control Message Protocol ,用大中文翻译就是互联网控制信息协议,核心二字在于控制.
- 因此ICMP协议在互联网整个架构中,发挥着处理网络各种信息的功能和作用,至于具体的功能和作用:
1.ICMP的认知
ICMP和IP协议一样,本身都工作在网络层,因此面对网络包的传输过程,尤为的重要,比如IP数据包是否成功到达主机
,IP数据包是否丢失
,网络相关问题
,因此了解ICMP头部有助于理解ICMP协议是如何工作的:
而ICMP包头的类型大致可分为两类:
- 查询报文类型
- 差错报文类型
1.1查询报文类型
回送消息: 0和8
回显请求(Echo Request)和回显回答(Echo Reply):用于测试主机的可达性和测量往返时间(RTT)。
回送回答 | 回送请求 |
---|---|
TYPE: 0 | TYPE : 8 |
当我们使用ping
命令去测试两台主机之间是否互通时,往往还能看到序号和RTT,以及应用进程的PID号,因此,在发送回送消息时,还会添加额外的字段去用来标识这个通信过程的一些具体信息.
- 除此之外还有着例如:
时间戳请求
和时间戳应答
一类的查询报文,其目的就是为了查询目的主机的当时时间,前者type:13,后者type:14 - 除此之外还有着例如:
地址掩码请求
和地址掩码回答
这一类的查询报文,其目的也很明了,是为了查询目的主机的地址掩码信息的,前者tpye:17,后者type:18.
1.2差错报文类型
差错报文类型的情况就比较错综复杂了.
- 目标不可达:type:3
而目标不可达的原因则需要具体问题具体分析,而ICMP中的另一个字段code
段则描述了不可达的具体信息,具体来说,目标不可达有以下几种:
- 代码0:网络不可达(Network Unreachable):指示目标网络无法到达,可能是由于路由表中缺少有效路径。
- 代码1:主机不可达(Host Unreachable):指示目标主机无法到达,可能是由于目标主机未连接到网络或关闭了。
- 代码2:协议不可达(Protocol Unreachable):指示目标主机上不支持所需协议,无法到达目标。
- 代码3:端口不可达(Port Unreachable):指示目标主机上指定的端口未打开或不可用。
- 代码4:需要进行分片但设置不允许(Fragmentation Needed but Don't Fragment Flag Set):指示数据包的大小超过了路径中的最大传输单元(MTU),需要进行分片,但数据包的"不分片"(DF)标志被设置。
- 原点抑制:type:4
也叫源抑制,其实是因为网络拥塞的情况,ICMP选择回绝你的消息而选择的一种差错报文类型,一般情况下,不适用,现代网络中显得很鸡驻这个差错控制
- 重定向:type:5
这个控制字段也..挺鸡驻的其实,因为重定向的字段的设计理念是为了以一种更优的路线去选择下一跳,通过发送重定向消息,路由器可以向发送方提供有关更好的路由选择的信息,从而改善网络的性能和效率。但是现在路由都具备更高级的路由协议,且时时刻刻动态变化,因此这种使用也比较少.
- 超时:type:11
这个字段跟IP数据包中的TTL字段有关,也就是每经过一跳,其生存周期TTL就会减1,当减到0时,相应的路由就会发送差错报文去即时的反馈.
2.ping原理的抓包过程
其实查询报文类型就是ping过程的基本原理,通过wireshark去抓包测试就能够直接明白:
-
使用
ping
命令去测试一个地址,这里我以百度为例Pinging www.baidu.com [110.242.68.3] with 32 bytes of data: Reply from 110.242.68.3: bytes=32 time=30ms TTL=51 Reply from 110.242.68.3: bytes=32 time=32ms TTL=51 Reply from 110.242.68.3: bytes=32 time=30ms TTL=51 Reply from 110.242.68.3: bytes=32 time=31ms TTL=51 Ping statistics for 110.242.68.3: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 30ms, Maximum = 32ms, Average = 30ms
-
通过wireshark可以清晰看到:
选取第一个请求报文展开查看:
可以很清楚德看到请求类型为8,而ICMP处了头部字段还有标识和序号字段,标识字段用来区分是哪个应用进程发送的ICMP包,而序号就很清楚了,为了确认网络包是否有丢失,每次增加1.
-
由此可见发送ICMP包的时候仅仅只设计物理层数据链路层和网络层的IP协议,每一栏单独展开都是相应的层面所携带的信息
以下是ICMP应答报文的内容
-
如果出现了超时的情况:
- TYPE:11,表示超时,且应答的ICMP报文没有respone内容
3.tracert/tracerout原理的抓包过程
-
使用命令:
Tracing route to www.a.shifen.com [110.242.68.4] over a maximum of 30 hops: 1 4 ms 1 ms <1 ms 192.168.0.1 2 4 ms 5 ms 2 ms 10.251.0.1 3 2 ms 7 ms 2 ms 125.222.18.17 4 5 ms 4 ms 4 ms 124.93.203.217 5 30 ms 15 ms 5 ms 124.93.203.181 6 17 ms 8 ms 9 ms 61.189.71.101 7 46 ms 38 ms 39 ms 113.230.183.89 8 * * * Request timed out. 9 26 ms 25 ms 24 ms 110.242.66.182 10 27 ms 27 ms 26 ms 221.194.45.130 11 * * * Request timed out. 12 * * * Request timed out. 13 * * * Request timed out. 14 25 ms 25 ms 24 ms 110.242.68.4 Trace complete.
这个命令其实本质上也是通过ICMP去实现的,不过他是用来跟踪包的路径.其大致过程如下所示:
-
可以看到其实有很多重复传送的ICMP请求报文,而传送的ttl是从1开始的,这也就是tracert命令实现的原理,这样在每经过一个路由器时就会返回一个超时的ICMP报文.
但是为什么在TTL限制的情况下还要多次发送,这就是另一个不可达的问题,比如这几次传送请求报文的过程中,发送方如何知道自己发送的目的包到达主机?
其实原理就是通过一个不可能的端口发送个路由器,当目的主机,收到 UDP 包后,会返回 ICMP 差错报文消息,但这个差错报文消息的类型是端口不可达。
同样,多次传送处了为了确定目标主机其实另一个原因可能是因为网络层需要参考MTU
,即其实每一个路由器的MTU
其实是不一样的,为了事先知道每个路由器的数据接受能力,可以多次发送来确定.