TCP/IP協(xié)議筆記5-ICMP協(xié)議及其應用

1 ICMP協(xié)議概述

ICMP(Internet Control Message Protocol)協(xié)議是因特網(wǎng)控制報文協(xié)議,ICMP常被認為是網(wǎng)絡(luò)層協(xié)議,它的報文存在于IP數(shù)據(jù)報的數(shù)據(jù)部分,如圖接奈。

ICMP協(xié)議棧

因為ICMP是基于IP數(shù)據(jù)報的网棍,所以跟TCP不同的是师骗,它是不需要指定端口的历等,更沒有建立連接一說。而且辟癌,通常來說ICMP協(xié)議都是內(nèi)核幫你實現(xiàn)的寒屯,系統(tǒng)自身就支持了,并不像TCP/HTTP等還要自己開個服務監(jiān)聽對應端口啥的黍少。 可能有人會有疑問了寡夹,既然沒有端口來標識了,那我有時候開多個ping進程厂置,這些響應消息是怎么對應到不同的ping進程的菩掏? 這個就是ICMP報文里面的標識符的作用了。標識符會在響應中帶回來昵济,這樣發(fā)送方就能根據(jù)標識符將請求和應答匹配了智绸。在ping中,這個標識符就是進程ID访忿。

ICMP報文有多種類型瞧栗,如地址掩碼請求和應答、時間戳請求和應答海铆、請求回顯和回顯應答等迹恐。ICMP報文通用格式如下,不同類型的報文內(nèi)容有所不同游添。ICMP協(xié)議在 ping系草,traceroute等工具中有典型應用通熄,下面都分析一下唆涝。

ICMP報文格式

2 Ping 原理分析

ping使用的是 ICMP 的請求回顯/回顯應答類型的報文,格式如下唇辨。它的內(nèi)容包括標識符廊酣、序列號以及回顯數(shù)據(jù)3部分,報文大小默認為 64 字節(jié)(header的8字節(jié)+body的56字節(jié))赏枚。

ICMP回顯報文格式
  • 請求回顯類型是8亡驰,回顯應答類型是0,他們代碼都是 0饿幅,校驗和是包內(nèi)容根據(jù)算法生成用于校驗數(shù)據(jù)完整性凡辱。
  • 標識符在 Linux/macOS 中用的是進程ID。
  • 序列號在 Linux/macOS 中是從0遞增的栗恩,每個進程獨立的透乾。
  • 回顯數(shù)據(jù)包括發(fā)送ping請求的時間戳(在macOS占8字節(jié),在Linux占16字節(jié)),以及一串填充數(shù)據(jù)乳乌,在Linux這串數(shù)字默認是0x10...37捧韵,共40字節(jié)。在macOS中是0x08090a...37汉操,共48字節(jié)再来。填充數(shù)據(jù)你也可以通過 -p pattern指定,比如 ping -pff 192.168.33.10磷瘤,則填充數(shù)據(jù)全部是 ff芒篷。
  • 默認TTL是64,你可以通過 -t ttl 指定TTL值膀斋。
  • ping請求時間 = 接收到回顯應答的時間 - 應答回顯數(shù)據(jù)中的時間

實例分析

在測試機ping我的虛擬機 ping -c2 192.168.33.10梭伐,192.168.33.10是我測試用的虛擬機IP,wireshark抓包如下:

Ping請求
Ping響應

可以驗證前面的分析仰担。第2對請求和應答跟第一對類似糊识,只是序列號,校驗和等不同罷了摔蓝。

關(guān)于校驗和

ICMP報文頭部中的校驗和生成/校驗方式也比較簡單赂苗。

  • 生成:先將校驗和置為0,然后將ICMP報文的header+body按16bit分組求和贮尉。如果結(jié)果溢出拌滋,則將高16位和低16位求和,直到高16位為0猜谚。最后求反就是檢驗和的值败砂。
  • 校驗:將報文的header+body按16bit分組求和(包括校驗和字段),看看結(jié)果是否全是1魏铅,如果不是昌犹,則校驗失敗。
ICMP校驗和算法

如何自己寫一個ping览芳?可以參考下這位朋友的ping工具的 python實現(xiàn)斜姥。 Lingerhk: icmp_ping_tool.py

3 Traceroute 原理分析

traceroute 用于查看IP數(shù)據(jù)報從一臺主機傳到另一臺主機所經(jīng)過的路由。其實沧竟,在IP數(shù)據(jù)報的頭部的選項字段有一個 IP記錄路由選項(RR)铸敏,它也可以記錄路由。為什么不直接用它而是另外弄出個traceroute工具悟泵,這是因為:

  • 1)IP首部長度限制杈笔,導致記錄的IP地址最多9個 ,遠遠不夠糕非。
  • 2)并不是所有路由器都支持記錄路由選項蒙具,因此某些路徑無法使用敦第。

traceroute 用到ICMP協(xié)議和TTL字段。TTL字段是數(shù)據(jù)報的生存周期店量,初始值通常默認是64芜果,每個處理數(shù)據(jù)報的路由器都需要把TTL值減去1或者數(shù)據(jù)報在路由器停留的秒數(shù)(因為絕大多數(shù)路由器轉(zhuǎn)發(fā)數(shù)據(jù)報時延都小于1秒,因此通常都是減去1融师,而且很多路由器的實現(xiàn)即便超過1秒也是減去1右钾,因此可以把TTL看做一個跳站計數(shù)器)。路由器接收到一份IP數(shù)據(jù)報時旱爆,如果TTL為0或者1舀射,則路由器不轉(zhuǎn)發(fā)該數(shù)據(jù)報,而是丟棄并給源機器發(fā)送一份ICMP超時報文怀伦,而ICMP信息中的IP報文中源地址正是路由器的IP地址脆烟。

