Networking - ICMP 协议
发送到远程计算机的数据通常发经过一个或多个路由器,这些路由器在把数据传输到最终目的地的过程中可能发生多种问题。路由器利用 ICMP 把问题通知给源 IP。ICMP 还有用于其他调试和排错的功能。
ICMP 报文格式
ICMP 报文格式如下:
| Type | Code | Checksum | 
| Rest of Header | ||
| Data | ||
Type: 该字段有 1 个字节,表示特定类型的 ICMP 报文。
Code: 该字段有 1 个字节,进一步细分 ICMP 的类型。
Rest of Header: 不同类型的 ICMP 报文有不同的内容。
Data: 数据载荷。
ICMP 类型
| 类型 代码 描述 | 查询 | 差错 | 
| 0 0 回显应答 | Y | |
| 
    3                         目的不可达 
3 0 网络不可达 3 1 主机不可达 3 2 协议不可达 3 3 端口不可达 3 4 需要进行分片但设置不分片比特 3 5 源站选路失败 3 6 目的网络未知 3 7 目的主机未知 3 8 源主机被隔离(作废不用) 3 9 目的网络被强制禁止 3 10 目的主机被强制禁止 3 11 由于服务类型 TOS,网络不可达 3 12 由于服务类型 TOS,主机不可达 3 13 由于过滤,通信被强制禁止 3 14 主机越权 3 15 优先中止生效  | 
Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y  | 
|
| 4 0 源端被关闭(基本流控制) | Y | |
|    5                         重定向 5 0 对网络重定向 5 1 对主机重定向 5 2 对服务类型和网络重定向 5 3 对服务类型和主机重定向  | 
Y Y Y Y  | 
|
| 8 0 回显请求 | Y | |
| 9 0 路由器通告 | Y | |
| 10 0 路由器请求 | Y | |
|   11                        超时 11 0 传输期间生存时间为 0 11 1 在数据报组装期间生存时间为 0  | 
Y Y  | 
|
|   12                        参数问题 12 0 坏的 IP 首部(包括各种差错) 12 1 缺少必需的选项  | 
Y Y  | 
|
| 13 0 时间戳请求(作废不用) | Y | |
| 14 0 时间戳应答(作废不用) | Y | |
| 15 0 信息请求(作废不用) | Y | |
| 16 0 信息应答(作废不用) | Y | |
| 17 0 地址掩码请求 | Y | |
| 18 0 地址掩码应答 | Y | 
常见的 IMCP 消息
Echo Request(回显请求)和 Echo Reply(回显应答)
ICMP 经常被用语测试,比如测试连接的 ping 命令实际上就是在使用 ICMP。ping 向某个 IP 地址发送一个 Echo Request,目的计算机接收到该 ICMP 包后,会响应一个 Echo Reply。ping 命令是常用的网络连通性测试工具,如果成功地 ping 到某个 IP 地址,那么使用其他网络协议的通信方式也很有可能成功。
Source Quench(源抑制)
如果一台高速计算机向远程计算机发送大量数据,可能会使路由器产生过载。这时路由器可以利用 ICMP 向源 IP 发送 Source Quench 消息,让它降低发送数据的速度。
Destination Unreachable(目的不可达)
如果路由器收到一个不能传递的数据报,ICMP 就会向源 IP 返回一个 Destination Unreachable 消息。路由器不能传递消息的原因之一是网路由于设备故障或维修而关闭。
Time Exceeded(超时)
当数据报由于 TTL 为 0 而被抛弃时,ICMP 就会向源 IP 发送这个消息。这表示对于当前 TTL 值来说,到达目标需要经过太多的路由器;或者是说明路由表出了问题,导致数据报在同一台路由器上连续循环。
Fragment needed(需要分段)
如果一个数据报的 “Don't Fragment” 位设置为 1,而路由器必须要对数据报进行分段才能把它转发到下一台路由器或目的地,这时 ICMP 就会发送 Fragment needed 消息。
Networking - ICMP 协议的更多相关文章
- 简单了解ICMP协议
		
ping命令是什么协议? 维基百科: ping是一种电脑网络工具,用来测试数据包能否通过IP协议到达特定主机.ping的运作原理是向目标主机传出一个ICMP echo@要求数据包,并等待接受echo回 ...
 - 1-11 ICMP协议
		
