一 概要:
Wireshark(前稱Ethereal)是一個網路抓包工具。 是一款非常棒的Unix和Windows上的開源 網路協議分析器。儘可能顯示出最為詳細的網路封包資料。Wireshark使用WinPCAP作為介面,直接與網路卡進行資料包文交換。在多媒體開發中,經常會用到wireshark進行輔助定位,定位的內容一般有碼流正確性確認、碼流回放、網路情況分析、幀率位元速率確認等。
官網下載地址:https://www.wireshark.org/
二 使用步驟:
Wireshark有桌面版和命令列兩種,通常在安卓、嵌入式等平臺使用命令列方式進行抓包,然後在PC環境下進行包的分析
2.1 桌面版
a 開始介面
b 選擇網路卡
wireshark是捕獲機器上的某一塊網路卡的網路包,當你的機器上有多塊網路卡的時候,你需要選擇一個網路卡。
c 視窗介紹
d 填寫過濾條件
協議過濾
比如TCP,只顯示TCP協議。
rtsp,只顯示rtsp協議。
udp,只顯示udp協議。
rtp,只顯示rtp協議。
rtmpt,只顯示rtmp協議。
常用的還有sip、h225、h245等
IP過濾
比如 ip.src 192.168.1.102 顯示源地址為192.168.1.102,
ip.dst192.168.1.102, 目標地址為192.168.1.102
ip.addr=192.168.1.102 表示部分源和目標,所有透過192.168.1.102的包都過濾
埠過濾
tcp.port ==80, tcp埠為80的
tcp.srcport == 80, 只顯示TCP協議的源埠為80的。
tcp.dstport == 80, 只顯示TCP協議的目的埠為80的。
udp.port ==80, UDP埠為80的
udp.srcport == 80, 只顯示UDP協議的源埠為80的。
udp.dstport == 80, 只顯示UDP協議的目的埠為80的。
邏輯運算子為 AND / OR / && / || / !
例如ip.srcxx.xx.xx.xx && udp.port=xxxxx
! ip.srcxx.xx.xx.xx 表示反過濾IP為xx.xx.xx.xx的資料包
e 結果展示
2.2 命令列
相對於桌面版本。命令列使用起來更為簡單
a 選擇網路卡
可以先用ifconfig\ipconfig
命令查詢網路卡xxx ,然後tcpdump –i xxx
,這樣會將抓包結果實時重新整理到抓包介面,如果想將抓包檔案儲存可以使用-w引數tcpdump –i xxx –w /sdcard/xxx.pcap
b 填寫過濾條件
tcpdump ip host xx.xx.xx.xx and ! yy.yy.yy.yy
過濾指定的ip
tcpdump src port xx
過濾指定的源埠
三 Wireshark媒體碼流解析:
基於標準rtp的碼流,底層傳輸協議為udp
抓到包之後一般會先根據ip或者埠過濾出要分析的資料流,
然後將過濾出來的udp轉換成RTP
注意:Wirshark是基於使用者指定的格式去做翻譯的,所以我們指定將udp轉換成RTP時,前提是我們知道這個包確實是RTP碼流,否則wireshark將翻譯出很奇怪的包,該原則同樣適用於將RTP轉成h264或其他格式。
Decode as轉碼成h264,有時Wireshark會誤將其他格式的RTP轉成h264,但事實上並不是h264的碼流,正如前邊所說,Wireshark需要使用者告訴他需要解成什麼協議。如果出現解錯的情況,可以透過payload的配置進行糾正。如下:
編輯--首選項--protocols---找到要糾正的協議,填上正確的payload值。
四 示例
4.1 Ts流
udp--->decode as---->MP2T
將udp流解析成TS流格式,然後可以將tS流中的音影片匯出用播放器播放。
如下圖:電話-->rtp-->流分析-->save-->File synchronized Forward Stream Audio
, 此時需要注意,需要把字尾名改成.raw,然後儲存後再將字尾名改成.ts。
4.2 流量分析
首先設定過濾條件,將要分析的碼流過濾出來,然後將過濾出來的結果儲存--匯出特定分組,(否則分析的結果會不準),然後開啟新的過濾過的流,點選統計--I/O圖示,會分析出流量曲線,使用者可以調整統計的時間粒度,已達到自己想要統計的目的。
4.3 影片幀率統計
Wireshark沒有提供直接的幀率統計功能,但是可以透過過濾rtp.marker == 1(依據rtp標準)來將一幀的最後一個包作為過濾條件,也就是一幀的結束,過濾後需要碼流儲存匯出特定分組,然後開啟新的檔案,就可以根據時間值看出一秒鐘有多少幀了。
4.4 丟包,亂序分析
電話—>rtp-流分析
然後可以可以根據序列的一列來確認是否有亂序和丟包。