1. 程式人生 > >ICMP協議之ping實現

ICMP協議之ping實現

1. 相關ICMP協議概述
  這裡只講解與ping有關的ICMP訊息型別,主機發送回送訊息(Type = 8),被請求主機回送響應訊息(Type = 0),基本格式如下:
  回送訊息[ECHO]

    

   回送響應訊息[ECHO REPLY]

    

   其中•Code = 0,
     •CheckSum為校驗和,重點注意從ICMP的頭部(即Type開始),到data結束(即到整個資料包結束),具體計算見下面分析
     •Identifier為識別符號,由主機設定,一般設定為程序號,回送響應訊息與回送訊息中identifier保持一致
     •Sequence Number為序列號,由主機設定,一般設為由0遞增的序列,回送響應訊息與回送訊息中Sequence Number保持   一致
     •data為資料,由主機設定,回送響應訊息與回送訊息中data保持一致

2. Ping流程
  Ping實際上利用的就是ICMP ECHO和ICMP ECHO REPLY包來探測主機是否存在,所以Ping程式的流程十分簡單:傳送ICMP    ECHO包---- > 接收ICMP ECHO REPLY包
  傳送ICMP ECHO包時填充Identifier為程序ID, Sequence Number為從0遞增計數,data填充為傳送時間
  接收ICMP ECHO REPLY包時檢查Identifier, Sequence Number是否正確,通過IP報頭的源地址欄位獲得回送報文的主機地址是否正確

3. 模擬Ping實現pingy
  Ping的基本流程已講解完

  由於要自己構造ICMP包,因此建立需要建立原始套接字(即需要自己填充報頭):
         sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
  SOCK_RAW用於直接訪問網路層,應用程式負責構造自己的協議首部;IPPROTO_ICMP表示ICMP報頭由程式構造
  構造ICMP報頭,注意各個欄位的填充,特別是校驗和(可以參照icmp的結構定義)
          icmp->icmp_type
          icmp->icmp_code
          icmp->icmp_cksum
          icmp->icmp_id
          icmp->icmp_seq
          icmp ->icmp_data;

  而完成系統的Ping命令還需新增資訊統計,如傳送位元組數,收到位元組數,傳送包,接收包,傳送時間,TTL等;另外,新增訊號處理,在使用者使用Control^C等退出時列印即時資訊


4. 具體程式碼見附件

5. 最終效果如下