Wireshark(前稱Ethereal)是一個網絡封包分析軟件,可分析網路狀態,丟包率等。bash
因爲公司作的即時通信業務,其中IM模塊採用TCP發送數據和控制信令(心跳包)底層採用protobuf傳輸數據,音視頻採用TRP協議,而後給大客戶集團提供私有化部署,因爲客戶網絡環境複雜,因此需具有必定的抓包分析能力。服務器
下面介紹常見的TCP層的經常使用FLAGS。網絡
標誌位 | 描述 |
---|---|
SYN | 創建聯機 |
ACK | 確認 |
PSH | 有 DATA數據傳輸 |
FIN | 關閉鏈接 |
RST | 鏈接重置 |
通常地,只是單個的一個SYN,它表示的只是創建鏈接。當出現SYN和ACK可能同時爲1,咱們認爲客戶端與服務器創建了一個鏈接。而當出現FIN包或RST包時,咱們便認爲客戶端與服務器端斷開了鏈接;而RST通常是在FIN以後纔會出現爲1的狀況,表示的是鏈接重置。socket
ping 域名
telnet ip 端口
Apply as Filter
, ip.src==103.219.186.235 or ip.dst==103.219.186.235
第一次握手:主機A發送位碼爲syn=1,隨機產生seq number=1234567的數據包到服務器,主機B由SYN=1知道,A要求創建聯機;
第二次握手:主機B收到請求後要確認聯機信息,向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包;
第三次握手:主機A收到後檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否爲1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則鏈接創建成功。
複製代碼
(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送。
(2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。和SYN同樣,一個FIN將佔用一個序號。
(3)服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A。
(4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1。
複製代碼
在TCP傳輸過程當中,同一臺主機發出的數據段應該是連續的,即後一個包的Seq號等於前一個包的Seq + Len(三次握手和四次揮手是例 外)當後Seq>前Seq +Len,就知道中間缺失了一段數據。spa
[TCP Out-of-Order] 亂序 Wireshark在獲取包序號26時發現seq=18981,而包序號25的數據包seq = 20441,因此wireshark認爲數據包順序錯了當亂序或者丟包發生時,接收方會收到一些Seq號比指望值大的包。此時就會Ack就說我想獲取seq=28852的數據包而你給了我其餘包。.net
當發送方收到3個或以上[TCP Dup ACK],就意識到以前發的包可能丟了,因而快速重傳它(這是RFC的規定)。3d
若是一個包真的丟了,又沒有後續包能夠在接收方觸發[Dup Ack],就不會快速重傳,只能超時重傳。code
1.端口未打開 服務器程序端口未打開而客戶端來鏈接。這種狀況是最爲常見和好理解的一種了。去telnet一個未打開的TCP的端口可能會出現這種錯誤。
2. 請求超時 查看2次包的時間間隔
3. 服務端關閉的socket
4. 防禦牆拒絕了請求
5. 移動鏈路
移動網絡下,國內是有5分鐘後就回收信令,也就是IM產品,若是心跳>5分鐘後服務器再給客戶端發消息,就會收到rst。也要查移動網絡下IM 保持<5min 心跳。
6. 負載等設備 負載設備須要維護鏈接轉發策略,長時間無流量,鏈接也會被清除,並且不少都不告訴兩層機器,新的包過來時才通告rst。cdn
Apple push 服務也有這個問題,並且是不可預期的偶發性鏈接被rst;rst 前第一個消息write 是成功的,而第二條寫纔會告訴你鏈接被重置
視頻
7. 超過超時重傳次數、網絡暫時不可達
參考:
www.wireshark.org/
blog.csdn.net/yuanbinquan…
blog.csdn.net/yuanbinquan…