ICMP協議以及報文講解(ICMP查詢報文、ICMP差錯報文)

目錄

ICMP協議

ICMP報文格式

ICMP回顯請求/應答報文

ICMP差錯報文

ICMP 宿主機不可達差錯報文

ICMP 重定向差錯報文

ICMP TTL超時差錯報文


ICMP協議

ICMP協議的作用

ICMP(Internet Control massage protocol)因特網控制協議,主要用來在網絡設備間傳遞各種差錯、控制和查詢等消息(在收集網絡信息、診斷、排查故障等方面具有重要的作用)

ICMP是網絡層協議,協議號為1

為什么需要ICMP差錯報文

IP協議的缺點

1、IP協議沒有差錯報文或差錯糾正機制

2、IP協議缺少一種為主機和管理查詢的基址

所以ICMP協議就是為了補充IP協議的這兩個缺點而設計的,配合IP協議使用

ICMP報文格式

通過Type和Code定義ICMP的報文類型

ICMP報文主要分為查詢報文和差錯報文兩大類

查詢報文:主要用于在主機和路由器之間傳輸控制信息,也用來探測網絡連通性和路徑等信息

差錯報文:用于報告數據傳輸過程中的錯誤

Type

Code

描述

 

0

0

回顯應答(ping應答)

查詢報文

8

請求回顯(ping請求)

9

路由器通告

10

路由器請求

13

時間戳請求(目前已不使用)

14

時間戳應答(目前已不使用)

15

信息請求(目前已不使用)

16

信息應答(目前已不使用)

17

地址掩碼請求

18

地址掩碼應答

3(目的不可達報文)

0

網絡不可達

差錯報文

1

主機不可達

2

協議不可達

3

端口不可達

6

目的網絡不認識

7

目的主機不認識

9

目的網絡被強制禁止

10

目的主機被強制隔離

11

由于TOS,網絡不可達

12

由于TOS,主機不可達

13

由于過濾,通信被強制禁止

4(源抑制報文)

0

源端被關閉

5(ICMP重定向報文)

0

對網絡重定向

1

對主機重定向

2

對服務類型和網絡重定向

3

對服務類型和主機重定向

11(TTL為0報文)

0

傳輸期間生存時間為0

1

在數據報組裝期間生存時間為0

12(報文格式問題)

0

壞的IP首部

1

缺少必須的選項

ICMP回顯請求/應答報文

作用

通過ping工具發送ICMP回顯請求消息探測網絡的連通性(對端回應ICMP回顯應答請求)

通過tracert工具發送ICMP回顯請求來探測去往某目的網路的路徑信息(修改ICMP回顯請請求的TTL的值,通過對端回應的Type為11的ICMP差錯報文來得到路徑信息)

報文格式

Type

8為請求

0為應答

Identifier

標識符,標識ICMP該回顯應答對應的是哪個回顯請求(通過該字段使得請求和應答一一對應)

BE和LE是通過不同的編碼格式得到的值,解碼后的信息都是一樣的

可以理解為BE是針對于windows系統的編碼格式,LE是針對于Linux系統的編碼格式

Sequence Number

序列號,發送報文的序列號,每次發送序列號就+1

Data

可選,包含要發送的數據(回顯應答通常返回與回顯請求所收到的數據相同)

ICMP差錯報文

ICMP差錯報文都有一個的字段(IP頭部+原始數據包的前64 bits)

該字段的內容包含出錯數據包的IP頭部以及出錯數據包的前64位數據(端口號、序列號、其它協議報文頭部等)

該字段的作用就是將產生該錯誤的報文附帶在差錯報文中,當管理員看到差錯報文時知道是什么原因產生的錯誤,有利于排查錯誤

以下情況不會產生ICMP差錯報文

1、對于攜帶ICMP差錯報文的數據包,不會在產生ICMP差錯報文

2、對于分片的數據包,如果不是第一個分片,則不會產生ICMP差錯報文

3、對于具有組播地址的數據報文,不會產生ICMP差錯報文

4、對于具有特殊地址的數據報文(如127.0.0.0和0.0.0.0),不會產生ICMP差錯報文

ICMP 宿主機不可達差錯報文

一般是本地沒有去往報文目的IP地址的路由,就會向報文的源IP地址回應ICMP差錯報文(宿主機不可達)

網絡不可達差錯報文(當路由器上沒有去往目的網段的路由時就會發送網絡不可達差錯報文)

從數據包中可以看出來

  1. 當ICMP Echo Request報文到達192.168.10.254這臺設備時
  2. 這臺設備(10.254)發現自己沒有去往該報文目的地址100.0.0.1的路由
  3. 此時這臺設備(10.254)就發送ICMP差錯報文-網絡不可達消息給ICMP Echo Request報文的源IP地址(10.129)

端口不可達IP報文(一般在tracert跟蹤路由場景下會出現此差錯報文)

Tracert主要是用來跟蹤路徑,在跟蹤路徑的過程中如果某個路由器或目標主機上的應用程序沒有在相應的端口上監聽,此時收到ICMP回顯請求時會回應端口不可達的ICMP差錯報文、或者當網絡管理員阻止了ICMP回顯請求時也會發送端口不可達的ICMP差錯報文(端口不可達信息不止因為Tracert產生,還會因為其它操作產生,只是Tracert是比較常見的)

