ping 原理与ICMP协议---转
http://blog.csdn.net/inject2006/article/details/2139149
ping?的原理
ping?程序是用來探測主機到主機之間是否可通信,如果不能ping到某臺主機,表明不能和這臺主機建立連接。ping?使用的是ICMP協議,它發送icmp回送請求消息給目的主機。ICMP協議規定:目的主機必須返回ICMP回送應答消息給源主機。如果源主機在一定時間內收到應答,則認為主機可達。 ICMP協議通過IP協議發送的,IP協議是一種無連接的,不可靠的數據包協議。在Unix/Linux,序列號從0開始計數,依次遞增。而Windows ping程序的ICMP序列號是沒有規律。 ICMP協議在實際傳輸中數據包:20字節IP首部 + 8字節ICMP首部+ 1472字節<數據大小>38字節 ICMP報文格式:IP首部(20字節)+8位類型+8位代碼+16位校驗和+(不同的類型和代碼,格式也有所不同) Ping工作過程——??? 假定主機A的IP地址是192.168.1.1,主機B的IP地址是192.168.1.2,都在同一子網內,則當你在主機A上運行“Ping?192.168.1.2”后,都發生了些什么呢?
首先,Ping命令會構建一個固定格式的ICMP請求數據包,然后由ICMP協議將這個數據包連同地址“192.168.1.2”一起交給IP層協議(和ICMP一樣,實際上是一組后臺運行的進程),IP層協議將以地址“192.168.1.2”作為目的地址,本機IP地址作為源地址,加上一些其他的控制信息,構建一個IP數據包,并在一個映射表中查找出IP地址192.168.1.2所對應的物理地址(也叫MAC地址,熟悉網卡配置的朋友不會陌生,這是數據鏈路層協議構建數據鏈路層的傳輸單元——幀所必需的),一并交給數據鏈路層。后者構建一個數據幀,目的地址是IP層傳過來的物理地址,源地址則是本機的物理地址,還要附加上一些控制信息,依據以太網的介質訪問規則,將它們傳送出去。 其中映射表由ARP實現。ARP(Address Resolution Protocol)是地址解析協議,是一種將IP地址轉化成物理地址的協議。ARP具體說來就是將網絡層(IP層,也就是相當于OSI的第三層)地址解析為數據連接層(MAC層,也就是相當于OSI的第二層)的MAC地址。
??? 主機B收到這個數據幀后,先檢查它的目的地址,并和本機的物理地址對比,如符合,則接收;否則丟棄。接收后檢查該數據幀,將IP數據包從幀中提取出來,交給本機的IP層協議。同樣,IP層檢查后,將有用的信息提取后交給ICMP協議,后者處理后,馬上構建一個ICMP應答包,發送給主機A,其過程和主機A發送ICMP請求包到主機B一模一樣。 即先由IP地址,在網絡層傳輸,然后再根據mac地址由數據鏈路層傳送到目的主機 ICMP——
1.IMCP協議介紹
前面講到了,IP協議并不是一個可靠的協議,它不保證數據被送達,那么,自然的,保證數據送達的工作應該由其他的模塊來完成。其中一個重要的模塊就是ICMP(網絡控制報文)協議。
當傳送IP數據包發生錯誤--比如主機不可達,路由不可達等等,ICMP協議將會把錯誤信息封包,然后傳送回給主機。給主機一個處理錯誤的機會,這 也就是為什么說建立在IP層以上的協議是可能做到安全的原因。ICMP數據包由8bit的錯誤類型和8bit的代碼和16bit的校驗和組成。而前 16bit就組成了ICMP所要傳遞的信息。
盡管在大多數情況下,錯誤的包傳送應該給出ICMP報文,但是在特殊情況下,是不產生ICMP錯誤報文的。如下
雖然里面的一些規定現在還不是很明白,但是所有的這一切規定,都是為了防止產生ICMP報文的無限傳播而定義的。
ICMP協議大致分為兩類,一種是查詢報文,一種是差錯報文。其中查詢報文有以下幾種用途:
而差錯報文則產生在數據傳送發生錯誤的時候。就不贅述了。
2.ICMP的應用--ping
ping可以說是ICMP的最著名的應用,當我們某一個網站上不去的時候。通常會ping一下這個網站。ping會回顯出一些有用的信息。一般的信息如下:
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Ping?statistics for 10.4.24.1:
??? Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
??? Minimum = 0ms, Maximum = 0ms, Average = 0ms
ping這個單詞源自聲納定位,而這個程序的作用也確實如此,它利用ICMP協議包來偵測另一個主機是否可達。原理是用類型碼為0的ICMP發請 求,受到請求的主機則用類型碼為8的ICMP回應。ping程序來計算間隔時間,并計算有多少個包被送達。用戶就可以判斷網絡大致的情況。我們可以看到,?ping給出來了傳送的時間和TTL的數據。我給的例子不太好,因為走的路由少,有興趣地可以ping一下國外的網站比如sf.net,就可以觀察到一些 丟包的現象,而程序運行的時間也會更加的長。
ping還給我們一個看主機到目的主機的路由的機會。這是因為,ICMP的ping請求數據報在每經過一個路由器的時候,路由器都會把自己的ip放到該數 據報中。而目的主機則會把這個ip列表復制到回應icmp數據包中發回給主機。但是,無論如何,ip頭所能紀錄的路由列表是非常的有限。如果要觀察路由, 我們還是需要使用更好的工具,就是要講到的Traceroute(windows下面的名字叫做tracert)。
3.ICMP的應用--Traceroute
Traceroute是用來偵測主機到目的主機之間所經路由情況的重要工具,也是最便利的工具。前面說到,盡管ping工具也可以進行偵測,但是,因為ip頭的限制,ping不能完全的記錄下所經過的路由器。所以Traceroute正好就填補了這個缺憾。
Traceroute的原理是非常非常的有意思,它受到目的主機的IP后,首先給目的主機發送一個TTL=1(還記得TTL是什么嗎?)的UDP(后面就 知道UDP是什么了)數據包,而經過的第一個路由器收到這個數據包以后,就自動把TTL減1,而TTL變為0以后,路由器就把這個包給拋棄了,并同時產生 一個主機不可達的ICMP數據報給主機。主機收到這個數據報以后再發一個TTL=2的UDP數據報給目的主機,然后刺激第二個路由器給主機發ICMP數據 報。如此往復直到到達目的主機。這樣,traceroute就拿到了所有的路由器ip。從而避開了ip頭只能記錄有限路由IP的問題。
有人要問,我怎么知道UDP到沒到達目的主機呢?這就涉及一個技巧的問題,TCP和UDP協議有一個端口號定義,而普通的網絡程序只監控少數的幾個號碼較 小的端口,比如說80,比如說23,等等。而traceroute發送的是端口號>30000(真變態)的UDP報,所以到達目的主機的時候,目的 主機只能發送一個端口不可達的ICMP數據報給主機。主機接到這個報告以后就知道,主機到了
轉載于:https://www.cnblogs.com/davidwang456/p/3510226.html
總結
以上是生活随笔為你收集整理的ping 原理与ICMP协议---转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用C语言实现Ping程序功能---转
- 下一篇: TCP/IP协议簇分层详解---转