ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
它是TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。ICMP报文在IP帧结构的首部协议类型字段(Protocol 8bit)的值=1.
ICMP包有一个8字节长的包头,其中前4个字节是固定的格式,包含8位类型字段,8位代码字段和16位的校验和;后4个字节根据ICMP包的类型而取不同的值。
ICMP原理
ICMP提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。
我们在网络中经常会使用到ICMP协议,比如我们经常使用的用于检查网络通不通的Ping命令(Linux和Windows中均有),这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的网络命令如跟踪路由的Tracert命令也是基于ICMP协议的。
ping 的原理
ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。
ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。在Unix/Linux,序列号从0开始计数,依次递增。而Windows ping程序的ICMP序列号是没有规律。
ICMP协议在实际传输中数据包:20字节IP首部 + 8字节ICMP首部+ 1472字节<数据大小>38字节
ICMP报文格式:IP首部(20字节)+8位类型+8位代码+16位校验和+(不同的类型和代码,格式也有所不同)
Ping工作过程
假定主机A的IP地址是192.168.1.1,主机B的IP地址是192.168.1.2,都在同一子网内,则当你在主机A上运行“Ping 192.168.1.2”后,都发生了些什么呢?
首先,Ping命令会构建一个固定格式的ICMP请求数据包,然后由ICMP协议将这个数据包连同地址“192.168.1.2”一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程),IP层协议将以地址“192.168.1.2”作为目的地址,本机IP地址作为源地址,加上一些其他的控制信息,构建一个IP数据包,并在一个映射表中查找出IP地址192.168.1.2所对应的物理地址(也叫MAC地址,熟悉网卡配置的朋友不会陌生,这是数据链路层协议构建数据链路层的传输单元——帧所必需的),一并交给数据链路层。后者构建一个数据帧,目的地址是IP层传过来的物理地址,源地址则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。
其中映射表由ARP实现。ARP(Address Resolution Protocol)是地址解析协议,是一种将IP地址转化成物理地址的协议。ARP具体说来就是将网络层(IP层,也就是相当于OSI的第三层)地址解析为数据连接层(MAC层,也就是相当于OSI的第二层)的MAC地址。
主机B收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合,则接收;否则丢弃。接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的IP层协议。同样,IP层检查后,将有用的信息提取后交给ICMP协议,后者处理后,马上构建一个ICMP应答包,发送给主机A,其过程和主机A发送ICMP请求包到主机B一模一样。
即先由IP地址,在网络层传输,然后再根据mac地址由数据链路层传送到目的主机
1.IMCP协议介绍
前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。
当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建立在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前 16bit就组成了ICMP所要传递的信息。
尽管在大多数情况下,错误的包传送应该给出ICMP报文,但是在特殊情况下,是不产生ICMP错误报文的。如下
ICMP差错报文不会产生ICMP差错报文(出IMCP查询报文)(防止IMCP的无限产生和传送)
目的地址是广播地址或多播地址的IP数据报。
作为链路层广播的数据报。
不是IP分片的第一片。
源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址。
虽然里面的一些规定现在还不是很明白,但是所有的这一切规定,都是为了防止产生ICMP报文的无限传播而定义的。
ICMP协议大致分为两类,一种是查询报文,一种是差错报文。其中查询报文有以下几种用途:
ping查询
子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)
时间戳查询(可以用来同步时间)
而差错报文则产生在数据传送发生错误的时候。就不赘述了。
2.ICMP的应用--ping
ping可以说是ICMP的最著名的应用,当我们某一个网站上不去的时候。通常会ping一下这个网站。ping会回显出一些有用的信息。一般的信息如下:
Reply from 10.10.24.1: bytes=32 time<1ms TTL=255
Ping statistics for 10.10.24.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
ping这个单词源自声纳定位,而这个程序的作用也确实如此,它利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请 求,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。我们可以看到, ping给出来了传送的时间和TTL的数据。我给的例子不太好,因为走的路由少,有兴趣地可以ping一下国外的网站比如sf.net,就可以观察到一些 丢包的现象,而程序运行的时间也会更加的长。
ping还给我们一个看主机到目的主机的路由的机会。这是因为,ICMP的ping请求数据报在每经过一个路由器的时候,路由器都会把自己的ip放到该数 据报中。而目的主机则会把这个ip列表复制到回应icmp数据包中发回给主机。但是,无论如何,ip头所能纪录的路由列表是非常的有限。如果要观察路由, 我们还是需要使用更好的工具,就是要讲到的Traceroute(windows下面的名字叫做tracert)。
3.ICMP的应用--Traceroute
Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。前面说到,尽管ping工具也可以进行侦测,但是,因为ip头的限制,ping不能完全的记录下所经过的路由器。所以Traceroute正好就填补了这个缺憾。
Traceroute的原理是非常非常的有意思,它受到目的主机的IP后,首先给目的主机发送一个TTL=1(还记得TTL是什么吗?)的UDP(后面就 知道UDP是什么了)数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据 报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器ip。从而避开了ip头只能记录有限路由IP的问题。
有人要问,我怎么知道UDP到没到达目的主机呢?这就涉及一个技巧的问题,TCP和UDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较 小的端口,比如说80,比如说23,等等。而traceroute发送的是端口号>30000(真变态)的UDP报,所以到达目的主机的时候,目的 主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道,主机到了。
相关推荐
标题中的“基于ICMP的ping程序”是指使用Internet控制消息协议(ICMP)来实现的网络诊断工具,类似于我们常见的Windows系统自带的`ping`命令。这个程序的主要目的是检查网络连通性,通过向目标主机发送ICMP回显请求...
通过理解ICMP协议的工作原理,熟悉网络编程,特别是socket接口的使用,你就能构建出自己的pingy命令,实现网络诊断的功能。这不仅是一个学习网络协议和编程的好实践,还能帮助你更好地理解和解决网络相关的问题。
标题 "java_icmp_ping" 涉及到的是一个使用Java编程语言开发的项目,它实现了基于ICMP(Internet Control Message Protocol,互联网控制消息协议)的“ping”功能,类似于我们在Windows系统中使用的命令行工具“ping...
在本文中,我们将深入探讨基于ICMP协议的两个关键网络诊断工具——Ping和Traceroute,以及它们的工作原理和实现过程。 1. **Ping命令工作原理**: Ping命令是通过发送ICMP的Echo Request报文来测试网络连接的...
本主题聚焦于使用Verilog实现ICMP(Internet Control Message Protocol)协议,以及如何在FPGA上构建一个简单的“ping”功能。 ICMP是TCP/IP协议族中的一个重要部分,它主要用于网络诊断和错误报告。当数据包在网络...
ping命令的工作原理是发送一个ICMP回显请求(echo request)报文到目标主机,然后等待并接收目标主机返回的ICMP回显应答(echo reply)报文。这个过程主要涉及到以下步骤: 1. **创建原始套接字**:在程序中,我们...
标题中的"icmp.rar_Ping icmp C#_icmp_ping icmp_trace"揭示了这个压缩包内容主要涉及的是使用C#编程语言实现ICMP协议的Ping和Traceroute功能。ICMP(Internet Control Message Protocol)是互联网控制报文协议,...
ICMP Ping程序的工作原理如下: 1. 发送请求:程序发送一个包含特定标识的ICMP Echo Request报文到目标主机。这个报文由IP数据包封装,其中包含源和目标的IP地址。 2. 网络传输:数据包通过网络传输,可能会经过多个...
"TCP/IP协议栈ICMP协议源码.txt"可能包含的是实现ICMP协议的源代码,这对于理解ICMP的工作原理、调试网络问题以及开发网络应用非常有帮助。源码通常会展示ICMP报文的解析、构造过程,以及如何处理不同类型的ICMP消息...
ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,ping使用的协议是TCP/IP的互联网控制消息协议(Internet Control Message Protocol)ICMP...
实现发送ICMP封包,相当于WINDOWS命令PING的实现原理。
ICMP Ping程序的工作原理是:向目标主机发送一个ICMP回显请求报文,然后等待目标主机的回应。如果收到回应,那么就可以认为网络是连通的。这个过程可以通过以下步骤实现: 1. 初始化Winsock库:在程序启动时,需要...
3. **构建ICMP报文**:构造ICMP Echo Request报文,包括ICMP头(类型、代码、校验和)和数据部分(通常为“PING”字符串)。计算校验和时需要包括IP伪头部。 4. **发送ICMP报文**:使用`sendto()`函数将构造好的...
**Ping的工作原理**: 1. 发送:用户在命令行输入ping命令,指定目标主机的IP地址或域名。 2. 包构建:ping工具创建一个包含随机数据的ICMP回显请求报文,并附加源IP地址、源端口、目标IP地址和目标端口。 3. 发送...
本文将深入探讨`ping`命令的工作原理,以及如何在Delphi7环境下实现一个基于ICMP的`ping`功能。 ### ICMP简介 Internet控制消息协议(ICMP)是TCP/IP协议族的一部分,主要用于在IP网络中传递错误和控制信息。当网络...
标题中的"ICMP.zip_ping...学习和理解这样的源代码可以帮助开发者深入理解网络协议的工作原理,特别是ICMP如何在网络中起到诊断和故障排除的作用。此外,对于网络编程和系统工具开发来说,这是一次宝贵的实践机会。
本文将深入探讨如何使用C++语言来实现ping功能,涉及的知识点包括IP头部、ICMP协议以及数据包的状态跟踪。 首先,我们要理解ping的工作原理。ping基于Internet控制消息协议(ICMP),它发送一个echo请求到目标主机...
例如,当一个IP数据包无法到达目的地时,路由器或者目标主机可能会发送一个ICMP回显请求(Echo Request)或ICMP回显应答(Echo Reply),这就是ping命令的工作原理。 Ping程序通常包含以下几个关键部分: 1. **...
8. 实验步骤:实验步骤包括了解ICMP原理、掌握相关软件编程知识、设计程序完成PING命令、完成实验报告等。 9. 实验环境:实验环境包括计算机一台,MyEclipse 7.0编程软件等。 10. 实验目的:实验目的包括掌握ICMP...
4. **网络编程**:编写这样的ping程序需要对网络编程有深入理解,包括TCP/IP协议栈的工作原理、数据包的封装与解封装过程、以及如何正确处理网络I/O等。 5. **错误处理与调试**:在实际开发过程中,需要考虑到各种...