經驗分享:C/S系統故障排查之服務器端口telnet失敗

      (在過去的10+年基於 ESFramework 做了很多的C/S系統,也協助客戶解決了諸多開發和運行時的技術問題,個人覺得這些歷史經驗是非常寶貴的,接下來我會將這些經驗逐步分享出來,希望對碰到類似問題的人有所啓發和幫助。)

        telnet命令的主要作用是與目標端口進行TCP連接(即完成TCP三次握手)。

        當服務端啓動後,但是telnet其監聽的端口,卻失敗了。或者,當服務端運行了一段時間後,突然其監聽的端口telnet不通了。當類似這樣的telnet失敗的情況出現時,都可以按照如下方面進行排查:

1.觀察一下服務端進程的CPU和內存是否有異常。

       比如,當CPU持續在100%時,就有可能導致來自客戶端的TCP連接請求被丟棄或無暇處理。 

2.端口監聽器是否運行正常?

        可以通過IRapidServerEngine的Advanced屬性的GetPortListenerState方法來獲取端口監聽器的狀態,該方法返回一個PortListenerState對象,其包含3個屬性:

(1)IsMaxConnection:是否達到了最大連接數的限制。

(2)IsListening:是否正在監聽端口。如果未授權,或達到了最大連接數限制,則將會停止監聽端口。

(3)LastDetectTime:最後一次檢測TCP連接隊列(已完成OS底層的三次握手,但尚未被ESFramework提取的TCP連接存放於該隊列中)的時間。 

        如果上述兩點都正常,則接下來,需要專業的運維人員或網管人當員參與進來協助排查。

3.在當前服務器上執行telnet命令,看能否連接成功?

        如果能連接成功,至少表明本機的TCP握手請求是能正常地被接收和處理的。 

4.在服務器上執行netstat命令

          netstat是一個非常有用的查看端口狀態的命令,執行netstat命令後,請注意查看以下信息:

(1)目標端口是否處於監聽狀態?

(2)目標端口上是否存在已成功建立的TCP連接(ESTABLISHED)?其數量是多少?

(3)是否存在半開連接(SYN_RECV)?其數量是多少?

(4)是否存在等待關閉的連接(TIME_WAIT)?其數量是多少?

          這裏,最有可能的原因是半開連接數達到最大限制,導致windows系統丟棄後續的TCP連接請求。 

5.TCP三次握手是否正常?

         對於一些奇怪現象的跟蹤與分析,數據抓包工具是不可缺少的。

         在服務器上將抓包工具運行起來,然後在其他的電腦上telnet該服務器的目標端口,通過抓包工具觀察目標端口上TCP三次握手的過程是否正常:

(1)目標端口是否收到了來自客戶端的SYN請求?

(2)目標端口有回覆SYN_ACK給客戶端?

(3)目標端口有收到來自客戶端的第三次握手?

         只有當TCP三次握手順利完成後,windows底層纔會將建立好的TCP連接放入隊列中,提交給上層的應用程序。

6.服務器網絡拓撲結構、防火牆、路由器、網絡安全監控等相關軟硬件

        在抓包分析的同時,結合服務器的網絡拓撲接口進行考慮是很有必要的。很可能來自客戶端的三次握手請求被防火牆、路由器、或某些網絡完全監控的相關軟硬件給擋住了。

        此時,需要專業的運維人員或網管人員參與進來,協助排查問題,比如:

(1)在服務器上執行netstat命令,查看目標端口的相關狀態信息。

(2)在服務器上執行抓包工具,監測目標端口上是否有數據從客戶端過來。

(3)分析服務器的網絡拓撲結構,並以服務器爲中心,依次向外檢查防火牆、路由器、網絡安全監控等相關軟硬件等的設定,並進行鍼對性的排查測試。

 

       經過以上的排查分析,應該都可以找到問題的根源所在,如果還是沒有結果,可以給我留言,我們一起討論下啊。    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章