本篇結構:
- ICMP
- IGMP
- 附
- 反思
接著上一篇TCP/IP--劃分子網和構造超網,本章接著分享IP協議的兩個配套協議--ICMP和IGMP。
一、ICMP
1.1、什么是ICMP
ICMP的全稱是Internet Control Message Protocol(網際控制信息協議)。
ICMP工作在TCP/IP體系中的網絡層,是IP協議的一個補充,主要用于在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態信息等。ICMP報文通常被IP層或更高層協議(TCP或UDP)使用。ICMP報文是在IP數據報內部傳輸的。IP協議是不可靠協議,不能保證 IP數據報能夠成功的到達目的主機,無法進行差錯控制,當遇到IP數據無法訪問目標、IP路由器無法按當前的傳輸速率轉發數據包等情況時,會自動發送ICMP消息。
1.2、ICMP報文格式
- 類型:一個8位類型字段,表示 ICMP 數據包類型;
- 代碼:一個8位代碼域,表示指定類型中的一個功能,如果一個類型中只有一種功能,代碼域置為 0;
- 檢驗和:數據包中 ICMP 部分上的一個16位檢驗和;
- ICMP數據部分:包含了所有接受到的數據報的IP報頭,還包含IP數據報中前8個字節的數據。
格式解釋:
ICMP報文的前4個字節是統一的格式,共有三個字段:即類型,代碼和檢驗和。
8位類型和8位代碼字段一起決定了ICMP報文的類型。
- 類型8,代碼0:表示回顯請求(ping請求);
- 類型0,代碼0:表示回顯應答(ping應答);
- 類型11,代碼0:超時......
16位的檢驗和字段:包括數據在內的整個ICMP數據包的檢驗和,其計算方法和IP頭部檢驗和的計算方法一樣的。
ICMP報文具體分ICMP差錯報告報文和ICMP詢問報文(對ICMP差錯報文有時需要做特殊處理,因此要對其進行區分。如:對ICMP差錯報文進行響應時,永遠不會生成另一份ICMP差錯報文,否則會出現死循環)。
1.3、ICMP種類
ICMP報文具體分ICMP差錯報告報文和ICMP詢問報文(對ICMP差錯報文有時需要做特殊處理,因此要對其進行區分。如:對ICMP差錯報文進行響應時,永遠不會生成另一份ICMP差錯報文,否則會出現死循環)。
下面主要學習幾種常用的ICMP報文類型。
1.ICMP差錯報文
- 終點不可達(Type=3)
IP路由器無法將IP數據報發送給目的地址時,會給發送端主機返回一個終點不可達ICMP消息。例如我們要連接對方一個不存在的系統端口(端口號小于1024)時,將返回Type=3、Code=3的ICMP報文,它要告訴我們:“嘿,別連接了,我不在家的!”,常見的不可到達類型還有網絡不可到達(Code=0)、主機不可到達(Code=1)、協議不可到達(Code=2)等。
- 時間超過
超時報文的代碼域有兩種取值:Code=0表示傳輸超時,Code=1表示重組分段超時。
IP 數據包中有一個字段TTL(Time to live,生存周期),它的值隨著每經過一個路由器就會減1,當路由器收到生存時間TTL為零的數據報時,除丟棄該數據報外,還要向源站發送時間超過報文。當目的站在預先規定的時間內不能收到一個數據報的全部數據報片時,就將已收到的數據報片都丟棄,并向源站發送時間超過報文。
- 參數問題
當路由器或目的主機收到的數據報的首部中的字段的值不正確時,就丟棄該數據報,并向源站發送參數問題報文。
- 改變路由(重定向)
如果路由器發現發送端主機使用次優的路徑發送數據時,那么它會返回一個ICMP 重定向消息給這個主機,這個消息包含了最合適的路由信息和源數據。主要發生在路由器持有更好的路由信息的情況下,路由器會通過這個ICMP 重定向消息給發送端主機一個更合適的發送路由。
以下幾種情況都不會導致產生ICMP差錯報文:
- ICMP差錯報文(但是,ICMP查詢報文可能會產生ICMP差錯報文);
- 目的地址是廣播地址或多播地址的IP數據報;
- 作為鏈路層廣播的數據報;
- 不是IP分片的第一片;
- 源地址不是單個主機的數據報。即源地址不能為零地址、環回地址、廣播地址或多播地址。
這些規則是為了防止過去允許ICMP差錯報文對廣播分組響應所帶來的廣播風暴。
所有的ICMP差錯報告報文中的數據字段都具有同樣的格式。將收到的需要進行差錯報告IP數據報的首部和數據字段的前8個字節提取出來,作為ICMP報文的數據字段。再加上響應的ICMP差錯報告報文的前8個字節,就構成了ICMP差錯報告報文。提取收到的數據報的數據字段的前8個字節是為了得到運輸層的端口號(對于TCP和UDP)以及運輸層報文的發送序號(對于TCP)。
<p><img src="http://ov2u3lly5.bkt.clouddn.com/20170929_icmp04.png"/></p>
2.ICMP詢問報文
- 回送消息
用于進行通信的主機或路由之間,判斷發送數據包是否成功到達對端的消息。可以向對端主機發送回送請求消息,也可以接收對端主機回來的回送應答消息。
我們日常使用最多的ping,就是響應請求(Type=8)和應答(Type=0),一臺主機向一個節點發送一個Type=8的ICMP報文,如果途中沒有異常(例如被路由器丟棄、目標不回應ICMP或傳輸失敗),則目標返回Type=0的ICMP報文,說明這臺主機存在。
- 時間戳消息
時間戳請求報文(Type=13)和時間戳應答報文(Type=14)用于測試兩臺主機之間數據報來回一次的傳輸時間。傳輸時,主機填充原始時間戳,接收方收到請求后填充接收時間戳后以Type=14的報文格式返回,發送方計算這個時間差。一些系統不響應這種報文。
1.4、ICMP應用
1.PING
ping是一個用來查詢網絡通不通的一個工具,是系統自帶的,運行于內核,調用ICMP協議。
ping的工作原理:ping通過調用echo來發送請求,通過是否收到echo-reply來查詢網絡層的連通性。ping的結果會給出傳送的時間和TTL的數據,還可以查看主機到目的主機的路由。這是因為ICMP的ping請求數據報在每經過一個路由器的時候,路由器就會把自己的IP地址放到該數據包中,而目的主機則會把這個IP列表復制到ICMP數據包中發回給主機。但是,IP頭能記錄的路由列表非常有限,如果要觀看完整的路由信息,就要用到traceroute工具了。
2.traceroute
traceroute是用來偵測主機到目的主機所經路由情況的工具,可以獲取到所經路由器的IP地址。
traceroute的工作原理:它收到目的主機的IP后,首先給目的主機發送一個TTL=1的UDP數據包,而經過的第一個路由器收到這個數據包以后,就自動將TTL減1。而TTL變為0以后,路由器就把這個包給拋棄了,并同時產生一個主機不可達的ICMP數據包給主機。主機收到這個數據包以后就發送一個TTL=2的數據包給主機,然后刺激第二個路由器給主機發送ICMP數據包,如此反復直到到達目的主機。這樣,traceroute就拿到了所有的路由器IP,從而避免了IP頭只能記錄有限的路由IP
的問題。
二、IGMP
IGMP也是IP協議的一個補充,位于TCP/IP體系中的網絡層。
2.1、單播,多播,廣播的介紹
1.單播(Unicast)
單播是說,對特定的主機進行數據傳送。例如給某一個主機發送IP數據包。這時候,數據鏈路層給出的數據頭里面是非常具體的目的地址,對于以太網來 說,就是網卡的MAC地址。現在的具有路由功能的主機應該可以將單播數據定向轉發,而目的主機的網絡接口則可以過濾掉和自己MAC地址不一致的數據。
2.廣播(Broadcast)
廣播是主機針對某一個網絡上的所有主機發送數據包。這個網絡可能是網絡,可能是子網,還可能是所有的子網。如果是網絡,例如A類網址的廣播就是 netid.255.255.255,如果是子網,則是netid.netid.subnetid.255;如果是所有的子網(B類IP)則是則是 netid.netid.255.255。廣播所用的MAC地址FF-FF-FF-FF-FF-FF。網絡內所有的主機都會收到這個廣播數據,網卡只要把 MAC地址為FF-FF-FF-FF-FF-FF的數據交給內核就可以了。一般說來ARP,或者路由協議RIP應該是以廣播的形式播發的。
PS:
在使用TCP/IP 協議的網絡中,主機標識段host ID 為全1的IP地址為廣播地址。
- 受限廣播
它不被路由發送,但會被送到相同物理網絡段上的所有主機
IP地址的網絡字段和主機字段全為1就是地址255.255.255.255
- 直接廣播
網絡廣播會被路由,并會發送到專門網絡上的每臺主機IP地址的網絡字段定義這個網絡,主機字段通常全為1,如 192.168.10.255。
3.多播(Multicast)
可以說廣播是多播的特例,多播就是給一組特定的主機(多播組)發送數據,這樣,數據的播發范圍會小一些(實際上播發的范圍一點也沒有變小),多播的MAC地址是最高字節的低位為一,例 如01-00-00-00-00-00。多播組的地址是D類IP,規定是224.0.0.0-239.255.255.255。
224.0.0.0~224.0.0.255為預留的組播地址(永久組地址),地址224.0.0.0保留不做分配,其它地址供路由協議使用;
224.0.1.0~224.0.1.255是公用組播地址,可以用于Internet;
224.0.2.0~238.255.255.255為用戶可用的組播地址(臨時組地址),全網范圍內有效;
239.0.0.0~239.255.255.255為本地管理組播地址,僅在特定的本地范圍內有效。
雖然多播比較特殊,但是究其原理,多播的數據還是要通過數據鏈路層進行MAC地址綁定然后進行發送。所以一個以太網卡在綁定了一個多播IP地址之后,必 定還要綁定一個多播的MAC地址,才能使得其可以像單播那樣工作。這個多播的IP和多播MAC地址有一個對應的算法。可以看到 這個對應不是一一對應的,主機還是要對多播數據進行過濾。
PS:廣播和多播的性質是一樣的,路由器會把數據放到局域網里面,然后網卡對這些數據進行過濾,只拿到自己打算要的數據,比如自己感興趣的多 播數據,自己感興趣的組播數據。當一個主機運行了一個處理某一個多播IP的進程的時候,這個進程會給網卡綁定一個虛擬的多播mac地址,并做出來一個多播 ip。這樣,網卡就會讓帶有這個多播mac地址的數據進來,從而實現通信,而那些沒有監聽這些數據的主機就會把這些數據過濾掉。
2.2、組播IP地址和MAC地址的關系
以太網組播地址范圍是從01-00-5E-00-00-00到01-00-5E-7F-FF-FF。組播MAC地址的高24bit位是以01-00-5E開頭,低23bit為組播IP地址的低23bit。
由于IP組播地址的高4bit是1110,標識了組播組,而低28bit中只有23bit被映像到組播MAC地址上,這樣IP組播地址中就會有5bit沒有使用,從而出現了32個IP組播地址映像到同一MAC地址上的結果。
2.3、IGMP概念
IGMP,就是Internet Group Management Protocol的意思。該協議用來在ip主機和與其直接相鄰的組播路由器之間建立、維護組播組成員關系,但不包括組播路由器之間的組成員關系信息的傳播與維護,這部分工作由各組播路由協議完成。所有參與組播的主機必須實現IGMP。
IGMP目前有三個版本,目前用的最多的是IGMPv2。IGMPv1主要基于查詢和響應機制來完成對組播組成員的管理;IGMPv2增加了查詢器選舉機制和離開組機制;IGMPv3在兼容和繼承IGMPv1和IGMPv2的基礎上,進一步增強了主機的控制能力,并增強了查詢和報告報文的功能。
2.4、IGMP報文格式
1.IGMPv1:
V1報文格式如下:
- 4位版本
目前IGMP有V1,V2,V3三個版本,比如是V1則該4位為1, V3則該4 位為3。
- 4位類型
有成員關系查詢0x11和成員關系報告0x12兩種類型。
- 校驗和
該8個字節的校驗碼。
- 32位組地址
當發送報文是成員關系報告時,該32位組地址即組播組地址。 當發送的報文是成員關系查詢時,該32位為全0。V1版本只支持通用關系查詢,不支持特定組查詢。
2.IGMPv2:
V2版本報文格式如下:
- 8位類型
有三種類型:
1、成員關系查詢0x11:在V2和V3中成員關系查詢增加特定組查詢。 常規查詢:用于確定哪些組播組是活躍的,即改組是否還有成員在使用,常規查詢組地址由全零表示。
特定組查詢:用于查詢某具體組播組是否還有組成員。
2、成員關系報告0x16(版本1成員關系報告0x12)
3、離開組消息0x17。
- 8位最大響應時間
以0.1秒為單位,默認值是100,即10秒。
- 校驗和
報文段8個字節的校驗碼。
- 組地址
1、成員關系查詢報文:常規查詢組低位為全0,特定組查詢則應設置對應的組地址。
2、成員報告或離開組消息:組地址為要報告或要離開的組地址。
3.V1、V2、V3比較:
2.5、IGMP協議
1.加入一個多播組
多播的基礎就是一個進程的概念(使用的術語進程是指操作系統執行的一個程序),該進程在一個主機的給定接口上加入了一個多播組。在一個給定接口上的多播組中的成員是動態的—它隨時因進程加入和離開多播組而變化。
這里所指的進程必須以某種方式在給定的接口上加入某個多播組。進程也能離開先前加入的多播組。這些是一個支持多播主機中任何API所必需的部分。使用限定詞“接口”是因為多播組中的成員是與接口相關聯的。一個進程可以在多個接口上加入同一多播組。
2.IGMP報告和查詢
多播路由器使用IGMP報文來記錄與該路由器相連網絡中組成員的變化情況。使用規則如下:
- 當第一個進程加入一個組時,主機就發送一個IGMP報告。如果一個主機的多個進程加入同一組,只發送一個IGMP報告。這個報告被發送到進程加入組所在的同一接口上。
- 進程離開一個組時,主機不發送IGMP報告,即便是組中的最后一個進程離開。主機知道在確定的組中已不再有組成員后,在隨后收到的IGMP查詢中就不再發送報告報文。
- 多播路由器定時發送IGMP查詢來了解是否還有任何主機包含有屬于多播組的進程。多播路由器必須向每個接口發送一個IGMP查詢。因為路由器希望主機對它加入的每個多播組均發回一個報告,因此IGMP查詢報文中的組地址被設置為0。
- 主機通過發送IGMP報告來響應一個IGMP查詢,對每個至少還包含一個進程的組均要發回IGMP報告。
使用這些查詢和報告報文,多播路由器對每個接口保持一個表,表中記錄接口上至少還包含一個主機的多播組。當路由器收到要轉發的多播數據報時,它只將該數據報轉發到(使用相應的多播鏈路層地址)還擁有屬于那個組主機的接口上。
下圖顯示了兩個IGMP報文,一個是主機發送的報告,另一個是路由器發送的查詢。該路由器正在要求那個接口上的每個主機說明它加入的每個多播組。
3.離開報文(僅限IGMPv2和v3)
該報文由主機發出。當主機離開組播組時發送此報文,向組播路由器報告離開了特定的組播組。離開報文的目標IP為224.0.0.2(所有組播路由器),IGMP報頭內的組播IP為特定離開組的IP。
2.6、實現細節
為改善IGMP協議的效率,有許多實現的細節要考慮。首先,當一個主機首次發送IGMP報告(當第一個進程加入一個多播組)時,并不保證該報告被可靠接收(因為使用的是IP交付服務)。下一個報告將在間隔一段時間后發送。這個時間間隔由主機在0 ~ 1 0秒的范圍內隨機選擇。
其次,當一個主機收到一個從路由器發出的查詢后,并不立即響應,而是經過一定的時間間隔后才發出一些響應(采用“響應”的復數形式是因為該主機必須對它參加的每個組均發送一個響應)。既然參加同一多播組的多個主機均能發送一個報告,可將它們的發送間隔設置為隨機時延。在一個物理網絡中的所有主機將收到同組其他主機發送的所有報告,報告中的目的地址是那個組地址。這意味著如果一個主機在等待發送報告的過程中,卻收到了發自其他主機的相同報告,則該主機的響應就可以不必發送了。因為多播路由器并不關心有多少主機屬于該組,而只關心該組是否還至少擁有一個主機。的確,一個多播路由器甚至不關心哪個主機屬于一個多播組。它僅僅想知道在給定的接口上的多播組中是否還至少有一個主機。
在沒有任何多播路由器的單個物理網絡中,僅有的IGMP通信量就是在主機加入一個新的多播組時,支持IP多播的主機所發出的報告。
三、附
下圖是ICMP報文種類,僅供參考。
四、反思
IGMP還是不甚了解,希望往后能靜下心再來好好回顧,深入了解。