ICMP协议 IP不提供可靠的传输服务,也不提供端到端或点到点的确认,如果出错可以通过ICMP报告来看,它在IP模块中实现.TCP/IP协议设计了ICMP就是为了弥补IP协议的不足. 它是TCP/IP ...
 - Ping命令与ICMP协议
		
ICMP协议 ICMP是"Internet Control Message Ptotocol"(Internet控制消息协议)的缩写.它是TCP/IP协议族的一个子协议,用于在IP ...
 - PING的原理以及ICMP协议
		
主要内容: 1.ping的原理以及工作过程 2.ICMP协议 3.ICMP的应用:ping,traceroute 1.ping的原理以及工作过程 ping的原理 ping 程序是用来探测主机到主机 ...
 - TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute
		
1.IMCP协议介绍 前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成.其中一个重要的模块就是ICMP(网络控制报文)协议. 当传送 ...
 - ICMP协议
		
1. ICMP简介: ICMP全名为(INTERNET CONTROL MESSAGE PROTOCOL)网络控制报文协议,协议号为1,网络层协议. 它是TCP/IP协议族的一个子协议,用于在IP主机 ...
 - TCP/IP详解之:ICMP协议
		
ICMP协议: ICMP是IP层的一个组成部分,ICMP报文是在IP数据报内部被传输的,用于在IP主机.路由器之间传递控制消息.控制消息是指网络不通.主机是否可达.路由是否可用等网络本身的消息.这些控 ...
 - ICMP协议Ping命令的应用
		
ICMP的全称是 Internet Control Message Protocol ,它是TCP/IP协议族的一个子协议,属于网络层协议,用于在IP主机.路由器之间传递控制消息.从技术角度来讲,就是 ...
 - linux:C语言通过ICMP协议判断局域网内部主机是否存活
		
ICMP协议 ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方. ICMP协议是IP ...
 
随机推荐
- python challenge第1关--NoteBook上的“乱码”
			
在 python challenge第0关中已经得到第1关的地址了: http://www.pythonchallenge.com/pc/def/map.html 一.观察地址栏和标签: What a ...
 - Js面向对象和数据类型内存分配(转)
			
一 Js基本数据类型以及内存情况 1 Undefined Undefined类型只有一个值undefined,在使用了声明但未初始化的变量的时候,这个变量值就是undefined 1 var hi; ...
 - 【转】移动端App测试实用指南
			
转自:互联网那点事 英文原文: http://mobile.smashingmagazine.com/2012/10/22/a-guide-to-mobile-app-testing/ 测试人员常被看 ...
 - javascript 笔记(待续)
			
1.基础对象 var o=new Object(); o.xxx=1; o.xx=2; var 01={xxx=1,xx=2} 2.==与=== "5"==5 Tru ...
 - BW性能优化
			
少写例程,减少ABAP处理时间,例程要有效率减少查询数据库表先加载主数据,然后加载事务数据创建聚集进行数据压缩M:N关系的数据不能放到一个维度减少计算指标数量,提高上载效率并行加载建模型时如果有日的分 ...
 - OA项目之左导航
			
左边导航(一层级,二层级,三层级,四层级) aspx: <%@ Page Language="C#" AutoEventWireup="true" Cod ...
 - Github上最全的APICloud开源前端框架效果盘点(转)
			
1.微信网站几分钟变身“原生 App” 微信推出了微信JS-SDK,使微信公共号可以直接调用微信原生的接口,具备部分原生应用的能力.微信JS-SDK的推出,将大大提高微信公共号的 用户体验,但是如果存 ...
 - ios开发——常用经典算法OC篇&冒泡/快速
			
冒泡排序与快速排序 1.序言 ios开发中涉及到算法的地方还真不多,除非你的应用程序真的非常大,或者你想你的应用程序性能非常好才会去想到关于算法方面的性能优化,而在ios开发中真的能用得到的也就是关于 ...
 - Mysql分表教程
			
一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是 ...
 - Sales_item例子
			
Sales_item.h #ifndef SALES_ITEM_H #define SALES_ITEM_H #include<iostream> #include<string&g ...