traceroute的原理就是:

  • 先發(fā)送一份TTL為1的報文,這樣第一個路由器會將TTL減1然后丟棄該報文房待,并發(fā)回一個ICMP超時報文邢羔,這樣就得到了第一個路由器的IP地址;接著發(fā)送一個TTL為2的報文桑孩,可以得到第二個路由器的IP地址拜鹤;繼續(xù)該過程直到目的主機。
  • 但是目的主機即便收到TTL為1的報文流椒,它也不會丟棄該數(shù)據(jù)報并發(fā)回一份ICMP超時報文敏簿,因為此時數(shù)據(jù)報已經(jīng)到了目的地。為了判斷是否到達目的主機宣虾,traceroute發(fā)送的報文采用了UDP數(shù)據(jù)報惯裕,它選擇一個很大的端口值如30000以上的,以保證沒有其他應用程序使用該端口绣硝,然后目的主機會返回一個端口不可達的ICMP報文蜻势,這樣就可以知道什么時候結(jié)束。
  • traceroute針對每個TTL會發(fā)3次UDP報文域那,并打印每次的往返時間咙边。如果5秒內(nèi)沒有收到3次報文中任何一個的響應次员,則打印*號繼續(xù)下一個TLL的報文發(fā)送。3次報文選擇的UDP目的端口分別是 33435王带,33436淑蔚,33437,UDP報文數(shù)據(jù)長度為24字節(jié)愕撰,內(nèi)容為全0(macOS環(huán)境)刹衫。

實例分析

運行 traceroute 119.75.217.109醋寝,可以看到wireshark抓包的前幾跳信息,TTL最開始是1带迟,然后是2...音羞,端口是33435到33437,每個TTL發(fā)3次報文仓犬,在沒有達到目的主機前嗅绰,返回的是ICMP超時報文。到達主機后搀继,則會返回ICMP端口不可達報文窘面。

traceroute 請求的UDP報文
traceroute 響應的ICMP超時報文
traceroute 目的主機響應的ICMP端口不可達報文

由于IP路由通常都是動態(tài)的,每個路由器都要判斷數(shù)據(jù)報接下來要轉(zhuǎn)發(fā)到哪個路由器叽躯,應用程序?qū)β酚刹呗圆⒉豢刂撇票摺6鴗raceroute程序的IP源站選路選項(-g gateway)可以實現(xiàn)發(fā)送者指定路由,比如指定必須經(jīng)過哪些路由IP点骑,這里就不展開了酣难。有興趣的可以參見 《TCP/IP詳解 卷1:協(xié)議》的第8章。

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市跷跪,隨后出現(xiàn)的幾起案子馋嗜,更是在濱河造成了極大的恐慌,老刑警劉巖吵瞻,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葛菇,死亡現(xiàn)場離奇詭異,居然都是意外死亡橡羞,警方通過查閱死者的電腦和手機眯停,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卿泽,“玉大人莺债,你說我怎么就攤上這事∏┴玻” “怎么了齐邦?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長第租。 經(jīng)常有香客問我措拇,道長慎宾,這世上最難降的妖魔是什么浅悉? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任券犁,我火速辦了婚禮,結(jié)果婚禮上苛坚,老公的妹妹穿的比我還像新娘。我一直安慰自己泼舱,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布娇昙。 她就那樣靜靜地躺著笤妙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹲盘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天召衔,我揣著相機與錄音铃诬,去河邊找鬼苍凛。 笑死,一個胖子當著我的面吹牛醇蝴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悠栓,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笙瑟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逮走,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤今阳,失蹤者是張志新(化名)和其女友劉穎师溅,沒想到半個月后墓臭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡窿锉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年嗡载,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洼滚。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡技潘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铲掐,到底是詐尸還是另有隱情,我是刑警寧澤摆霉,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布奔坟,位于F島的核電站,受9級特大地震影響蛀蜜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滴某,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霎奢。 院中可真熱鬧户誓,春花似錦幕侠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舰褪。三九已至,卻和暖如春占拍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晃酒。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贝次,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓恼布,卻偏偏與公主長得像搁宾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盖腿,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 個人認為翩腐,Goodboy1881先生的TCP /IP 協(xié)議詳解學習博客系列博客是一部非常精彩的學習筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,051評論 0 8
  • 地址解析協(xié)議ARP 物理這一級茂卦,主機和路由器是用物理地址來區(qū)別的。物理地址是一個本地地址处渣,管轄范圍是本地網(wǎng)絡(luò),所以...
    顧慎為閱讀 1,057評論 0 1
  • IPv4分組 IPv4罐栈,即現(xiàn)在普遍使用的IP協(xié)議(版本為4)泥畅。IP協(xié)議定義數(shù)據(jù)傳送的基本單元——IP分組及其確切的...
    CodeKing2017閱讀 1,856評論 0 0
  • 前言 這一篇文章主要圍繞了IP協(xié)議,ICMP協(xié)議和UDP協(xié)議展開柑贞,希望可以在這里大概做一個總結(jié),將《TCP/IP協(xié)...
    Noskthing閱讀 3,077評論 5 57
  • 本篇結(jié)構(gòu): ICMP IGMP 附 反思 接著上一篇TCP/IP--劃分子網(wǎng)和構(gòu)造超網(wǎng)凌外,本章接著分享IP協(xié)議的兩個...
    w1992wishes閱讀 10,755評論 0 4