在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個)和足夠的靈活度。
理解了協議的分用之后,就比較容易理解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->選擇相應的應用層協議。