第24章 RL-TCPnet之网络控制报文协议ICMP
本章节为大家讲解ICMP(Internet Control Message Protocol,网络控制报文协议),通过前面章节对TCP和UDP的学习,需要大家对ICMP也有个基础的认识。
(本章的知识点主要整理自网络)
24.1 初学者重要提示
24.2 ICMP基础知识参考资料
24.3 ICMP基础知识点
24.4 ICMP函数
24.5 总结
24.1 初学者重要提示
通过前面几个章节对TCP和UDP的学习,需要初学者对ICMP的基础知识点也有个认识。
24.2 ICMP基础知识参考资料
为了对TCP和UDP有更全面的认识,需要对ICMP协议的一些基础知识有个了解。大家可以从以下地址获得ICMP协议基础知识:
- RFC792地址 : ftp://ftp.rfc-editor.org/in-notes/rfc792.txt 。
- wiki百科中文版:地址链接(这个是超链接)
- wiki百科英文版:地址链接(这个是超链接)
- 百度百科:地址链接(这个是超链接)
对于初学者来说,学习上面四个参考资料就够了。如果大家有网络方面的书籍,比如《TCP/IP详解》,也可以直接看书籍中这方面的内容。
24.3 ICMP基础知识点
(这里的知识点整理自上面的参考资料地址)
教程这里也对ICMP的基础知识做个介绍,方便大家先有个大概的认识。
24.3.1 ICMP简要说明
ICMP(Internet Control Message Protocol,网络控制报文协议)是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。
它是TCP/IP协议族的一个子协议,属于网络层协议,主要用于在主机与路由器之间传递控制信息,控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。
ICMP提供了易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。
我们在网络中经常会使用到ICMP协议,比如我们经常使用的用于检查网络通不通的Ping命令(Linux和Windows中均有),这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的网络命令如跟踪路由的Tracert命令也是基于ICMP协议的。
24.3.2 ICMP协议功能
从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性﹐其功能主要有:
- 侦测远端主机是否存在。
- 建立及维护路由资料。
- 重导资料传送路径(ICMP重定向)。
- 资料流量控制。
ICMP在沟通之中,主要是透过不同的类别(Type)与代码(Code) 让机器来识别不同的连线状况。ICMP 是个非常有用的协议,尤其是当我们要对网路连接状况进行判断的时候。
24.3.3 ICMP技术细节
ICMP是在RFC 792中定义的互联网协议族之一。通常用于返回的错误信息或是分析路由。ICMP错误消息总是包括了源数据并返回给发送者。ICMP错误消息的例子之一是TTL值过期。每个路由器在转发数据报的时候都会把IP包头中的TTL值减1。如果TTL值为0,“TTL在传输中过期”的消息将会回报给源地址。每个ICMP消息都是直接封装在一个IP数据包中的,因此,和UDP一样,ICMP是不可靠的。
虽然ICMP是包含在IP数据包中的,但是对ICMP消息通常会特殊处理,会和一般IP数据包的处理不同,而不是作为IP的一个子协议来处理。在很多时候,需要去查看ICMP消息的内容,然后发送适当的错误消息到那个原来产生IP数据包的程序,即那个导致ICMP讯息被传送的IP数据包。
很多常用的工具是基于ICMP消息的。traceroute是通过发送包含有特殊的TTL的包,然后接收ICMP超时消息和目标不可达消息来实现的。ping则是用ICMP的Echo request(类别代码:8)和Echo reply(类别代码:0)消息来实现的。
24.3.4 ICMP报文格式
1、报头
ICMP报头从IP报头的第160位开始(除非使用了IP报头的可选部分)。
![](https://i-blog.csdnimg.cn/blog_migrate/a91d4f429156772779702119bde8894c.png)
- Type - ICMP的类型,标识生成的错误报文。
- Code - 进一步划分ICMP的类型,该字段用来查找产生错误的原因,例如,ICMP的目标不可达类型可以把这个位设为1至15等来表示不同的意思。
- Checksum - 校验码部分,这个字段包含有从ICMP报头和数据部分计算得来的,用于检查错误的数据,其中此校验码字段的值视为0。
- ID - 这个字段包含了ID值,在Echo Reply类型的消息中要返回这个字段。
- Sequence - 这个字段包含一个序号,同样要在Echo Reply类型的消息中要返回这个字段。
2、填充数据
填充的数据紧接在ICMP报头的后面(以8位为一组):
- Linux的"ping"工具填充的ICMP除了8个8字节的报头以外,默认情况下还另外填充数据使得总大小为64字节。
- Windows的"ping.exe"填充的ICMP除了8个8字节的报头以外,默认情况下还另外填充数据使得总大小为40字节。
24.3.5 ICMP报文类型
ICMP报文类型列表内容较多,我们这里不再列出来了,大家可以直接看本章24.2小节里面给的参考资料。
24.4 ICMP函数
关于ICMP,RL-TCPnet提供了如下一个函数:
- icmp_ping
函数功能:通过这个函数就可以实现类似电脑端的ping功能。注意,这个函数不支持重入,也就是不支持多任务。
关于这个函数的详细讲解及其使用举例可以看教程第 3 章 3.4 小节里面说的参考资料 rlarm.chm 文件,我们这里就不再专门做例子进行说明了:
24.5 总结
本章节就为大家讲解这么多,更多ICMP的相关知识需要大家查阅相关书籍进行学习,或者网上搜索相关资料进行学习。