简介

ICMP(Internet 控制报文协议,Internet Control Message Protocol , RFC 792)。主要用于在IP主机与路由器之间传递控制消息,用于报告主机是否可达、路由是否可用等。可以用于手机网络信息、诊断和排除各种网络故障以及用户数据的传递具有至关重要的作用。

ICMP报文

ICMP报文是基于IP包的(也就是基于网络层)

不管是 ICMPv4 还是 ICMPv6 都采用如下格式:

分类

ICMP报文可以分为两大类:

  • 差错报文(error message),有关IP数据报传递的ICMP报文
  • 查询/信息类报文(query / informational message)

ICMPv4 报文

在IPv4中,协议(Protocol)字段值为1表示该报文携带了ICMPv4

ICMPv4根据类型字段的不同而代表不同的含义:

E(差错类报文)/ I (信息类报文),*表示常见报文,+表示[RFC4884] 扩展对象

ICMPv6 报文

ICMPv6 负责的不仅仅只是差错和信息类报文,也负责了大量IPV6路由器和主机的配置

在ICMPv6 类型中,差错报文的报文类型从0到127,信息类的报文类型从128到255.

应用

ICMP的作用是根据类型和代码决定的,目前ICMP中许多类型都被其他协议替代,目前用的最的的类型是回显应答(ping 应答),回显(ping 请求),超时(TTL)。如ping 程序中。

ping

Ping程序目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答

源地址ping程序发出的回显与回显应答



根据设备的不同ttl的值也会不一样

目的地址发出的不可达

traceroute

路由跟踪,主要用于查看源到目的的路径信息,从而检查中间节点已经整个网络是否可用。当网络出现故障时,用该命令可以定位错误。

运行如下命令,到出口的路径是否正常(192.168.100.5为出口地址)

  1.  ~ traceroute 192.168.100.5
  2. traceroute to 192.168.100.5 (192.168.100.5), 64 hops max, 52 byte packets
  3.  1  moshujia.cn (192.168.124.1)  72.598 ms  23.765 ms  4.736 ms
  4.  2  192.168.24.254 (192.168.24.254)  8.905 ms  5.795 ms  6.632 ms
  5.  3  192.168.100.5 (192.168.100.5)  9.466 ms  16.580 ms  14.073 ms

traceroute 程序运行结果如下

  1. 红色为UDP
  2. 黑色为ICMP

从图中可以看出,中间节点都向源地址发送一个TTL超时的通知来表示传输期间生存时间超时。

当到达目的地址,目的主机会发送一个端口不可达的通知。并且ICMP发送和接受的端口都为33609(这是随机的,但是都超过30000)。UDP发送和接受的端口相同,但是会随着发送/接受次数的增加而增加

具体如下图所示

上图简化了192.168.24.254这个中间节点。

参考

TCP/IP 详解 卷一

ICMP 介绍的更多相关文章

  1. icmp介绍以及arp攻击

    目录 一.ip数据包格式 二.ICMP协议介绍 三.ARP协议介绍 四.ARP攻击原理 一.ip数据包格式 网络层的功能: 定义了基于ip协议的逻辑地址 连接不同的媒介类型 选择是数据通过网络的最佳途 ...

  2. ICMP路由重定向攻击

    ICMP介绍 ICMP(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议簇的一个子协议,用于在IP主机.路由器之间传递控制消息.控 ...

  3. 趣学CCNA 路由与交换

    第1章 OSI和TCP/IP 11.1 协议与协议分层 31.2 OSI参考模型 61.2.1 物理层 91.2.2 数据链路层 91.2.3 网络层 101.2.4 传输层 101.2.5 会话层 ...

  4. ICMP、ARP协议介绍和ping命令

    交换机工作原理和常用的简单命令    一.ICMP协议      1)ICMP协议的封装    二.ARP协议      1)什么是ARP协议      2)ARP相关命令    三.Ping命令的使 ...

  5. Linux基础介绍【第二篇】

    远程连接Linux的原理 SHH远程连接介绍 当前,在几乎所有的互联网企业环境中,最常用的Linux提供远程连接服务的工具就是SSH软件,SSH分为SSH客户端和SSH服务端两部分.其中,SSH服务端 ...

  6. python select网络编程详细介绍

    刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...

  7. [翻译]Telnet简单介绍及在windows 7中开启Telnet客户端

    文章翻译自 http://social.technet.microsoft.com/wiki/contents/articles/910.windows-7-enabling-telnet-clien ...

  8. iptables中文介绍 、基本使用操作命令(转)

    iptables 命令介绍   原文链接http://www.cnblogs.com/wangkangluo1/archive/2012/04/19/2457072.html iptables防火墙可 ...

  9. RSVP协议的基本概念介绍

    2010-06-12 14:12 佚名 互联网 字号:T | T 对于RSVP协议的简单介绍和图解.通过文章,我们将对这个含义的基本概念和结构,以及工作方式等方面的知识有所了解.希望对大家有所帮助. ...

随机推荐

  1. [RPC学习]Dubbo+nacos实现动态更新内存RTree

    1.背景 服务架构一般都是从 单体架构 -> 微服务架构 -> 分布式架构 的迭代,我上一家公司就是在业务发展到一定规模时,开始拆老的单体服务,按业务维度拆成多个微服务,服务之间用的是HT ...

  2. [题解] [LOJ2743]「JOI Open 2016」摩天大楼

    题目大意 将 \(N\) 个互不相同的整数 \(A_1 , A_2 , ⋯ , A_N\) 任意排列成 \(B_1 , B_2 , ⋯ , B_N\) . 要求 \(∑^{N−1}_{i=1} |B_ ...

  3. 简述 private、protected、 public、 internal修饰符的访问权限

    1.private: 私有的,只能在此类中访问 2.protected: 受保护的,只能在此类及其继承类中访问 3.public: 公开的,没有访问限制 4:internal: 内部的,只能在当前程序 ...

  4. 【PyHacker】编写WAF指纹探测与Sqlmap相结合

    使用Python编写探测WAF指纹脚本,再结合到Sqlmap中,这样以后再探测网站时,如果识别到此WAF指纹,就会显示出来.本文属于巡安似海PyHacker系列课程   编写探测识别WAF脚本 00x ...

  5. wait、notify和notifyAll方法学习

    wait.notify和notifyAll方法 wait() 方法会使该锁资源释放,然后线程进入等待WAITING状态,进入锁的waitset中,然后等待其他线程对锁资源调用notify方法或noti ...

  6. 如何使用Python实现图像融合及加法运算?

    摘要:本篇文章主要讲解Python调用OpenCV实现图像融合及加法运算,包括三部分知识:图像融合.图像加法运算.图像类型转换. 本文分享自华为云社区<[Python图像处理] 五.图像融合.加 ...

  7. VMware虚拟机中安装Linux操作系统(ubuntu)

    一.准备工作: 1.下载VMware虚拟机 下载地址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evalua ...

  8. Packed Ciphertexts in LWE-based Homomorphic Encryption:解读

    本节内容记录阅读该论文的笔记 介绍 首先,介绍了两种明文"打包"的方法:PVW和SV PVW:对应论文(PVW:A framework for efficient and comp ...

  9. 485. Max Consecutive Ones - LeetCode

    Question 485. Max Consecutive Ones Solution 题目大意:给一个数组,取连续1的最大长度 思路:遍历数组,连续1就加1,取最大 Java实现: public i ...

  10. 项目中导入本地jar包问题

    1. 问题 一个Maven项目,需要依赖一个本地jar包,以如下方式引用: <dependency> <groupId>xxx.sdk</groupId> < ...