2011年12月31日 星期六

阿班私房菜- 初探 Networking debug Logging (網路偵錯日誌)

tcpdump-with-cap

(註: 筆者愛用 nc(netcat) + tcpdump 來做網路實驗,上圖即其結果。 )

記得許久前,某人問我一個問題,有比較好的遠端偵錯的方法嗎?

首先,我先定義所謂"遠端偵錯":
  • 無法利用即時偵錯
    • 你的程式可能在數百公里外執行。簡言之,你沒辦法到現場去查臭蟲。
    • 24X7伺服端程式,你不能停止它來使用單步偵錯。
筆者先談談針對網路相關問題偵錯心得:

排除法:先簡化錯誤發生的因素。

案例:某公司開發用伺服器上的網站,使用手機(Android Phone)或較慢的機器(如:Eeepc),時常發生連線逾時的情形;但手機連線至他站均無問題。
  • 先檢查,區網內的硬體是否有問題?(無線Access Point (AP)及Router 檢查,甚至網路線更換,無改善。)
  • 再查,AP的DNS是否有問題。(無發現)
  • 查看google 大神,是否Eeepc 網路卡有相容性問題。(無發現)
  • 拿出無敵大絕招,使用擷取網路封包方法。(注意:要擷取封包時,請同時抓取,Server 及 Client 端。)
    • Server 遠端使用tcpdump 擷取封包並儲存為Wireshark 可開啟的檔案.cap
    • Client 端使用Wireshark來擷取封包。
    • 在Client 重現連線網路問題。
    • 比對封包 (其中發現Server端收到3個SYN 封包,卻無回應到client 端)
    • 範圍縮小至Server端
    • 利netstat –na | grep TIME_WAIT‘ , 發現TCP TIME_WAIT 很快被系統移除。
小結:

  到此階段,筆者有很高的把握,應該是系統網路優化設定所造成。

再和朋友試一下,網路相關設定才發現與tcp_tw_recycle有關;關閉後一切正常。

$ grep recycle /etc/sysctl.conf
net.ipv4.tcp_tw_recycle=1   --> net.ipv4.tcp_tw_recycle=0


結論:

對於網路程式的偵錯而言,看懂封包的協定是十分必要的,
另外在撰寫網路相關的程式,若能瞭解所使用標準協定(如:TCP TimeWait RFC793, HTTP RFC2616),將有莫大的幫助,以避免所開發程式與其它第三方程式發生不相容情事。

(有任何誤謬,請不吝指正。)


沒有留言: