ICMP 协议

在之前网络层的介绍中,我们知道 IP 提供一种无连接的、尽力而为的服务。这就意味着无法进行流量控制与差错控制。因此在 IP 数据报的传输过程中,出现各种的错误是在所难免的,为了通知源主机 IP 数据报传输过程中遇到的问题,因此设计了因特网控制报文协议(ICMP)。

虽然说 ICMP 协议将 IP 协议封装在内部,所以大多数人将 ICMP 视为传输层的协议,但实际上 ICMP 是 IP 协议的重要组成部分,所以将其放在网络层更为合适。

ICMP 的报文一般有两种,查询报文和查询报文

查询报文:例如我们在使用 ping 命令,子网掩码查询,时间戳查询等情况时,都会发送查询报文。

差错报文:而差错报文是在当对应的路由器或者终端设备收到查询报文后,产生了一系列问题。把出现的问题,回复给发起者的报文就是差错报文。

但考虑到整体网络资源的占用上,在如下情况下,是不会产生差错报文的:

  1. 差错报文不会产生差错报文 - 防止 ICMP 无限产生和传送差错报文
  2. 目的地址是广播或多播的 IP 数据包
  3. 链路层广播的数据包
  4. 不是 IP 分片的第一片 - IP 是尽力而为,自然不需要可靠性
  5. 源地址不是某个主机的数据包

ICMP 类型

由于 ICMP 本身就是为了弥补 IP 协议不可靠的特性,起到排错目的,所以它的 Header 并不复杂。

正如图中所示的,对于 ICMP Header 来说,比较重要的就是 Type (8 bit)和 Code (8 bit) 字段,用来表示各种错误的情况。

其中完整的介绍可以参考这篇 wiki,下面就介绍上常用的部分。

Type code Description
0 0 Echo 回复报文,如 Ping 命令的回复报文。
3 0 网络不可达
3 1 主机不可达
3 3 协议不可达
3 4 端口不可达
3 6 网络不知道
3 7 主机不知道
8 0 Echo 请求报文,如 Ping 命令的请求报文。
13 0 时间戳请求报文

下面我们抓个包,来看一下。

Ping 命令测试网络连通性

这里在主机上 Ping 下百度,通过 Wireshark 抓到的数据包如下:

先看一下 Echo Request 包,对应 Type 为8,Code 为0:

Echo Reply 包 - Type 为 0,Code 为 0:

Traceroute 测试网络连通性

在 IP 协议中,为了防止出现环路而设置了 TTL 字段。该字段也在 traceroute 中起到了很大的作用,通过设置 TTL 的数值,来获取数据报的传递过程。

TTL:当 IP 数据包进行传送时,每经过一个路由器,TTL 指就会减一,当 TTL = 0 时,该 IP 数据报会被丢弃。

下面就来了解下 Traceroute 的通信过程,用到的拓扑如下:

当主机收到目的主机的 IP 后,会给目的主机发送一个 TTL = 1 的 UDP 数据包。

而经过第一个路由器后,TTL - 1 变成 0.这时路由器会把数据报丢弃,然后把丢弃的数据包的 IP 头部封装起来,回复主机一个差错报文。如下:

这个过程主机会发三次,也就是说会产生 3 个 TTL =1 的 UDP,如下

接着会在再次发送 3 个 TTL = 2 的 UDP 报文,如下

第二个路由器,会再次向主机发送一个差错报文,如下:

这里需要注意的:由于第二台路由器已经相当于是目的地,所以将数据包拆到传输层,但由于传输层上的端口标识了应用层的应用,而在该路由器上不在该应用,进而回复了端口不可达的报文。

由于图中只经过 2 个路由器,所以截止发送到 TTL = 2

并且我们可以从 TTL = 2 的回复差错报文看出,只有两个差错报文。其中有个差错报文出现了丢失,并且没有给主机回复差错报文丢失的情况

