ICMP (互联网控制消息协议 )是什么

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

互联网控制消息协议(英语:Internet Control Message Protocol,缩写:ICMP)是互联网协议族的核心协议之一。

它用于TCP/IP网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使管理者可以对所发生的问题作出诊断,然后采取适当的措施解决。

ICMP 依靠IP来完成它的任务,它是IP的主要部分。它与传输协议(如TCP和UDP)显著不同:它一般不用于在两点间传输数据。它通常不由网络程序直接使用,除了ping和traceroute这两个特别的例子。 IPv4中的ICMP被称作ICMPv4,IPv6中的ICMP则被称作ICMPv6。

技术细节

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)消息来实现的。

ICMP报文结构

报头

ICMP报头从IP报头的第160位开始(IP首部20字节)(除非使用了IP报头的可选部分)。

Bits160-167168-175176-183184-191
160TypeCode校验码(checksum)
192ID序号(sequence)
  • Type - ICMP的类型,标识生成的错误报文;
  • Code - 进一步划分ICMP的类型,该字段用来查找产生错误的原因.;例如,ICMP的目标不可达类型可以把这个位设为1至15等来表示不同的意思。
  • Checksum - 校验码部分,这个字段包含有从ICMP报头和数据部分计算得来的,用于检查错误的数据,其中此校验码字段的值视为0。
  • ID - 这个字段包含了ID值,在Echo Reply类型的消息中要返回这个字段。
  • Sequence - 这个字段包含一个序号,同样要在Echo Reply类型的消息中要返回这个字段。

 

填充数据

填充的数据紧接在ICMP报头的后面(以8位为一组):

  • Linux的"ping"工具填充的ICMP除了8个8位组的报头以外,默认情况下还另外填充数据使得总大小为64字节。
  • Windows的"ping.exe"填充的ICMP除了8个8位组的报头以外,默认情况下还另外填充数据使得总大小为40字节。

 

报文类型

类型代码状态描述查询差错
0 - Echo Reply0 echo响应 (被程序ping使用) 
1 and 2 未分配保留 
3 - 目的不可达0 目标网络不可达 
1 目标主机不可达 
2 目标协议不可达 
3 目标端口不可达 
4 要求分段并设置DF flag标志 
5 源路由失败 
6 未知的目标网络 
7 未知的目标主机 
8 源主机隔离(作废不用) 
9 禁止访问的网络 
10 禁止访问的主机 
11 对特定的TOS 网络不可达 
12 对特定的TOS 主机不可达 
13 由于过滤 网络流量被禁止 
14 主机越权 
15 优先权终止生效 
4 - 源端关闭0弃用源端关闭(拥塞控制) 
5 - 重定向0 重定向网络 
1 重定向主机 
2 基于TOS 的网络重定向 
3 基于TOS 的主机重定向 
6 弃用备用主机地址  
7 未分配保留  
8 - 请求回显0 Echo请求 
9 - 路由器通告0 路由通告 
10 - 路由器请求0 路由器的发现/选择/请求 
11 - ICMP 超时0 TTL 超时 
1 分片重组超时 
12 - 参数问题:错误IP头部0 IP 报首部参数错误 
1 丢失必要选项 
2 不支持的长度  
13 - 时间戳请求0 时间戳请求 
14 - 时间戳应答0 时间戳应答 
15 - 信息请求0弃用信息请求 
16 - 信息应答0弃用信息应答 
17 - 地址掩码请求0弃用地址掩码请求 
18 - 地址掩码应答0弃用地址掩码应答 
19 保留因安全原因保留  
20 至 29 保留Reserved for robustness experiment  
30 - Traceroute0弃用信息请求  
31 弃用数据报转换出错  
32 弃用手机网络重定向  
33 弃用Where-Are-You(originally meant for IPv6)  
34 弃用Here-I-Am(originally meant for IPv6)  
35 弃用Mobile Registration Request  
36 弃用Mobile Registration Reply  
37 弃用Domain Name Request  
38 弃用Domain Name Reply  
39 弃用SKIP Algorithm Discovery Protocol, Simple Key-Management for Internet Protocol  
40  Photuris, Security failures  
41 实验性的ICMP for experimental mobility protocols such as Seamoby [RFC4065]  
42 到 255 保留保留  
235 实验性的RFC3692( RFC 4727)  
254 实验性的RFC3692( RFC 4727)  
255 保留保留

 

 

 

特别说明:以上内容大部分收集、整理自**百科。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

股票数据相关性分析

导入相关包 import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.collections import LineCollection import akshare as ak from sklearn import cluster, covariance, manifold %matplotlib inline #Jupyter Notebook显示图形专用 plt…

分享一个辅助分析内存泄漏的脚本

最近给系统做了一点优化,前几天去查看系统监控,想看看上线前后cpu使用率曲线变化情况。查看的时候意外发现上线前后内存占用相差不少,20%以上。 本来我没怎么在意这个问题,因为我们系统会在运行过程中缓存部分数据内容。但客户觉得…

windows Virtualbox下配置Ubuntu,且用ssh连接