從數據包中可以看出來

  1. 當172.22.105.211訪問172.22.105.254的137端口時
  2. 這臺設備(105.254)發現自己并沒有開啟該端口的監聽(或者拒絕接收ICMP回顯請求)
  3. 此時這臺設備(105.254)就發送ICMP差錯報文-端口不可達消息給172.22.105.211

ICMP 重定向差錯報文

產生重定向報文的場景

1、從一個接口接收到的報文再從同一個接口發出去,一般就會產生ICMP重定向(不一定是環路)

2、當設備從某個接口收到發往遠程網絡的數據時,發現源IP地址與下一跳屬于同一網段時也會產生ICMP重定向

ICMP重定向報文的作用

當主機收到ICMP重定向差錯報文后,會將自己去往目的IP地址(該目的IP地址為ICMP差錯報文中攜帶的IP頭部的目的IP地址)的網關設置為該地址

即ICMP重定向報文會通知該主機修改自身的路由表(將去往目的IP地址的下一跳修改為ICMP重定向報文攜帶的最佳下一跳的IP地址)

報文格式

從數據包中可以看出來

  1. 當192.168.10.129這臺設備去訪問192.168.10.1時,將此數據包發給了192.168.10.254
  2. 此時192.168.10.254發現自身去往192.168.10.1的下一跳接口為自己接收此報文的入接口,并且也發現源IP10.129與目的IP10.1為同一網段
  3. 此時10.254這臺設備就認為10.129可以直接去往10.1
  4. 于是10.254就向10.129發送ICMP重定向報文(Gateway字段設置為10.1),讓10.129訪問10.1可以直接將報文交給10.1,不需要再交給自己

ICMP TTL超時差錯報文

當IP數據包在傳輸過程,在還沒有到達目的IP地址的時候IP層的TTL變為0(路由器收到時為1的報文就會認為TTL超時),此時該路由器就會發送ICMP差錯超時報文(Tracert就是通過差錯報文來跟蹤路徑的)

報文格式

從數據包中可以看出來

  1. 當172.22.105.211這臺設備去訪問1.1.1.1,封裝數據包
  2. 當172.22.105.254收到該數據包是發現該報文的TTL為1,但是本設備又不是報文的目的地址
  3. 于是105.254就向105.211發送ICMP TTL超時報文,讓其增加TTL值

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212015.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212015.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212015.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言再學習 -- 單精度(float)和雙精度(double)浮點數 與 十六進制(HEX) 之間轉換(轉載))

之前講過浮點數部分,參看:C語言再學習 – 浮點數 現在程序中要將浮點數,通過TCP發送。那得先將其轉換為十六進制才行呀。 那么問題就來了。 參看:C語言:單精度(float)和雙精度(double)浮點數 與 十六進制(HEX) 之間…

(JAVA)-打印流

打印流是高級流,只能寫不能讀,只有輸出流 只操作文件目的地,不操作數據源 能實現數據的原樣輸出 printStream:字節打印流 構造方法: 用文件或地址的方式創建字節打印流也會創建一個字節基本流。 字節流底層沒有緩存區&#xff…

文檔或書籍掃描為 PDF:ScanPapyrus Crack

ScanPapyrus 可讓您快速輕松地將文檔或書籍掃描為 PDF,批處理模式使掃描過程快速高效,自動處理書籍并將其拆分為單獨的頁面 用于快速掃描文檔、書籍或打印照片的掃描儀軟件 快速掃描文檔 使用此掃描儀軟件,您無需在掃描儀和計算機之間來回移動…

SpringBoot 官方腳手架不再支持Java8和Java11

Spring 官方腳手架不再支持初始化 Java8 和 Java 11 項目,目前僅支持初始化Java17 和 Java21 項目。 阿里巴巴Spring腳手架支持初始化Java8、Java11、Java17、Java19 的項目,不支持初始化Java21的項目。

Torn Lucky Ticket

題目 #include<bits/stdc.h> using namespace std; #define int long long const int maxn 1e6 5, d 500; vector<string> vec[6]; int mp[1005]; signed main(){int n;cin >> n;for(int i 1; i < n; i){string s;cin >> s;int len s.size();…

java簡述springboot內置數據庫 并舉例啟動h2內存數據環境

在前面 我們講了 springboot 給我們提供了 默認的 數據源 默認 HikariCP 以及其他兩種內置數據源 持久化技術 JdbcTemplate 那么 說起來很多人難以置信 不過 springboot 也真的給我們內置了數據庫技術 而且不止一種 是三種 這三個數據庫的特點在于 它們都是用java語言寫的 就表…

28 動態規劃解按摩師的最長預約時間

問題描述&#xff1a;一名有名的按摩師會受到源源不斷的預約請求&#xff0c;每個預約都可以選擇接或者不接&#xff0c;在每次預約服務之間要有休息時間&#xff0c;因此不能接相鄰的預約&#xff0c;給定一個請求序列&#xff0c;按摩師找到最優的預約集合(總預約時間最長)&a…

