在TCP/IP詳解一書中談到了協議的分用,書中的圖1-8如上。圖1-8能夠很好地解釋在互聯網的分層結構中,底層的協議頭是如何承載上層的不一樣的協議的。對於鏈路層而言,以太網首部中有不一樣幀類型用於表示以太網幀內的數據。在IP數據包的首部,也有專門的8位協議類型,用於表示IP包中的上層協議類型,網址http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml中給出了IETF規定的詳細的協議類型號,其中TCP是6,UDP是17,ICMP是1。不過在傳輸層的兩個經常使用協議TCP和UDP首部中,並無協議類型的字段,TCP和UDP包內的應用程協議的類型依靠的是TCP和UDP包首部的端口號來進行區分。對於一些經常使用的應用層協議IETF都規定了相應的熟知端口號,在網址http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml中有一份詳細的列表。TCP和UDP報頭的16比特端口號給應用層協議的設計提供了足夠的設計空間(65535個)和足夠的靈活度。html
理解了協議的分用以後,就比較容易理解wireshark是如何將數據包識別和展現出來的了。wireshark的工做原理的簡單介紹能夠參見http://gaia.cs.umass.edu/wireshark-labs/Wireshark_Intro_v6.0.pdf。歸納地說,就是wireshark是一款創建在已有的包捕捉工具上的一款數據包分析軟件。常見的抓包的庫有libpcap、jpcap、winpcap等等,這些抓包工具將主機的網卡設置爲混雜模式,從而能夠捕捉到目的MAC不是主機網卡的數據包。而wireshark基於這些庫捕捉到的包進行識別和分析,將包中內容按照協議類型和層次展現出來。工具
不過對於那些不採用熟知端口傳輸的應用層協議而言,wireshark就有可能出現沒法識別的狀況,這也是我最近遇到的一個場景。我在抓包的時候碰見了wireshark protocol一欄顯示enttec,Info 一欄顯示 unknown的狀況。通過一段時間的分析,能夠肯定wireshark顯示enttec和unknown的緣由是TCP採用了非熟知端口發送HTTP報文。不過wireshark在設計中已經考慮到這樣一種狀況的出現,能夠針對非熟知端口的已知應用層協議設置相應的解碼方式。具體的方法是:選中沒法識別的報文->右鍵單擊->Decode As->選擇相應的應用層協議。設計