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 關閉防...