探索中文文本處理利器 - Python jieba庫詳解

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com jieba庫介紹 在處理中文文本數據時&#xff0c;分詞是一項至關重要的任務。而在Python的工具箱中&#xff0c;jieba庫作為一款強大的中文分詞工具&#xff0c;為開發者提供了高效而靈活的解決方案。jieba&#…

JDK8新特性:Lambda表達式規則及用法,方法引用

目錄 Lambda表達式是JDK8新增的一種語法格式 1.作用 2.用法規則&#xff1a; 3.方法引用 Lambda表達式是JDK8新增的一種語法格式 1.作用 簡化匿名內部類的代碼寫法 Lambad用法前提&#xff1a;只能簡化函數式接口&#xff08;一般加有Funcationallnterface&#xff09;&a…

Python dateutil 庫:簡化日期和時間處理的利器

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com 在Python中&#xff0c;處理日期和時間是常見的任務之一。dateutil庫是Python標準庫中datetime模塊的擴展&#xff0c;提供了許多方便的工具和函數&#xff0c;簡化了日期和時間的操作。 安裝與基本用法 首先&…

小黑子之——MybatiPlus整合

MybatiPlus學習 一、MybatiPlus簡介1.1 入門案例1.2 mybatisPlus概述1.3 總結 二、標準數據層開發2.1 標準的CRUD使用2.2 新增2.3 刪除2.4 修改2.5 根據Id查詢2.6 查詢全部2.7 Lombok2.8 分頁功能 三、DQL控制3.1 條件查詢方式3.1.1 構建條件查詢3.1.2 多條件查詢3.1.3 null值判…

運維05:自動化

人工運維時代 運維人員早期需要維護眾多的機器&#xff0c;因此需要執行很多重復的勞動&#xff0c;很多機器需要同時部署相同的服務或者是執行相同的命令&#xff0c;還得反復地登錄不同的機器&#xff0c;執行重復的動作 自動化運維時代 早期運維人員會結合ssh免密登錄&…

Java基礎——對象類型轉換(向上、向下轉型)

非繼承關系的類之間對象類型不可以互相類型轉換&#xff0c;只有繼承關系才可以互相轉換。 簡單說&#xff0c;對象類型轉換的前提要是繼承關系。 對象類型轉換分為&#xff1a;向上轉型和向下轉型。多態就是一種自動向上轉型。 向上轉型&#xff1a;子類對象用父類類型接收…

Leetcode 2963. Count the Number of Good Partitions

Leetcode 2963. Count the Number of Good Partitions 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;2963. Count the Number of Good Partitions 1. 解題思路 這一題根據題意&#xff0c;顯然我們可以將其先分為 n n n個原子partition&#xff0c;確保任意兩個partition之間…

git 常用的使用方法

1.查看分支 $ git branch #查看本地分支 $ git branch -r #查看遠程分支 $ git branch -a #查看所有分支 $ git branch -vv #查看本地分支及追蹤的分支 2.創建分支 方法1 $ git branch 分支名 #創建本地分支 #將本地分支push&#xff0c;就創建了遠程分支方法2 #創建本地分…

載入了名字空間‘htmltools’ 0.5.6,但需要的是>= 0.5.7解決方案

解決方案&#xff1a;刪除之前的舊版本安裝包&#xff0c;安裝新的包 1.卸載之前的安裝包 2.關閉R&#xff0c;重新打開 3. # install.packages("htmltools") library(htmltools)

Java 并發編程(一)

1、在 java 中守護線程和本地線程區別&#xff1f; java 中的線程分為兩種&#xff1a;守護線程&#xff08;Daemon&#xff09;和用戶線程&#xff08;User&#xff09; 任何線程都可以設置為守護線程和用戶線程&#xff0c;通過方法 Thread.setDaemon(boolon)&#xff1b;tru…

HarmonyOS學習--了解基本工程目錄

1.工程級目錄 工程的目錄結構如下&#xff1a; 其中詳細如下&#xff1a; AppScope中存放應用全局所需要的資源文件。entry是應用的主模塊&#xff0c;存放HarmonyOS應用的代碼、資源等。oh_modules是工程的依賴包&#xff0c;存放工程依賴的源文件。build-profile.json5是工…

如何找到MACOS系統更新的安裝包

首先在應用商店中下載新系統的安裝包&#xff0c;然后在設置中不要點安裝&#xff0c;會自動跳出安裝的界面&#xff0c;不要關閉界面&#xff0c;打開命令行用root權限輸入命令cat /var/log/install.log | grep *.dmg&#xff0c; 就會顯示 sh-3.2# cat /var/log/install.log …

算法基礎十

加一 給定一個由 整數 組成的 非空 數組所表示的非負整數&#xff0c;在該數的基礎上加一。最高位數字存放在數組的首位&#xff0c; 數組中每個元素只存儲單個數字。 示例 1&#xff1a; 輸入&#xff1a;digits [1,2,3] 輸出&#xff1a;[1,2,4] 解釋&#xff1a;輸入數組表…