用Wireshark分析Socket連線建立的過程

2022-02-20 19:50:48 字數 1802 閱讀 8218

0. 安裝wireshark,但是預設情況下,wireshark無法捕獲127.0.0.1的報文

解決方案:安裝npcap,替換預設的winpacp,重新啟動wireshark,就可以看到乙個名字中含有loopback的介面,針對它來抓包就行了

1. 用telnet向未被監聽的9090埠傳送連線請求

telnet視窗一閃而過,抓包結果如下

可以看出,未被監聽的埠會直接返回rst包,導致telnet無法正常建立連線。

2. 開啟echo server監聽9090埠,然後使用telent向9090埠傳送連線請求

可以清楚的看到tcp的三次握手過程,現在telnet已經與echo server建立了tcp連線了

3. 在第二步的基礎上,使用telenet向echo server傳送資料

我在telnet裡輸入了abc三個字元,下圖是抓包結果

可以看到一共有12個包,每四個包為一組,對應於telnet中的一次輸入

這四個包分別對應於 客戶端傳送字元->伺服器ack->伺服器傳送echo->客戶端ack

4. 在bio模式的echo server中插入斷點

使用bio模式的echo server,但是在呼叫serversocket.accept()方法處下斷點,讓程式跑到此處停頓。

然後啟動telnet向伺服器傳送資料,結果如下:

可以看到在這種情況下,居然可以完成三次握手協議,正常建立連線(但此時服務端正卡在accept()方法上)

對於客戶端後續傳送的資料,服務端也能及時傳送ack,只是無法傳送echo罷了。一旦放開echo server的斷點,伺服器就能正常工作了,前面沒收到echo的資料也不會丟失。

5. 在nio模式的echo server中插入斷點

與bio模式相近,serversocketchannel只要與埠繫結,對於telnet的連線請求,無需服務端呼叫accept方法就能完成三次握手。

客戶端後續傳送的資料,服務端也能正常返回ack。

6. 為什麼只需要完成監聽埠,無需呼叫accept方法就能完成三次握手呢?

我之前的想法是:accept方法在收到客戶端發過來的syn包後就會從阻塞狀態中退出,在此同時返回ack+syn包,完成三次握手(這個想法太奇怪了)

實際上是tcp底層維護了兩個佇列:半連線佇列與全連線佇列。作業系統收到telnet的tcp連線請求後會自動完成三次握手建立tcp連線,然後將這個連線放到全連線佇列中。而accept方法則是將tcp連線從這個全連線佇列中提取出來罷了。

簡單測試一下,在建立serversocket物件的時候,將backlog設定為1,然後將斷點設定在accept方法處(不讓程式從tcp全連線佇列中提取連線)。然後開啟兩個telnet客戶端,結果第乙個telnet可以正常連線,第二個telnet直接閃退了。

抓包如下圖所示:

可以清楚的看到從6078到9090的tcp連線成功的完成了三次握手,從6079到9090的tcp連線則握手失敗了。

用 WIRESHARK 分析 RTP 流

wireshark 是乙個強大的抓包及網路分析軟體,可以用來嗅探和分析多種網路協議的資料報和流,rtp 和 rtcp 也是其中的兩種。對 rtp 流的分析過程,在 wireshark 的 wiki 上講得很清楚,下面我只是記錄一下我在使用過程中的一些經驗 1.要想分析 rtp 流,首先要把抓到的 u...

用Wireshark抓包分析請求

有些封裝好的api把錯誤都遮蔽掉,直接返回某乙個不明確的具體錯誤,讓人感到困惑。code in sdk read only public static data requesthandler result throws apiexceptioncatch exception e if resulte...

常見SOC啟動流程分析

本文以s5pv210這款soc為例,分析了其啟動流程 在s5pv210的soc內部,存在著乙個內部的rom和乙個內部的ram 由於它倆的優異特性,一上電後的很多任務作就由它倆來負責了 當啟動介質為sd mmc時,第0個扇區必須保留,irom中的 會從第1個扇區開始讀bl1,啟動介質的空間分配如下圖所...