一江场、ICMP
1.1检痰、什么是ICMP
ICMP的全稱是Internet Control Message Protocol(網(wǎng)際控制信息協(xié)議)引谜。
ICMP工作在TCP/IP體系中的網(wǎng)絡(luò)層,是IP協(xié)議的一個補充瞬捕,主要用于在主機與路由器之間傳遞控制信息歉嗓,包括報告錯誤丰介、交換受限控制和狀態(tài)信息等。ICMP報文通常被IP層或更高層協(xié)議(TCP或UDP)使用鉴分。ICMP報文是在IP數(shù)據(jù)報內(nèi)部傳輸?shù)南薄P協(xié)議是不可靠協(xié)議,不能保證 IP數(shù)據(jù)報能夠成功的到達目的主機志珍,無法進行差錯控制橙垢,當(dāng)遇到IP數(shù)據(jù)無法訪問目標、IP路由器無法按當(dāng)前的傳輸速率轉(zhuǎn)發(fā)數(shù)據(jù)包等情況時伦糯,會自動發(fā)送ICMP消息钢悲。
1.2、ICMP報文格式
類型:一個8位類型字段舔株,表示 ICMP 數(shù)據(jù)包類型莺琳;
代碼:一個8位代碼域,表示指定類型中的一個功能载慈,如果一個類型中只有一種功能惭等,代碼域置為 0;
檢驗和:數(shù)據(jù)包中 ICMP 部分上的一個16位檢驗和办铡;
ICMP數(shù)據(jù)部分:包含了所有接受到的數(shù)據(jù)報的IP報頭辞做,還包含IP數(shù)據(jù)報中前8個字節(jié)的數(shù)據(jù)琳要。
格式解釋:
ICMP報文的前4個字節(jié)是統(tǒng)一的格式,共有三個字段:即類型秤茅,代碼和檢驗和稚补。
8位類型和8位代碼字段一起決定了ICMP報文的類型。
類型8框喳,代碼0:表示回顯請求(ping請求)课幕;
類型0,代碼0:表示回顯應(yīng)答(ping應(yīng)答)五垮;
類型11乍惊,代碼0:超時…
16位的檢驗和字段:包括數(shù)據(jù)在內(nèi)的整個ICMP數(shù)據(jù)包的檢驗和,其計算方法和IP頭部檢驗和的計算方法一樣的放仗。
ICMP報文具體分ICMP差錯報告報文和ICMP詢問報文(對ICMP差錯報文有時需要做特殊處理润绎,因此要對其進行區(qū)分。如:對ICMP差錯報文進行響應(yīng)時诞挨,永遠不會生成另一份ICMP差錯報文莉撇,否則會出現(xiàn)死循環(huán))。
1.3惶傻、ICMP種類
ICMP報文具體分ICMP差錯報告報文和ICMP詢問報文(對ICMP差錯報文有時需要做特殊處理棍郎,因此要對其進行區(qū)分。如:對ICMP差錯報文進行響應(yīng)時达罗,永遠不會生成另一份ICMP差錯報文坝撑,否則會出現(xiàn)死循環(huán))静秆。
下面主要學(xué)習(xí)幾種常用的ICMP報文類型粮揉。
1.ICMP差錯報文
終點不可達(Type=3)
IP路由器無法將IP數(shù)據(jù)報發(fā)送給目的地址時,會給發(fā)送端主機返回一個終點不可達ICMP消息抚笔。例如我們要連接對方一個不存在的系統(tǒng)端口(端口號小于1024)時扶认,將返回Type=3、Code=3的ICMP報文殊橙,它要告訴我們:“嘿辐宾,別連接了,我不在家的膨蛮!”叠纹,常見的不可到達類型還有網(wǎng)絡(luò)不可到達(Code=0)、主機不可到達(Code=1)敞葛、協(xié)議不可到達(Code=2)等誉察。
時間超過
超時報文的代碼域有兩種取值:Code=0表示傳輸超時,Code=1表示重組分段超時惹谐。
IP 數(shù)據(jù)包中有一個字段TTL(Time to live持偏,生存周期)驼卖,它的值隨著每經(jīng)過一個路由器就會減1,當(dāng)路由器收到生存時間TTL為零的數(shù)據(jù)報時鸿秆,除丟棄該數(shù)據(jù)報外酌畜,還要向源站發(fā)送時間超過報文。當(dāng)目的站在預(yù)先規(guī)定的時間內(nèi)不能收到一個數(shù)據(jù)報的全部數(shù)據(jù)報片時卿叽,就將已收到的數(shù)據(jù)報片都丟棄桥胞,并向源站發(fā)送時間超過報文。
參數(shù)問題
當(dāng)路由器或目的主機收到的數(shù)據(jù)報的首部中的字段的值不正確時附帽,就丟棄該數(shù)據(jù)報埠戳,并向源站發(fā)送參數(shù)問題報文。
改變路由(重定向)
如果路由器發(fā)現(xiàn)發(fā)送端主機使用次優(yōu)的路徑發(fā)送數(shù)據(jù)時蕉扮,那么它會返回一個ICMP 重定向消息給這個主機整胃,這個消息包含了最合適的路由信息和源數(shù)據(jù)。主要發(fā)生在路由器持有更好的路由信息的情況下喳钟,路由器會通過這個ICMP 重定向消息給發(fā)送端主機一個更合適的發(fā)送路由屁使。
以下幾種情況都不會導(dǎo)致產(chǎn)生ICMP差錯報文:
ICMP差錯報文(但是,ICMP查詢報文可能會產(chǎn)生ICMP差錯報文)奔则;
目的地址是廣播地址或多播地址的IP數(shù)據(jù)報蛮寂;
作為鏈路層廣播的數(shù)據(jù)報;
不是IP分片的第一片易茬;
源地址不是單個主機的數(shù)據(jù)報酬蹋。即源地址不能為零地址、環(huán)回地址抽莱、廣播地址或多播地址范抓。
這些規(guī)則是為了防止過去允許ICMP差錯報文對廣播分組響應(yīng)所帶來的廣播風(fēng)暴。
所有的ICMP差錯報告報文中的數(shù)據(jù)字段都具有同樣的格式食铐。將收到的需要進行差錯報告IP數(shù)據(jù)報的首部和數(shù)據(jù)字段的前8個字節(jié)提取出來匕垫,作為ICMP報文的數(shù)據(jù)字段。再加上響應(yīng)的ICMP差錯報告報文的前8個字節(jié)虐呻,就構(gòu)成了ICMP差錯報告報文象泵。提取收到的數(shù)據(jù)報的數(shù)據(jù)字段的前8個字節(jié)是為了得到運輸層的端口號(對于TCP和UDP)以及運輸層報文的發(fā)送序號(對于TCP)。
2.ICMP詢問報文
回送消息
用于進行通信的主機或路由之間斟叼,判斷發(fā)送數(shù)據(jù)包是否成功到達對端的消息偶惠。可以向?qū)Χ酥鳈C發(fā)送回送請求消息朗涩,也可以接收對端主機回來的回送應(yīng)答消息忽孽。
我們?nèi)粘J褂米疃嗟膒ing,就是響應(yīng)請求(Type=8)和應(yīng)答(Type=0),一臺主機向一個節(jié)點發(fā)送一個Type=8的ICMP報文扒腕,如果途中沒有異常(例如被路由器丟棄绢淀、目標不回應(yīng)ICMP或傳輸失敗)瘾腰,則目標返回Type=0的ICMP報文皆的,說明這臺主機存在。
時間戳消息
時間戳請求報文(Type=13)和時間戳應(yīng)答報文(Type=14)用于測試兩臺主機之間數(shù)據(jù)報來回一次的傳輸時間蹋盆。傳輸時费薄,主機填充原始時間戳,接收方收到請求后填充接收時間戳后以Type=14的報文格式返回栖雾,發(fā)送方計算這個時間差楞抡。一些系統(tǒng)不響應(yīng)這種報文。
1.4析藕、ICMP應(yīng)用
1.PING
ping是一個用來查詢網(wǎng)絡(luò)通不通的一個工具召廷,是系統(tǒng)自帶的,運行于內(nèi)核账胧,調(diào)用ICMP協(xié)議竞慢。
ping的工作原理:ping通過調(diào)用echo來發(fā)送請求,通過是否收到echo-reply來查詢網(wǎng)絡(luò)層的連通性治泥。ping的結(jié)果會給出傳送的時間和TTL的數(shù)據(jù)筹煮,還可以查看主機到目的主機的路由。這是因為ICMP的ping請求數(shù)據(jù)報在每經(jīng)過一個路由器的時候居夹,路由器就會把自己的IP地址放到該數(shù)據(jù)包中败潦,而目的主機則會把這個IP列表復(fù)制到ICMP數(shù)據(jù)包中發(fā)回給主機。但是准脂,IP頭能記錄的路由列表非常有限劫扒,如果要觀看完整的路由信息,就要用到traceroute工具了意狠。
2.traceroute
traceroute是用來偵測主機到目的主機所經(jīng)路由情況的工具粟关,可以獲取到所經(jīng)路由器的IP地址疮胖。
traceroute的工作原理:它收到目的主機的IP后环戈,首先給目的主機發(fā)送一個TTL=1的UDP數(shù)據(jù)包,而經(jīng)過的第一個路由器收到這個數(shù)據(jù)包以后澎灸,就自動將TTL減1院塞。而TTL變?yōu)?以后,路由器就把這個包給拋棄了性昭,并同時產(chǎn)生一個主機不可達的ICMP數(shù)據(jù)包給主機拦止。主機收到這個數(shù)據(jù)包以后就發(fā)送一個TTL=2的數(shù)據(jù)包給主機,然后刺激第二個路由器給主機發(fā)送ICMP數(shù)據(jù)包,如此反復(fù)直到到達目的主機汹族。這樣萧求,traceroute就拿到了所有的路由器IP,從而避免了IP頭只能記錄有限的路由IP
的問題顶瞒。
二夸政、IGMP
IGMP也是IP協(xié)議的一個補充,位于TCP/IP體系中的網(wǎng)絡(luò)層榴徐。
2.1守问、單播,多播坑资,廣播的介紹
1.單播(Unicast)
單播是說耗帕,對特定的主機進行數(shù)據(jù)傳送。例如給某一個主機發(fā)送IP數(shù)據(jù)包袱贮。這時候仿便,數(shù)據(jù)鏈路層給出的數(shù)據(jù)頭里面是非常具體的目的地址,對于以太網(wǎng)來 說攒巍,就是網(wǎng)卡的MAC地址√皆剑現(xiàn)在的具有路由功能的主機應(yīng)該可以將單播數(shù)據(jù)定向轉(zhuǎn)發(fā),而目的主機的網(wǎng)絡(luò)接口則可以過濾掉和自己MAC地址不一致的數(shù)據(jù)窑业。
2.廣播(Broadcast)
廣播是主機針對某一個網(wǎng)絡(luò)上的所有主機發(fā)送數(shù)據(jù)包钦幔。這個網(wǎng)絡(luò)可能是網(wǎng)絡(luò),可能是子網(wǎng)常柄,還可能是所有的子網(wǎng)鲤氢。如果是網(wǎng)絡(luò),例如A類網(wǎng)址的廣播就是 netid.255.255.255西潘,如果是子網(wǎng)卷玉,則是netid.netid.subnetid.255;如果是所有的子網(wǎng)(B類IP)則是則是 netid.netid.255.255喷市。廣播所用的MAC地址FF-FF-FF-FF-FF-FF相种。網(wǎng)絡(luò)內(nèi)所有的主機都會收到這個廣播數(shù)據(jù),網(wǎng)卡只要把 MAC地址為FF-FF-FF-FF-FF-FF的數(shù)據(jù)交給內(nèi)核就可以了品姓。一般說來ARP寝并,或者路由協(xié)議RIP應(yīng)該是以廣播的形式播發(fā)的。
PS:
在使用TCP/IP 協(xié)議的網(wǎng)絡(luò)中腹备,主機標識段host ID 為全1的IP地址為廣播地址衬潦。
受限廣播
它不被路由發(fā)送,但會被送到相同物理網(wǎng)絡(luò)段上的所有主機
IP地址的網(wǎng)絡(luò)字段和主機字段全為1就是地址255.255.255.255
直接廣播
網(wǎng)絡(luò)廣播會被路由植酥,并會發(fā)送到專門網(wǎng)絡(luò)上的每臺主機IP地址的網(wǎng)絡(luò)字段定義這個網(wǎng)絡(luò)镀岛,主機字段通常全為1弦牡,如 192.168.10.255。
3.多播(Multicast)
可以說廣播是多播的特例漂羊,多播就是給一組特定的主機(多播組)發(fā)送數(shù)據(jù)驾锰,這樣,數(shù)據(jù)的播發(fā)范圍會小一些(實際上播發(fā)的范圍一點也沒有變小)走越,多播的MAC地址是最高字節(jié)的低位為一稻据,例 如01-00-00-00-00-00。多播組的地址是D類IP买喧,規(guī)定是224.0.0.0-239.255.255.255捻悯。
224.0.0.0~224.0.0.255為預(yù)留的組播地址(永久組地址),地址224.0.0.0保留不做分配淤毛,其它地址供路由協(xié)議使用今缚;
224.0.1.0~224.0.1.255是公用組播地址,可以用于Internet低淡;
224.0.2.0~238.255.255.255為用戶可用的組播地址(臨時組地址)姓言,全網(wǎng)范圍內(nèi)有效;
239.0.0.0~239.255.255.255為本地管理組播地址蔗蹋,僅在特定的本地范圍內(nèi)有效何荚。
雖然多播比較特殊,但是究其原理猪杭,多播的數(shù)據(jù)還是要通過數(shù)據(jù)鏈路層進行MAC地址綁定然后進行發(fā)送餐塘。所以一個以太網(wǎng)卡在綁定了一個多播IP地址之后,必 定還要綁定一個多播的MAC地址皂吮,才能使得其可以像單播那樣工作戒傻。這個多播的IP和多播MAC地址有一個對應(yīng)的算法》涑铮可以看到 這個對應(yīng)不是一一對應(yīng)的需纳,主機還是要對多播數(shù)據(jù)進行過濾。
PS:廣播和多播的性質(zhì)是一樣的艺挪,路由器會把數(shù)據(jù)放到局域網(wǎng)里面不翩,然后網(wǎng)卡對這些數(shù)據(jù)進行過濾,只拿到自己打算要的數(shù)據(jù)麻裳,比如自己感興趣的多 播數(shù)據(jù)口蝠,自己感興趣的組播數(shù)據(jù)。當(dāng)一個主機運行了一個處理某一個多播IP的進程的時候掂器,這個進程會給網(wǎng)卡綁定一個虛擬的多播mac地址亚皂,并做出來一個多播 ip俱箱。這樣国瓮,網(wǎng)卡就會讓帶有這個多播mac地址的數(shù)據(jù)進來,從而實現(xiàn)通信,而那些沒有監(jiān)聽這些數(shù)據(jù)的主機就會把這些數(shù)據(jù)過濾掉乃摹。
2.2禁漓、組播IP地址和MAC地址的關(guān)系
以太網(wǎng)組播地址范圍是從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沒有使用,從而出現(xiàn)了32個IP組播地址映像到同一MAC地址上的結(jié)果蹈集。
2.3烁试、IGMP概念
IGMP,就是Internet Group Management Protocol的意思拢肆。該協(xié)議用來在ip主機和與其直接相鄰的組播路由器之間建立减响、維護組播組成員關(guān)系,但不包括組播路由器之間的組成員關(guān)系信息的傳播與維護郭怪,這部分工作由各組播路由協(xié)議完成支示。所有參與組播的主機必須實現(xiàn)IGMP。
IGMP目前有三個版本鄙才,目前用的最多的是IGMPv2颂鸿。IGMPv1主要基于查詢和響應(yīng)機制來完成對組播組成員的管理;IGMPv2增加了查詢器選舉機制和離開組機制攒庵;IGMPv3在兼容和繼承IGMPv1和IGMPv2的基礎(chǔ)上据途,進一步增強了主機的控制能力,并增強了查詢和報告報文的功能叙甸。
2.4颖医、IGMP報文格式
1.IGMPv1:
V1報文格式如下:
4位版本
目前IGMP有V1,V2裆蒸,V3三個版本熔萧,比如是V1則該4位為1, V3則該4 位為3僚祷。
4位類型
有成員關(guān)系查詢0x11和成員關(guān)系報告0x12兩種類型佛致。
校驗和
該8個字節(jié)的校驗碼。
32位組地址
當(dāng)發(fā)送報文是成員關(guān)系報告時辙谜,該32位組地址即組播組地址俺榆。 當(dāng)發(fā)送的報文是成員關(guān)系查詢時,該32位為全0装哆。V1版本只支持通用關(guān)系查詢罐脊,不支持特定組查詢定嗓。
2.IGMPv2:
V2版本報文格式如下:
8位類型
有三種類型:
1、成員關(guān)系查詢0x11:在V2和V3中成員關(guān)系查詢增加特定組查詢萍桌。 常規(guī)查詢:用于確定哪些組播組是活躍的宵溅,即改組是否還有成員在使用,常規(guī)查詢組地址由全零表示上炎。
特定組查詢:用于查詢某具體組播組是否還有組成員恃逻。
2、成員關(guān)系報告0x16(版本1成員關(guān)系報告0x12)
3藕施、離開組消息0x17寇损。
8位最大響應(yīng)時間
以0.1秒為單位,默認值是100裳食,即10秒润绵。
校驗和
報文段8個字節(jié)的校驗碼。
組地址
1胞谈、成員關(guān)系查詢報文:常規(guī)查詢組低位為全0尘盼,特定組查詢則應(yīng)設(shè)置對應(yīng)的組地址。
2烦绳、成員報告或離開組消息:組地址為要報告或要離開的組地址卿捎。
3.V1、V2径密、V3比較:
2.5午阵、IGMP協(xié)議
1.加入一個多播組
多播的基礎(chǔ)就是一個進程的概念(使用的術(shù)語進程是指操作系統(tǒng)執(zhí)行的一個程序),該進程在一個主機的給定接口上加入了一個多播組享扔。在一個給定接口上的多播組中的成員是動態(tài)的—它隨時因進程加入和離開多播組而變化底桂。
這里所指的進程必須以某種方式在給定的接口上加入某個多播組。進程也能離開先前加入的多播組惧眠。這些是一個支持多播主機中任何API所必需的部分籽懦。使用限定詞“接口”是因為多播組中的成員是與接口相關(guān)聯(lián)的。一個進程可以在多個接口上加入同一多播組氛魁。
2.IGMP報告和查詢
多播路由器使用IGMP報文來記錄與該路由器相連網(wǎng)絡(luò)中組成員的變化情況暮顺。使用規(guī)則如下:
當(dāng)?shù)谝粋€進程加入一個組時,主機就發(fā)送一個IGMP報告秀存。如果一個主機的多個進程加入同一組捶码,只發(fā)送一個IGMP報告。這個報告被發(fā)送到進程加入組所在的同一接口上或链。
進程離開一個組時惫恼,主機不發(fā)送IGMP報告,即便是組中的最后一個進程離開澳盐。主機知道在確定的組中已不再有組成員后祈纯,在隨后收到的IGMP查詢中就不再發(fā)送報告報文令宿。
多播路由器定時發(fā)送IGMP查詢來了解是否還有任何主機包含有屬于多播組的進程。多播路由器必須向每個接口發(fā)送一個IGMP查詢盆繁。因為路由器希望主機對它加入的每個多播組均發(fā)回一個報告掀淘,因此IGMP查詢報文中的組地址被設(shè)置為0旬蟋。
主機通過發(fā)送IGMP報告來響應(yīng)一個IGMP查詢油昂,對每個至少還包含一個進程的組均要發(fā)回IGMP報告。
使用這些查詢和報告報文倾贰,多播路由器對每個接口保持一個表冕碟,表中記錄接口上至少還包含一個主機的多播組。當(dāng)路由器收到要轉(zhuǎn)發(fā)的多播數(shù)據(jù)報時匆浙,它只將該數(shù)據(jù)報轉(zhuǎn)發(fā)到(使用相應(yīng)的多播鏈路層地址)還擁有屬于那個組主機的接口上安寺。
下圖顯示了兩個IGMP報文,一個是主機發(fā)送的報告首尼,另一個是路由器發(fā)送的查詢挑庶。該路由器正在要求那個接口上的每個主機說明它加入的每個多播組。
3.離開報文(僅限IGMPv2和v3)
該報文由主機發(fā)出软能。當(dāng)主機離開組播組時發(fā)送此報文迎捺,向組播路由器報告離開了特定的組播組。離開報文的目標IP為224.0.0.2(所有組播路由器)查排,IGMP報頭內(nèi)的組播IP為特定離開組的IP凳枝。
2.6、實現(xiàn)細節(jié)
為改善IGMP協(xié)議的效率跋核,有許多實現(xiàn)的細節(jié)要考慮岖瑰。首先,當(dāng)一個主機首次發(fā)送IGMP報告(當(dāng)?shù)谝粋€進程加入一個多播組)時砂代,并不保證該報告被可靠接收(因為使用的是IP交付服務(wù))蹋订。下一個報告將在間隔一段時間后發(fā)送。這個時間間隔由主機在0 ~ 1 0秒的范圍內(nèi)隨機選擇刻伊。
其次辅辩,當(dāng)一個主機收到一個從路由器發(fā)出的查詢后,并不立即響應(yīng)娃圆,而是經(jīng)過一定的時間間隔后才發(fā)出一些響應(yīng)(采用“響應(yīng)”的復(fù)數(shù)形式是因為該主機必須對它參加的每個組均發(fā)送一個響應(yīng))玫锋。既然參加同一多播組的多個主機均能發(fā)送一個報告,可將它們的發(fā)送間隔設(shè)置為隨機時延讼呢。在一個物理網(wǎng)絡(luò)中的所有主機將收到同組其他主機發(fā)送的所有報告撩鹿,報告中的目的地址是那個組地址。這意味著如果一個主機在等待發(fā)送報告的過程中悦屏,卻收到了發(fā)自其他主機的相同報告节沦,則該主機的響應(yīng)就可以不必發(fā)送了键思。因為多播路由器并不關(guān)心有多少主機屬于該組,而只關(guān)心該組是否還至少擁有一個主機甫贯。的確吼鳞,一個多播路由器甚至不關(guān)心哪個主機屬于一個多播組。它僅僅想知道在給定的接口上的多播組中是否還至少有一個主機叫搁。
在沒有任何多播路由器的單個物理網(wǎng)絡(luò)中赔桌,僅有的IGMP通信量就是在主機加入一個新的多播組時,支持IP多播的主機所發(fā)出的報告渴逻。
三疾党、附
下圖是ICMP報文種類,僅供參考惨奕。
四雪位、反思
IGMP還是不甚了解,希望往后能靜下心再來好好回顧梨撞,深入了解雹洗。
---------------------
作者:w1992wishes
來源:CSDN
原文:https://blog.csdn.net/w1992wishes/article/details/78135509