ICMP
掌握ICMP的功能和应用,并且了解一下ICMP的消息类型,可能在选择题中考察。
ICMP(Internet Control Message Protocol)是一个网络层协议,用于在IP主机和路由器之间发送控制消息。ICMP是Internet协议套件的一个重要组成部分,它主要用于诊断和报告网络中的错误和某些特定条件。
首部
- 类型
(Type)
: 8 位- 用于指定 ICMP 消息的类型。例如,
Echo Request
的类型为8
,Echo Reply
的类型为 0 。
- 用于指定 ICMP 消息的类型。例如,
- 代码
(Code)
: 8 位- 为更进一步细分某个特定类型的 ICMP 消息而设置。例如,对于“目的地不可达”(
Destination Unreachable
)类型的消息,代码可以用来指定具体的不可达原因,如网络不可达、主机不可达等。
- 为更进一步细分某个特定类型的 ICMP 消息而设置。例如,对于“目的地不可达”(
- 检验和
(Checksum)
: 16 位- 用于验证 ICMP 消息在传输过程中没有被损坏。这个检验和涵盖了整个 ICMP 消息。
- 其它字段
- 这些字段的内容取决于 ICMP 消息的类型和代码。例如,对于
Echo Request
和Echo Reply
消息,接下来的字段包括一个标识符(Identifier
)和一个序列号(Sequence Number
)。
- 这些字段的内容取决于 ICMP 消息的类型和代码。例如,对于
消息类型
这里不需要背,了解消息类型的含义即可,比方说给你一个消息类型源点抑制,你能知道它是干嘛的就行。
Echo Request
和Echo Reply (ping)
Echo Request:
通常被称为ping
请求。用于测试目的地是否可达。Echo Reply:
通常被称为ping
回应。是对Echo Request
的回应。
Destination Unreachable
- 当数据不能被传送到目的地时,发送此消息。
- 下面是一些常见的“不可达”子类型:
Network Unreachable:
无法到达目标网络。Host Unreachable:
无法到达目标主机。Protocol Unreachable:
目标网络不支持所请求的协议。Port Unreachable:
目标主机上的特定端口不可用。Fragmentation Needed and Don
’t Fragment was Set:
数据包太大,需要分片,但数据包的“不分片”标志已设置。Source Route Failed:
源路由指定的路径失败。Network Unknown:
目标网络未知。Host Unknown:
目标主机未知。
Source Quench
(源点抑制)- 网络中出现拥塞,请发送主机放慢发送数据包的速度。
Redirect
- 告诉发送主机存在更好的路由。
Time Exceeded
- 当数据包在网络中传输的时间太长或超过了其
TTL
(生存时间)时发送。有两种主要的子类型: TTL Exceeded in Transit:
数据包在传输过程中TTL
达到零。Fragment Reassembly Time Exceeded:
分片重新组装超时。
- 当数据包在网络中传输的时间太长或超过了其
Parameter Problem
- 当
IP
头包含错误或不可识别的信息时,发送此消息。
- 当
Timestamp Request and Timestamp Reply
- 用于报告当前的时间。
Address Mask Request and Address Mask Reply
- 用于请求和响应子网地址掩码。
应用
这里需要了解基于 ICMP 协议的两个 linux 程序,一个是 ping,大家应该都比较熟悉。 另一个是 traceroute,用于寻找从起点到终点经过了哪些 IP 地址。
ping
ping
主要使用两种 ICMP 消息:Echo Request 和 Echo Reply。- 当您执行
ping
命令时,您的计算机发送一个 ICMP Echo Request 消息到指定的目标。 - 如果目标主机可达并运行,它会返回一个 ICMP Echo Reply 消息。
ping
工具记录这两个消息之间的时间差,即往返时间(RTT),并将其显示给用户。
traceroute
traceroute
的目标是确定数据包从源计算机到目标计算机的路径中的所有中间跃点(通常是路由器)。- 它的工作原理基于 IP 数据包的 TTL(Time-to-Live) 字段。TTL 是每个 IP 数据包都有的字段,它在每次数据包经过一个路由器时减少1,当 TTL 达到0时,该数据包就被丢弃,并向源发送一个 ICMP Time Exceeded 消息。
- 当开始执行
traceroute
时,第一个数据包的 TTL 被设置为 1。这意味着第一个路由器将丢弃它并发送一个 Time Exceeded 消息。这个消息告诉traceroute
第一个路由器的位置。 - 接下来,
traceroute
发送一个 TTL 为 2 的数据包。这次,第二个路由器会丢弃数据包并发送 Time Exceeded 消息。这个过程继续,直到数据包到达目标,目标返回一个 ICMP Echo Reply 消息。 - 通过逐步增加 TTL 值并监听 Time Exceeded 和 Echo Reply 消息,
traceroute
能够映射出到目标的完整路径。