1、软件介绍 1)virtualbox 5.2.22 2)Ubuntu 18.04 3)git bash 2、virtualbox设置 安装完Ubuntu后点击该镜像的设置,依次点击“网络”——“端口转发” 将主机端口设置为一个闲置端口,子系统端口也就是Ubuntu端口设置…

专访刘伟:软件开发人员的内功修炼之道

摘要:数学修养对软件开发之路起着什么作用?码农如何修炼自己的内功并成长为优秀的软件开发员?带着相关思考,社区之星第10期采访了中南大学副教授——刘伟。他对数学修养、设计模式、软件架构和重构方面的独特见解,相信…

多线程数据下载(akshare)

import akshare as ak import pandas as pd from multiprocessing.dummy import Pool as ThreadPool import datetime import timedef get_hs300_stock_codes():获取沪深300股票代码列表:return:hs300ak.index_stock_cons_sina("000300")codeshs300[code]codescodes.…

MongoDB 4.6.1 c++ driver 编译

版权声明:本文为博主原创文章,未经博主同意不得转载。https://blog.csdn.net/sheismylife/article/details/25512251 这个版本号已经和之前不一样了。有专门的github的项目。https://github.com/mongodb/mongo-cxx-driver首先获取源码:git cl…

地址解析协议 (ARP) 是什么

地址解析协议 (ARP) 是通过解析网路层地址来找寻数据链路层地址的一个在网络协议包中极其重要的网络传输协议。 ARP是通过网络地址(例:IPv4)来定位MAC地址 (也称为乙太地址)。 ARP已经在很多网路层和数据链接层之间得以实现,包括IPv4,Chaosn…

04.React事件 方法、 React定义方法的几种方式 获取数据 改变数据 执行方法传值...

2019独角兽企业重金招聘Python工程师标准>>> 一.基本用法 在以类继承的方式定义的组件中,为了能方便地调用当前组件的其他成员方法或属性(如:this.state),通常需要将事件处理函数运行时的 this 指向当前组件…

代码之美——Doom3源代码赏析

摘要:Dyad作者、资深C工程师Shawn McGrathz在空闲时翻看了Doom3的源代码,发出了这样的惊叹:“这是我见过的最整洁、最优美的代码!”“Doom 3的源代码让我对那些优秀的程序员刮目相看。”因此有了本文。 背景介绍: Doom…

UDP:用户数据报协议 是什么

用户数据报协议(英语:User Datagram Protocol,缩写为UDP),又称用户数据报文协议,是一个简单的面向数据报的传输层协议,正式规范为RFC 768。在TCP/IP模型中,UDP为网络层以上和应用层以…

随想录(程序员和收入)

距离上一次写博客已经很长时间了,大约过了三个星期。这三个星期发生了很多事情,这中间也有我自己的思考积累,也有工作上的变故。总之,自己想了很多,也得到了很多。每到这个时候,毕业生朋友们都在寻找工作&a…

iOS进阶之正则表达式

最近一直在弄正则表达式,于是在这里整理一下,便于日后查阅。 1、常用符号 ^:字符串的开始$:字符串的结束*:表示零个或若干个?:表示零个或一个:表示一个或若干个| :表示 或 操作. &a…

akshare分析涨停板股票数据

导入包,获取日期数据 import pandas as pd import numpy as np import akshare as ak #画图 import matplotlib.pyplot as plt #正确显示中文和负号 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]False #处理时间 from dateutil.parser…

DNS(域名系统) 是什么

域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。 它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 DNS使用TCP和UDP端口53。当前,对于每一级域…

《The Art of Readable Code》学习笔记(一)

放寒假回家有些颓废,就是不想看书。但是已经大三了,春节过后就要找实习了。哎,快乐的大学生活终于要过去了。 先从简单的书看起吧!在图书馆借了本《The Art of Readable Code》,就是教你咋写好优雅的代码的&#xff0c…

文件基本处理

1 打开文件,将文件句柄赋值给一个变量 2 拿句柄对文件进行操作 3 关闭文件 将一个文件第一行写道另外一个文件 f open("test","r",encoding"utf-8") # open找的是系统的编码 x f.readlines() f.close() f1 open("test1"…

C++ ofstream和ifstream详细用法

ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; 在C中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符&…

如何将JAR包发布到Maven中央仓库?

将jar包发布到Maven中央仓库(Maven Central Repository)&#xff0c;这样所有的Java开发者都可以使用Maven直接导入依赖&#xff0c;例如fundebug-java&#xff1a; <!-- https://mvnrepository.com/artifact/com.fundebug/fundebug-java --> <dependency><grou…

SSH、SSL与HTTPS

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 关于加密 在解释SSH、SSL与HTTPS协议之前我先介绍一下非对称加密协议。在1976年以前&#xff0c;所有的加密都采用对称加密&#xff0c…

北向资金运作akshare

import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline from pylab import mpl mpl.rcParams[font.sans-serif][SimHei] mpl.rcParams[axes.unicode_minus]False#获取交易日历 import datetime def get_cal_date(start,end):dates ak.to…