天天看點

第十一章 ICMP:Internet控制封包協定

一、ICMP是傳輸層的協定,和TCP、UDP等傳輸層協定同級

二、ICMP請求在ICMP type和code字段裡有一個常量辨別,同時對應PRC_也有一個對應常量,用來識别差錯類型。

三、同時,對于ICMP字段,會有一個icmp_input函數進行對相應的ICMP封包進行處理。而且在插口層,對于UDP和TCP,也會有不同的函數來進行處理,udp_notify函數和tcp_notify函數、tcp_quench函數

四、對于每一種ICMP封包,都會被存放在一個叫做icmp結構中,裡面定義了通用的icmp的一些資訊,同時用union結構來定義不同ICMP封包專有的資訊,(結構中有type,code,chsum,依賴于type和code的兩個union結構)

五、ipintr函數調用指向icmp_input函數的函數指針,進而是icmp_input函數來對ICMP封包進行處理。icmp_input函數處理過程中,會根據情況将ICMP差錯送出給傳輸協定,将ICMP差錯應答和未知封包送出給rip_input函數,再由rip_input函數送出各相應的應用程式。而對于ICMP應答,是在icmp_input函數内部處理的。

六、icmp_input函數的處理流程:

  • 1.首先配置設定三個靜态結構,然後驗證收到的ICMP封包是否合法
  • 2.在函數中的switch語句中,會對不同的ICMP字段進行處理,如差錯字段、請求字段、重定向字段及回答字段。對于差錯字段,程式會将其映射在一個協定無關的代碼集上,以PRC_開頭的那些,然後如果識别出了type和code,icmp_input函數就跳轉到deliver段,送出給傳輸層,然後調用pr_ctliput函數來進行進一步的處理。在處理請求字段中,在本函數中設定好回複type後轉到reflect字段調用icmp_reflect函數請求,如果不能識别type,就交給raw字段中的rip_input函數進行處理。回答字段是不在icmp_input函數中進行處理的。

七、ICMP的輸出處理:

第258頁的圖11-29将的很清楚

繼續閱讀