wireshark是在資料鏈路層抓包,如下圖抓的udp包,實際上抓到的是封裝了udp資料報的mac幀,有乙太網src ip和dst ip在內
mac幀主要有兩種格式,一種是乙太網v2標準,一種是ieee 802.3,常用的是前者。下圖就是假定網路層協議是ip協議,mac幀是v2格式
有一點注意,這裡的首部長度的單位是4位元組,所以首部長度最大是15*4=60位元組。而且通過可選字段後的填充,ip頭部永遠是4位元組的倍數,方便ip協議實現。
總長度的單位是1位元組,所以ip資料報的長度最大65535位元組。
關於ip資料報格式,詳見謝希仁計算機網路(第五版)4.2.5節
有乙個容易搞不清楚的地方是協議字段,6或17分別表示ip資料報的資料部分是tcp或udp報文。41表示資料部分是乙個ipv6資料報,這種情況出現在隧道方式使用ipv6中。
關於udp資料報格式,詳見謝希仁計算機網路(第五版)5.2.2節
關於tcp資料報格式,詳見謝希仁計算機網路(第五版)5.5節
有一點值得注意,資料偏移(4bit),指的是tcp的資料部分到整個tcp包的開始的偏移,其實就是tcp的包頭長度了。和ip頭的首部長度一樣,也是以4byte為單位,所以tcp頭部的最大長度是15(4bit最大15)*4byte=60byte,也就是選項和填充字段不能超過40位元組
上面這麼費事,其實只是解決我的乙個疑惑,就是抓udp包的時候發現抓到的位元組數(如第一張圖里的frame3 109bytes captured)總是比資料段的位元組數(如第一張圖里的data 67bytes)多42byte。
現在知道為什麼了,就是mac幀中在資料前的14byte(最後面的4位元組校驗位被丟棄了?還是wireshark忽略了它?沒仔細看謝希仁的書)+20byteip報文頭部+8byteudp報文頭部=42byte
至於抓tcp包的時候,去掉mac幀頭、ip頭、tcp頭之後,剩下的資料位元組數一般比抓到的位元組數少54byte(14bytemac頭+20byteip頭+20bytetcp頭),因為tcp頭可變,少數情況下這個差值不是54byte。ip包頭其實也可變,但現在還沒見過。像下面圖中的tcp頭部就是32byte
還有一點注意的是,抓tcp包,如果是純tcp協議(如握手、fin等),wireshark在tcp一欄的len是標為0的,如果有tcp之上的應用層協議,如http,那麼tcp那一欄標的長度其實是負載的長度,不包括tcp頭部的長度,如下圖
總共抓到了529byte,tcp的負載(圖中是http報文)有475byte,tcp和ip頭分別20byte。但是wireshark把475標在了tcp邊上,容易讓人誤以為475包括了20byte的tcp頭部
C 資料結構4 二分查詢(遞迴方法)
同樣的100萬個資料,順序查詢需要50萬次,而二分查詢需要20次左右既可以了。但是二分查詢需要的資料是已經排列好的,無序的資料則用不了二分查詢。include 二分查詢 必須是已經排序好的數,有遞迴和迭代 迴圈 兩種方式,遞迴的效率比迭代的效率高得多 using namespace std int ...
opencv學習(4)部分基本資料結構的介紹
先貼一段簡單的 include opencv2 core core.hpp include opencv2 highgui highgui.hpp include using namespace std using namespace cv int main int,char 生成結果 1 定義和輸...
7 1 串的模式匹配 25 分 資料結構第4章
這個題目主要考的是kmp演算法,我感覺kmp演算法理解起來有點小困難,但是 超級短,時間複雜度為 n m 但是我發現字串hash更好用一些,而且很容易理解 這個文章中有我對字串hash的模板 下面是這個題通過的 用了幾十毫秒,速度還是相當快的 include include using namesp...