Tnsping 和TCP/IP 中的ping 的區別

star_guan2008發表於2008-04-25
Oracle Net 工具(命令)tnsping,是一個OSI會話層的工具,它用來:
1)驗證名字解析(name resolution,當然是oracle自己的網路服務名)
2)遠端的listener是否啟動
         在驗證上面兩項功能方面,它是DBA手頭上一個比較得心應手的工具。Oracle 網路介面支援不同的網路與傳輸協議,其中我們最熟悉的就是TCP/IP。這篇文章只描述TCP/IP 協議族,然而,在oracle網路介面支援的其它協議下,tnsping的功能是一樣的。

Tnsping 可以用在多個網路協議上,但是本文只討論TCP/IP網路協議
-----------------------------------------------------------------------------
ORACLE TNSPING
-----------------------------------------------------------------------------
         Oracle的tnsping測試程式,在通訊時使用TCP協議。TCP 是面向連線的OSI傳輸層協議。面向連線的協議在初始建立連線的階段需要進行初始的序列號的交換,這就是我們通常所指的三次握手。即tnsping測試程式在與listener進行通訊時會產生三次握手現象。

         當在命令列中發出了tnsping命令後,會執行oracle 網路別名(即網路服務名,主機連線字串)的解析工作。這個解析工作會在本地的tnsnames.ora檔案或ORACLE的命令伺服器或ORACLE LDAP(目錄服務)中進行。解析的目的是得到目標listener所在的機器名(IP地址)和listener偵聽的埠號。

         一旦得到listener的機器名與埠號,就可以開啟一個到目標機器與埠的TCP連線。為了開啟這個TCP連線,listener的機器名必須被解析為ip地址(當然這隻有在解析出的listener的連線地址為機器名時才這樣做),然後TCP/IP執行三次握手來完成這次連線。

         在連線建立之後,Tnsping工具然後就傳送一個Oracle TNS 連線包給Oracle Listener,Listener然後就回應一個TNS 拒絕包(Refuse packet),在兩個機器間的TCP/IP連線就結束了。從oracle 網路別名的解析到結束TCP/IP連線之間的總的耗費的時間就顯示在tnsping命令的輸出中。

一個例子:
C:\>tnsping V817   4
TNS Ping Utility for 32-bit Windows:  
Version 8.1.7.0.0 - Production on 18-MAY-2001 14:27:57
(c) Copyright 1997 Oracle Corporation.   All rights reserved.
Attempting to contact  
ADDRESS=(PROTOCOL=TCP)(HOST=abadah.us.oracle.com)(PORT=1521))
OK (1770 msec)
OK (10 msec)
OK (0 msec)
OK (10 msec)

         上面這個例子顯示第一次tnsping需要1770毫秒,這些時間由在tnsnames.ora檔案中解析V817網路別名需要的時間、 利用DNS解析listener機器名” abadah”需要的時間,三次TCP/IP握手需要的時間、TNS Connect 和Refuse packets傳輸需要的時間、斷開TCP/IP連線需要的時間。第二次tnsping只花費了10毫秒,這是因為所有的資訊 (V817別名與IP地址)都已經在cache中了,然而Tnsping程式仍然做 TCP的連線與斷開操作。

-----------------------------------------------------------------------------
TCP/IP PING
-----------------------------------------------------------------------------
Transmission Control Protocol/Internet 協議族 (TCP/IP) 有一個稱為ping的工具。它是到TCP/IP 協議族中ICMP(Internet Control Message Protocol)協議的命令列介面。
根據RFC 792:

"有時候,一個閘道器或目的地址需要同源地址進行通訊,如:為了給源地址一個關於在處理資料包的過程中產生的錯誤。為了這種目的,就需要使用ICMP協議。ICMP需要網際協議(IP)的支援,這使它看起來就像一個更高層的協議,然而,ICMP實際上是IP的一個組成部分,在IP的每個模組中必須實現它。

         Ping命令的作用之一就是收集不同大小的IP資料包在網路上傳輸一個來回需要的時間。這可以用來估計網路的大體效能和響應時間。

         Ping命令使用IP,而不是TCP,這樣就不需要TCP的3次握手機制,當執行ping命令時,它只傳送與接收一個ip資料包,這比oracle的tnsping程式執行時需要更少的資料包。

         Ping的第一個的response time經常比平均response time要長,這是因為第一次一般需要對ping的機器名進行解析。這個解析可以通過本地的hosts檔案、DNS伺服器或其它方法實現。

