簡介
Wireshark(前稱Ethereal)是一個(gè)網(wǎng)絡(luò)封包分析軟件新蟆,可分析網(wǎng)路狀態(tài)觅赊,丟包率等。
由于公司做的即時(shí)通訊業(yè)務(wù)琼稻,其中IM模塊采用TCP發(fā)送數(shù)據(jù)和控制信令(心跳包)底層采用protobuf傳輸數(shù)據(jù)吮螺,音視頻采用TRP協(xié)議,然后給大客戶集團(tuán)提供私有化部署帕翻,由于客戶網(wǎng)絡(luò)環(huán)境復(fù)雜鸠补,所以需具備一定的抓包分析能力。
下面介紹常見的TCP層的常用FLAGS嘀掸。
標(biāo)志位 | 描述 |
---|---|
SYN | 建立聯(lián)機(jī) |
ACK | 確認(rèn) |
PSH | 有 DATA數(shù)據(jù)傳輸 |
FIN | 關(guān)閉連接 |
RST | 連接重置 |
一般地紫岩,只是單個(gè)的一個(gè)SYN,它表示的只是建立連接睬塌。當(dāng)出現(xiàn)SYN和ACK可能同時(shí)為1泉蝌,我們認(rèn)為客戶端與服務(wù)器建立了一個(gè)連接。而當(dāng)出現(xiàn)FIN包或RST包時(shí)衫仑,我們便認(rèn)為客戶端與服務(wù)器端斷開了連接梨与;而RST一般是在FIN之后才會(huì)出現(xiàn)為1的情況,表示的是連接重置文狱。
Wireshark 抓包步驟
- 首先根據(jù)域名獲取對(duì)應(yīng)的ip,終端輸入
ping 域名
小技巧 也可通過telnet查看端口是否開啟
telnet ip 端口
- 打開Wireshark粥鞋,首頁選擇要抓取的通道(Wi-Fi,網(wǎng)卡等),然后設(shè)置過濾規(guī)則瞄崇,點(diǎn)擊右上角箭頭配置過濾規(guī)則呻粹,或者點(diǎn)擊某一條右鍵選中
Apply as Filter
壕曼,
ip.src==103.219.186.235 or ip.dst==103.219.186.235
TCP三次握手
第一次握手:主機(jī)A發(fā)送位碼為syn=1,隨機(jī)產(chǎn)生seq number=1234567的數(shù)據(jù)包到服務(wù)器等浊,主機(jī)B由SYN=1知道腮郊,A要求建立聯(lián)機(jī);
第二次握手:主機(jī)B收到請(qǐng)求后要確認(rèn)聯(lián)機(jī)信息筹燕,向A發(fā)送ack number=(主機(jī)A的seq+1)轧飞,syn=1,ack=1撒踪,隨機(jī)產(chǎn)生seq=7654321的包过咬;
第三次握手:主機(jī)A收到后檢查ack number是否正確,即第一次發(fā)送的seq number+1制妄,以及位碼ack是否為1掸绞,若正確,主機(jī)A會(huì)再發(fā)送ack number=(主機(jī)B的seq+1)耕捞,ack=1衔掸,主機(jī)B收到后確認(rèn)seq值與ack=1則連接建立成功。
1. 客戶端發(fā)送 SYN 報(bào)文 到服務(wù)器
2. 服務(wù)器接收到后 回復(fù) SYN + ACK 報(bào)文
3.客戶端接收到服務(wù)端的 SYN+ACK 報(bào)文后俺抽,回復(fù) ACK報(bào)文
注意:理論上敞映,Syn 應(yīng)該初始值是個(gè)隨機(jī)數(shù)的,后面的要根據(jù)初始值增加 凌埂,wireshark為了好區(qū)分從0開始的驱显,可以自行設(shè)置顯示原始Syn
TCP 四次揮手诗芜,簡略分析
(1)客戶端A發(fā)送一個(gè)FIN瞳抓,用來關(guān)閉客戶A到服務(wù)器B的數(shù)據(jù)傳送。
(2)服務(wù)器B收到這個(gè)FIN伏恐,它發(fā)回一個(gè)ACK孩哑,確認(rèn)序號(hào)為收到的序號(hào)加1。和SYN一樣翠桦,一個(gè)FIN將占用一個(gè)序號(hào)横蜒。
(3)服務(wù)器B關(guān)閉與客戶端A的連接,發(fā)送一個(gè)FIN給客戶端A销凑。
(4)客戶端A發(fā)回ACK報(bào)文確認(rèn)丛晌,并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1。
抓包異常數(shù)據(jù)解讀
1.[TCP Previous segment not captured]丟包
在TCP傳輸過程中斗幼,同一臺(tái)主機(jī)發(fā)出的數(shù)據(jù)段應(yīng)該是連續(xù)的澎蛛,即后一個(gè)包的Seq號(hào)等于前一個(gè)包的Seq + Len(三次握手和四次揮手是例
外)當(dāng)后Seq>前Seq +Len,就知道中間缺失了一段數(shù)據(jù)蜕窿。
[TCP Out-of-Order] 亂序
Wireshark在獲取包序號(hào)26時(shí)發(fā)現(xiàn)seq=18981,而包序號(hào)25的數(shù)據(jù)包seq = 20441,所以wireshark認(rèn)為數(shù)據(jù)包順序錯(cuò)了
2.[TCP Dup ACK x#y]
當(dāng)亂序或者丟包發(fā)生時(shí)谋逻,接收方會(huì)收到一些Seq號(hào)比期望值大的包呆馁。此時(shí)就會(huì)Ack就說我想獲取seq=28852的數(shù)據(jù)包而你給了我其他包。
3毁兆、[TCP Spurious Retransmission] 丟包重傳
4浙滤、[TCP Fast Retransmission] 快速重傳
當(dāng)發(fā)送方收到3個(gè)或以上[TCP Dup ACK],就意識(shí)到之前發(fā)的包可能丟了气堕,于是快速重傳它(這是RFC的規(guī)定)纺腊。
5、[TCP Retransmission] 超時(shí)重傳
如果一個(gè)包真的丟了茎芭,又沒有后續(xù)包可以在接收方觸發(fā)[Dup Ack]摹菠,就不會(huì)快速重傳,只能超時(shí)重傳骗爆。
6次氨、幾種TCP連接中出現(xiàn)RST的情況
1.端口未打開
服務(wù)器程序端口未打開而客戶端來連接。這種情況是最為常見和好理解的一種了摘投。去telnet一個(gè)未打開的TCP的端口可能會(huì)出現(xiàn)這種錯(cuò)誤煮寡。
2. 請(qǐng)求超時(shí)
查看2次包的時(shí)間間隔
3. 服務(wù)端關(guān)閉的socket
4. 防護(hù)墻拒絕了請(qǐng)求
5. 移動(dòng)鏈路
移動(dòng)網(wǎng)絡(luò)下,國內(nèi)是有5分鐘后就回收信令犀呼,也就是IM產(chǎn)品幸撕,如果心跳>5分鐘后服務(wù)器再給客戶端發(fā)消息,就會(huì)收到rst外臂。也要查移動(dòng)網(wǎng)絡(luò)下IM 保持<5min 心跳坐儿。
6. 負(fù)載等設(shè)備
負(fù)載設(shè)備需要維護(hù)連接轉(zhuǎn)發(fā)策略,長時(shí)間無流量宋光,連接也會(huì)被清除貌矿,而且很多都不告訴兩層機(jī)器,新的包過來時(shí)才通告rst罪佳。
Apple push 服務(wù)也有這個(gè)問題逛漫,而且是不可預(yù)期的偶發(fā)性連接被rst;rst 前第一個(gè)消息write 是成功的赘艳,而第二條寫才會(huì)告訴你連接被重置
7. 超過超時(shí)重傳次數(shù)酌毡、網(wǎng)絡(luò)暫時(shí)不可達(dá)
如有疏漏,請(qǐng)指出不勝感激蕾管,部分圖片來自網(wǎng)絡(luò)枷踏,如有侵權(quán)請(qǐng)聯(lián)系刪除。
參考:
https://www.wireshark.org/
https://blog.csdn.net/yuanbinquan/article/details/75434732
https://blog.csdn.net/yuanbinquan/article/details/75454261