1. 程式人生 > >網路抓包學MQTT協議(一)----環境搭建

網路抓包學MQTT協議(一)----環境搭建

唉,  本來打算深入學mqtt協議的, 沒想到搭個環境, 搭建了好久, 差點放棄了, 好多坑...., 我的環境的選擇是:Emqtt搭建本地伺服器+ wireshark網路抓包工具+通訊貓+mqtt.fx客戶端, 接下來一步步說這幾個軟體的安裝吧.

一: Emqtt伺服器

     mqtt伺服器有很多開源的, 這裡我選擇後臺介面比較美觀的Emqtt, 人來了世界生是為了看顏值高的, 我選擇他, EMQTT伺服器搭建沒有什麼坑要跳, 直接參考該部落格就行:https://blog.csdn.net/myruo/article/details/79377583 下面附一張控制檯豔照

二:通訊貓網路除錯助手

 有這麼多的tcp除錯助手, 為什麼選擇他呢, 一是因為它傳送資料的時候有hex進位制傳送, 因為mqtt協議的包都是要求16進位制傳送的, 通訊貓還有其他的好多功能, 自己用了就知道, 我就不在這幫他打廣告了, 通訊貓下載地址:http://www.tongxinmao.com/Topic/Detail/id/6 關鍵還是綠色的, 就喜歡綠色的軟體了, 不要時直接解除安裝資料夾, 這裡沒坑, 解壓就行了, 附一張通訊貓的圖:

三: mqtt.fx安裝

如果連線成功了剛剛搭建的伺服器, 上圖的紅色框中圓圈是綠色的, 沒連線成功就是紅色的, 在emqtt的伺服器控制檯, 也就是網址:

http://localhost:18083/#/clients 能看到客戶端資訊

好了,  來到我們最麻煩最多坑的wireshark網路抓包工具了.

四:wireshark軟體

wireshork呀, 真的想說愛你不容易哦, 折騰的我想死了都, 幸好這幾天在練車, 被教練罵的狗血臨頭, 相比於wireshork好多了, 廢話不說了, 來直接看教程吧.

wireshork下載連線: https://www.wireshark.org/ 官網,  最喜歡去官網下載了, 體現我們是高貴的人,  下載後看了一下簡單教程, 需要的自己去網上找吧,下來一張介面圖吧:

注: 這是正常不過的圖了, 今天才正常的說說坑吧: 

問題一: 當我設定了檔案過濾後, 就是上圖的tcp.port==1883後, 用通訊貓連線伺服器時, 沒有出現tcp三次握手的資訊, 通訊貓的配置介面如下圖所示:

只需關注紅色框的資訊, 左邊的資訊是我成功傳送資料的資訊. wireshark配置如圖所示:

輸出的資訊我就不貼了, 全部空白, 沒有任何訊息, 我心想就奇怪了, tcp.port==1883 埠沒錯, 即使我沒發信息, 應該有三次握手的資訊吧,  找了好久wireshark的教程, 發現我也沒配置錯, 怎麼就會沒呢, 找了一天沒找到, 就先放放沒裡了, 

第二天. 在親愛的度娘上看到你這篇文章:https://www.cnblogs.com/lvdongjie/p/6110183.html  瞬間明白了, 原來這是計算機的網路通訊機理, 不是軟體有問題,  windows系統沒有提供本地迴環網路的介面,用wireshark監控網路的話只能看到經過網絡卡的流量,看不到訪問localhost的流量,因為wireshark在windows系統上預設使用的是WinPcap來抓包的,現在可以用Npcap來替換掉WinPcap,Npcap是基於WinPcap 4.1.3開發的,api相容WinPcap。彷彿看到了一絲希望,  找著教程, 終於能看到三次握手的資訊了, 如下圖所示:

紅色為三次握手資訊, 黃色為客戶端向伺服器傳送請求包

問題二: 當我用mqtt.fx連線伺服器時, wireshark中protocol中一直顯示tcp, 該欄目中表示wireshark中自動幫我們根據包的結構解析出協議的型別, 為什麼一直時tcp, 不應該時mqtt嗎?(忽略上圖的mqtt字母, 這是我成功後的圖)

這個問題經過百度後, 發現wireshark是解析不出mqtt協議的, 需要增加第三方外掛, 參考了: https://www.jianshu.com/p/a766dcfa747d  https://www.cnblogs.com/ascii0x03/p/8781643.html 結果還是沒解決, 心想是不是伺服器的問題(我原來用的apollo搭建的mqtt伺服器, 現在用的是本文提到的emqtt伺服器), 後來在電腦上安裝了emqtt伺服器, 神奇了能解析出了mqtt協議了, 效果如上圖所示, 既然能解析出了, 那來測試一下吧, 用通訊貓向伺服器傳送一段16進位制的報文: 10 0c 00 04 4d 51 54 54 04 02 ff ff 00 00  結果返回了20 02 00  00 該段返回碼錶示我連線成功了, 如下圖所示:

再看看wireshark抓取的包吧:

也解析出來了, 成功!!!

注: 有人會問這個wireshark中的資料怎麼看,  再來說明一下吧, 通訊貓中有顯示本地埠為54037, 這個埠是我們電腦客戶端的埠號,  我們結合看wireshark中的資訊來講解:

no: 為包的順序, time為抓包的時間, source為包的來源ip地址, destination為包目的ip地址, 這裡因為都是本地傳送接受的, 所以都為127.0.0.1 protocel為軟體解析出包的協議屬於的型別,  length為包的長度, info為包的資訊: 看到54037 - 1883了嗎? 這表示是客戶端向伺服器傳送的資料, 剩下的一些資訊等我們講解協議的時候再講解吧, 今天先這樣吧,   我再看看mqtt文件協議