一個ping的例子:
Pinging abadah.us.oracle.com [144.25.223.156] with 32 bytes of data:
Reply from AAA.BBB.CCC.DDD: bytes=32 time<40ms TTL=255
Reply from AAA.BBB.CCC.DDD: bytes=32 time<10ms TTL=255
Reply from AAA.BBB.CCC.DDD: bytes=32 time<10ms TTL=255
Reply from AAA.BBB.CCC.DDD: bytes=32 time<10ms TTL=255

         上面的例子顯示第一次的ping時間需要40毫秒,這包括DNS解析的時間。

從上面的介紹我們可以得出:
1.tnsping需要使用TCP,所以需要3次握手建立連線,而ping只使用IP,所以不需要3次握手,這也就解釋了為什麼有的機器不能ping通,但是用tnsping確能測試通。
2.Tnsping通,並不能說明客戶端能與資料庫建立連線。因為
ping通只能說明客戶端能解析listener的機器名,而且lister也已經啟動,但是並不能說明資料庫已經開啟,而且tsnping的過程與真正客戶端連線的過程也不一致。
但是如果不能用tnsping通,則肯定連線不到資料庫。

關於第2條可以用tns-12545錯誤來說明:
TNS-12545 (ORA-12545): Connect failed because target host or object does not exist
原因:
客戶端不能正確解析伺服器的機器名。該錯誤一般出現在客戶端沒有設定或沒有正確設定域名伺服器的情況下出現。
解決辦法:
疑問:出現這種情況時,有時可以用tnsping 測程式測試網路服務名可以通過,但還是不能用程式連線資料庫,你會感到很奇怪。有時即使將客戶端的tnsnames.ora中的伺服器的機器名換為ip地址,還是會報錯,這會令人感到更加疑惑,會不會系統有問題?
         要真正解決這個問題,需要知道客戶端與伺服器端在建立連線時所的資料流。並需要了解redirect session的概念。
         當一個客戶端連線在window上的資料庫,或以共享連線的模式連線在unix上的資料庫時(此時資料庫為MTS模式),客戶端的連線會發生重定向現象,也就是listener在接受客戶端的連線後,會傳送一個重定向的包給客戶端,然後客戶端利用這個重定向包中提供的資訊(伺服器的ip(或機器名)和埠等資訊)重新發起一個真正的到資料庫的連線。當將客戶端的tnsnames.ora中的伺服器的機器名換為ip地址,客戶端的連線還是會報ora-12545錯的罪魁禍首就是這個重定向包中的內容。
         當客戶端連線window上的資料庫,或以共享連線的模式連線在unix上的資料庫時,因為tnsnames.ora中為伺服器的ip地址,所以不存在名字解析的問題,客戶端的連線請求會到達listener,這也就是tnsping 測試程式測試網路服務名可以通過的原因,因為tnsping測試程式不會產生重定向問題。在listener接受客戶端的連線後,會跟據客戶請求的連線模式(專用連線還是共享連線)和作業系統對socket的實現的情況,決定是否需要將客戶端的連線進行重定向,如果需要進行重定向,則會產生一個重定向包,該包中包含的伺服器的地址資訊為從listener.ora檔案中得到的listener偵聽的地址(根據listener.ora中的配置可能為伺服器的機器名,也可能為伺服器的ip地址),該包中還包含客戶端應該重定向連線的埠資訊(同listener偵聽的埠可能不為同一個),客戶端在收到這個重定向包後,解析出應該重新連線的伺服器地址(機器名或ip)和埠,重新利用解析出的資訊建立一個新的連線,此時如果客戶端得到的為伺服器的機器名並且沒有配置域名解析,就會因為解析不出伺服器的ip地址,從而導致產生ora-12545錯誤。
         所以,如果如果要徹底解決ora-12545錯誤,需要:
1) 配置一個域名伺服器,並正確的設定客戶端機器的域名伺服器
2) 將伺服器的機器名與ip配置在客戶端的hosts檔案中.
3) 將客戶端tnsnames.ora和listener.ora中的地址部分都改為ip地址,而不是用機器名
4) 將客戶端的連線改為專用連線,這樣會避免redirect 現象。(適用與客戶端tnsnames.ora中為伺服器的ip地址的情況下)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10742223/viewspace-253049/,如需轉載,請註明出處,否則將追究法律責任。

相關文章