緣起:
最近一個(gè)項(xiàng)目要上線,我負(fù)責(zé)的應(yīng)用需要和設(shè)備進(jìn)行通信,按照之前約定的協(xié)議,大家使用的是tcp/ip 的通信方式。設(shè)備側(cè)作為server,而我們作為的是client,其中心跳維護(hù)是由client側(cè)主動(dòng)發(fā)起。
在入場(chǎng)聯(lián)調(diào)的時(shí)候,雙方在一個(gè)命令回復(fù)的報(bào)文里面產(chǎn)生了分歧。我們認(rèn)為沒(méi)有收到設(shè)備側(cè)的回復(fù),但是設(shè)備廠家說(shuō)我已經(jīng)回復(fù)了,幾番爭(zhēng)論之后,我們開(kāi)始抓包分析(之前都是通過(guò)我們應(yīng)用的日志信息確認(rèn)問(wèn)題)。在Linux服務(wù)上進(jìn)行網(wǎng)絡(luò)抓包,最常見(jiàn)的就是使用tcpdump,它功能很強(qiáng)大,他提供了很多參數(shù)以及正則表達(dá)式來(lái)對(duì)抓包的數(shù)據(jù)進(jìn)行過(guò)濾。而我們這里就是簡(jiǎn)單粗暴的對(duì)eth0這個(gè)網(wǎng)卡上的所有通信信息進(jìn)行抓包。當(dāng)通過(guò)tcpdump把包抓下來(lái)之后,然后通過(guò)scp到本機(jī),然后通過(guò)wireshark在本機(jī)分析抓包結(jié)果,最后確認(rèn)與設(shè)備側(cè)的通信問(wèn)題。
具體的tcpdump的命令介紹,可以參考這篇文章:戳這里
解決:
我們這里用到的命令就是:
tcpdump -s 0 -w /tmp/aa
就是獲取所有通信包信息,并將信息寫(xiě)入到/tmp下的aa文件中。在本機(jī)用wireshark打開(kāi)這個(gè)aa文件,過(guò)濾出屬于2000端口的信息,截圖如下:
最后通過(guò)抓包分析確認(rèn)是設(shè)備廠商的問(wèn)題,最后問(wèn)題解決。
擴(kuò)展:
因?yàn)轫?xiàng)目近期上線,通信上的問(wèn)題有可能隨時(shí)發(fā)生,因此需要把tcpdump一直開(kāi)著,這樣方便出現(xiàn)問(wèn)題后快速定位問(wèn)題。而Tcpdump寫(xiě)文件的方式是一直在同一個(gè)文件上進(jìn)行追加,如果一定時(shí)間后,這個(gè)文件就會(huì)變得非常大,這樣不利于后面的分析。因此,我們需要對(duì)dump出來(lái)的文件,做一個(gè)切割。
第一次我們想到的是通過(guò)cronolog這個(gè)屌炸天的東東來(lái)進(jìn)行分割,在網(wǎng)上搜索對(duì)應(yīng)的應(yīng)用你發(fā)現(xiàn)先很多人將其應(yīng)用到Nginx或者Apache的日志處理上。經(jīng)過(guò)一番嘗試發(fā)現(xiàn)這哥們無(wú)法與tcpdump進(jìn)行合并使用(也許是沒(méi)有找到使用方法),無(wú)賴放棄轉(zhuǎn)戰(zhàn)另一條路。
第二次我們想到使用一個(gè)死循環(huán)的腳本,通過(guò)tcpdump的-c參數(shù),將按照每多少個(gè)通信包一個(gè)文件的方式進(jìn)行生成,最后腳本完成試驗(yàn)效果不錯(cuò),幾乎是每隔50M左右一個(gè)文件。如下截圖:
腳本如下:
#!/bin/sh
n=0
while true ; do
n=$(( $n + 1 ))
tcpdump -s 0 -c 102400 -w /tmp/tcpdump/tcpdump.out.$n
done
最后:
通過(guò)這個(gè)case,我想廠商或者聯(lián)調(diào)的另一方不相信你的程序日志是可以理解的,但是你可以通過(guò)公認(rèn)的工具,找到事實(shí),他就必須得相信了,所以我們要有這種快速找到問(wèn)題的能力。