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(網絡控制報文)協議。windows

當傳送IP數據包發生錯誤--好比主機不可達,路由不可達等等,ICMP協議將會把錯誤信息封包,而後傳送回給主機。給主機一個處理錯誤的機會,這 也就是爲何說創建在IP層以上的協議是可能作到安全的緣由。ICMP數據包由8bit的錯誤類型和8bit的代碼和16bit的校驗和組成。而前 16bit就組成了ICMP所要傳遞的信息。安全

儘管在大多數狀況下,錯誤的包傳送應該給出ICMP報文,可是在特殊狀況下,是不產生ICMP錯誤報文的。以下網絡

  1. ICMP差錯報文不會產生ICMP差錯報文(出IMCP查詢報文)(防止IMCP的無限產生和傳送)
  2. 目的地址是廣播地址或多播地址的IP數據報。
  3. 做爲鏈路層廣播的數據報。
  4. 不是IP分片的第一片。
  5. 源地址不是單個主機的數據報。這就是說,源地址不能爲零地址、環回地址、廣播地 址或多播地址。

雖然裏面的一些規定如今還不是很明白,可是全部的這一切規定,都是爲了防止產生ICMP報文的無限傳播而定義的。工具

ICMP協議大體分爲兩類,一種是查詢報文,一種是差錯報文。其中查詢報文有如下幾種用途:網站

  1. ping查詢
  2. 子網掩碼查詢(用於無盤工做站在初始化自身的時候初始化子網掩碼)
  3. 時間戳查詢(能夠用來同步時間)

而差錯報文則產生在數據傳送發生錯誤的時候。就不贅述了。spa

2.ICMP的應用--ping

ping能夠說是ICMP的最著名的應用,當咱們某一個網站上不去的時候。一般會ping一下這個網站。ping會回顯出一些有用的信息。通常的信息以下:.net

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 = 0msblog

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正好就填補了這個缺憾。ip

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數據報給主機。主機接到這個報告之後就知道,主機到了

相關文章
相關標籤/搜索