CCNA - Part7:网络层 - ICMP 应该是你最熟悉的协议了的更多相关文章

  1. CCNA 学习记录(三)通过仿真理解ARP协议

    拓扑图 配置 路由器R2: GigabitEthernet 0/0/0 IP Address: 192.168.1.1 Subnet Mask: 255.255.255.0 Serial 0/1/0 ...

  2. CCNA网络工程师学习进程(6)vlan相关协议的配置与路由器简单配置介绍

        前面已经介绍了大部分与vlan技术相关的交换机的协议的配置,更深层次的还有STP协议和以太网端口聚合技术,接着还会简单介绍一下路由器的基本应用.     (1)STP(Spanning-tre ...

  3. (网络层)IP 协议首部格式与其配套使用的四个协议(ARP,RARP,ICMP,IGMP)

    目录 IP协议首部格式地址解析协议 ARP逆向地址解析协议 RARP网际控制报文协议 ICMP网际组管理协议IGMP IP 数据报首部 IP数据报首部格式: 最高位在左边,记为0 bit:最低位在右边 ...

  4. 网络层 IP 协议首部格式与其配套使用的四个协议(ARP,RARP,ICMP,IGMP)

    目录 IP协议首部格式地址解析协议 ARP逆向地址解析协议 RARP网际控制报文协议 ICMP网际组管理协议IGMP IP 数据报首部 IP数据报首部格式: 最高位在左边,记为0 bit:最低位在右边 ...

  5. 2016.7.9 计算机网络复习要点第四章之网际控制报文协议ICMP

    1.ICMP允许主机或路由器报告差错情况和提交有关异常情况的报告:为了更有效地转发IP数据报和提高交付成功的机会: 2.ICMP不是高层协议,因为ICMP报文是装在IP数据报中的,作为其中数据部分,所 ...

  6. TCP/IP入门(2) --网络层

    /** 本篇博客由 126(127不可用) 2^24 -2 B 2^14 -1 128.1 191.255 2^16 -2 C 2^21 -1 192.0.1 223.255.255 2^8 -2 D ...

  7. [HTTP] tcp/ip详解 链路层 网络层 传输层 应用层

    1.可以把七层协议简化成四层协议链路层 网络层 传输层 应用层 2.通过路由器连接的两个网络网络层ip提供的是一个逐跳协议,提供了一种不可靠的服务,中间有可能会丢传输层tcp在ip的基础上提供了可靠的 ...

  8. 计算机基础:计算机网络-chapter4 网络层

    网络层的使用:如 ping,tracert,原理是ICMP 一.什么叫网络,网络层做什么,通过什么实现,这章的内容, 什么叫网络,实现这些需要做什么 将全世界范围内数以百万计的网络都互连起来,并且能够 ...

  9. ICMP协议、DNS、ARP协议、ping、DHCP协议

    1.ICMP协议 1)ICMP协议,即:网络控制消息协议(Internet Control Message Protocol) 2)ICMP是网络层协议,因为ICMP报文是装在IP数据报中,作为它的数 ...

随机推荐

  1. Python SimpleHTTPServer (python3 -m http.server 6789)

    搭建FTP,或者是搭建网络文件系统,这些方法都能够实现Linux的目录共享.但是FTP和网络文件系统的功能都过于强大,因此它们都有一些不够方便的地方.比如你想快速共享Linux系统的某个目录给整个项目 ...

  2. 带你学够浪:Go语言基础系列 - 8分钟学复合类型

    ★ 文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) " 对于一般的语言使用者来说 ,20% ...

  3. OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  4. #Linux 下 Xampp的安装与Hello World

    一.下载安装 去官网下载 移动下载完毕的xampp-linux-x64-7.4.6-0-installer.run 到/usr/local/jayce-softwares/xampp目录下(jayce ...

  5. async/await到底该怎么用?如何理解多线程与异步之间的关系?

    前言 如标题所诉,本文主要是解决是什么,怎么用的问题,然后会说明为什么这么用.因为我发现很多萌新都会对之类的问题产生疑惑,包括我最初的我,网络上的博客大多知识零散,刚开始看相关博文的时候,就这样.然后 ...

  6. java并发——copyonwrite

    今天在网上看到一个问题,问除了加锁之外,有没有其他方法来保证线程安全? ---- copyonwrite机制 一.copyonwrite机制 机制实现:写时复制, 在往集合中添加数据的时候,先拷贝存储 ...

  7. 30_栈的定义.swf

    上面的局部变量 i int*p中的p指针变量,是在栈中分配的,malloc申请的内存是在堆中分配的,动态申请的都在堆中分配的. 栈是一种数据存储的结果,先进后出的数据结构.

  8. kubernetes资源均衡器Descheduler

    背景 Kubernetes中的调度是将待处理的pod绑定到节点的过程,由Kubernetes的一个名为kube-scheduler的组件执行.调度程序的决定,无论是否可以或不能调度容器,都由其可配置策 ...

  9. FRP+WoL实现远程开机+远程桌面

    FRP+WoL实现远程开机+远程桌面 故事背景 这是一个很复杂而且很久远的故事,如果要讲的话,这个故事可以追溯到1981年(「都是废话,没有干货,如果不感兴趣请从第二章开始」),简单来说: 1981年 ...

  10. JavaScript基础初始时期分支(018)

    Init-Time Branching初始时期分支是一种用做优化的模式.如果某些条件在程序启动后就不再改变,那么我们就只需要在初始时期检查一次就可以了,而不是在每次 需要用到这些条件的时候都检查一次. ...