(註: 筆者愛用 nc(netcat) + tcpdump 來做網路實驗,上圖即其結果。 )
記得許久前,某人問我一個問題,有比較好的遠端偵錯的方法嗎?
首先,我先定義所謂"遠端偵錯":
- 無法利用即時偵錯
- 你的程式可能在數百公里外執行。簡言之,你沒辦法到現場去查臭蟲。
- 24X7伺服端程式,你不能停止它來使用單步偵錯。
排除法:先簡化錯誤發生的因素。
案例:某公司開發用伺服器上的網站,使用手機(Android Phone)或較慢的機器(如:Eeepc),時常發生連線逾時的情形;但手機連線至他站均無問題。
- 先檢查,區網內的硬體是否有問題?(無線Access Point (AP)及Router 檢查,甚至網路線更換,無改善。)
- 再查,AP的DNS是否有問題。(無發現)
- 查看google 大神,是否Eeepc 網路卡有相容性問題。(無發現)
- 拿出無敵大絕招,使用擷取網路封包方法。(注意:要擷取封包時,請同時抓取,Server 及 Client 端。)
到此階段,筆者有很高的把握,應該是系統網路優化設定所造成。
再和朋友試一下,網路相關設定才發現與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),將有莫大的幫助,以避免所開發程式與其它第三方程式發生不相容情事。
(有任何誤謬,請不吝指正。)
沒有留言:
張貼留言