一步一步實現Linux下Ping命令

2021-06-04 21:13:04 字數 2832 閱讀 6748

icmp協議是internet控制報文協議,通常被認為是ip層的組成部分。它傳遞差錯報文以及其它需要注意的資訊。icmp協議通常被ip層或更高層協議使用。

ping命令是icmp協議的乙個使用範例。ping命令主要是用於測試一台主機和另外一台主機之間的網路連通性。主要的過程就是ping程式通過傳送回顯請求報文,然後接收遠端主機的回顯應答報文,通過分析回顯應答報文就可知道兩台主機的網路連通性。

icmp資料報首部如下

|   型別(0或8)  |    **(0)    |      校驗和      |

|               識別符號                 |        序號        |

|                             選項資料                       |

實現ping命令主要就是自己構造icmp回顯請求報文,通過套接字傳送到目的主機,然後接收目的主機的icmp回顯應答報文,通過解析回顯應答報文就知道是否可以到達遠端主機了!

下面來說一下分析一下icmp報文首部各個欄位的具體含義,只有知道了具體的含義才能知道怎麼來構造自己的icmp報文:

icmp回顯請求報文和回顯應答報文都屬於查詢類報文的一種。型別字段指名了該報文是回顯請求報文還是回顯應答報文:0代表回顯應答報文,8代表回顯請求報文;**欄位在這兩種報文的情況下都是0;校驗和是重點,應該無效的報文是不能利用的,所以,通過校驗和我們可以獲取有效報文再進行報文分析;識別符號字段一般的做法都是設定為程序的id號,這樣簡潔明瞭,而且使得我們可以在一台主機上執行多個ping命令例項,不會發生衝突。序號欄位從0開始,每傳送一次新的會顯請求就會增加1.資料選項我們只需注意,回顯請求報文和回顯應答報文該欄位設定成一樣即可。

下面看看icmp在linux下有關資料結構的標示方式:定義可檢視

首先看看回顯請求和回顯應答的命令定義:

#define	icmp_echoreply		0		/* echo reply */

#define icmp_echo 8 /* echo service */

再來看看icmp的資料結構:

/*

* structure of an icmp header.

*/struct icmp ih_idseq;

int ih_void;

/* icmp_unreach_needfrag -- path mtu discovery (rfc1191) */

struct ih_pmtu ih_pmtu;

struct ih_rtradv ih_rtradv;

} icmp_hun;

#define icmp_pptr icmp_hun.ih_pptr

#define icmp_gwaddr icmp_hun.ih_gwaddr

#define icmp_id icmp_hun.ih_idseq.icd_id

#define icmp_seq icmp_hun.ih_idseq.icd_seq

#define icmp_void icmp_hun.ih_void

#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void

#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu

#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs

#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa

#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime

union id_ts;

struct id_ip id_ip;

struct icmp_ra_addr id_radv;

u_int32_t id_mask;

char id_data[1];

} icmp_dun;

#define icmp_otime icmp_dun.id_ts.its_otime

#define icmp_rtime icmp_dun.id_ts.its_rtime

#define icmp_ttime icmp_dun.id_ts.its_ttime

#define icmp_ip icmp_dun.id_ip.idi_ip

#define icmp_radv icmp_dun.id_radv

#define icmp_mask icmp_dun.id_mask

#define icmp_data icmp_dun.id_data

};

我們可以比較容易的看到型別、**和校驗和這些字段。接下來是乙個聯合的資料型別,裡面的資料項比較多,可以看到序號之類的字段,這樣看起來比較暈,型號核心為我們定義了下面的一些巨集定義,使得我們只需要關注自己感興趣的部分,例如:

#define icmp_id       icmp_hun.ih_idseq.icd_id      則是icmp資料報首部的識別符號;

#defineicmp_seq     icmp_hun.ih_idseq.icd_seq   則是我們前面提到的序號字段;

#defineicmp_data    icmp_dun.id_data                  則是資料字段,可設定為傳送資料報的時間。

總結:我們僅僅需要設定這幾個欄位就好。

icmp->icmp_type

icmp->icmp_code

icmp->icmp_cksum

icmp->icmp_id

icmp->icmp_seq

icmp ->icmp_data;

一步一步實現Windows下Flutter環境安裝

配置環境變數 另外將如下環境變數加入到使用者環境變數中,如果不進行這一步,後續會有問題 export pub hosted url export flutter storage base url 如下圖 進入控制台檢測flutter依賴 在cmd視窗執行 flutter doctor檢查任何依賴是否...

一步一步實現FormsAuthentic驗證登入

本文不講原理,只講用法,原理性的東西網上特別多,不過還是會對一些要用到的東西進行解釋,不深入講原理。本文中用的是vs2012 net mvc 4.0。原理看這篇文章 看完這個文章絕對受益匪淺。說下登入的整個流程 使用者輸入賬號密碼 點選提交 資料提交到後台控制器 去資料庫取得使用者資料 如果登入成功...

一步一步 linux下的環境部署

目標 在linux搭建完整專案,實現自動部署 環境與工具 虛擬機器,centos系統,xshell 主要步驟 1.安裝vm,配置虛擬機器,配置ssh,通過xshell連線centos 埠22取消注釋 vi etc ssh sshd config 重啟服務 service sshd start 關閉防...