Debug --> 對於pcap包中的某一packet的小分析
目前想自己手動解析一個packet,所以需要回顧一下計網的相關知識奧!
以下一個TCP連線的某一packet為例,說明各個報文頭的每個位元組的含義!
首先,我們使用wireshark,開啟【事先提取好的一個TCP連線】一個pcap檔案,它由幾個packet組成,我們將以下圖第一個packet為例。
其實現在,我們想要用python,讀取出這些十六進位制數,並且分析它代表什麼,那我們需要了解的,有關報文相關格式奧!
在wireshark給出的分析中,圖裡有四行(若有資料,則為5行),來解釋一下它們的含義。
A. 第一行,幀Frame 1 指的是要傳送的資料塊,其中,所抓幀的序號為1,捕獲位元組數等於傳送位元組數:70位元組;
B. 第二行,乙太網,有線區域網技術,是資料鏈路層。源Mac地址為00:c1:b1:14:eb:31;目的Mac地址為00:19:b9:0a:69:f1;
C. 第三行,IPV4協議,也稱網際協議,是網路層。源IP地址為172.16.0.1;目的IP地址為192.168.10.50;
D. 第四行,TCP協議,也稱傳輸控制協議,是傳輸層。源port(40718);目的port(80);序列號(0);長度為0;【因為是第一次握手,所以沒有ACK欄位。ACK是TCP資料包首部中的確認標誌,對已接收到的TCP報文進行確認,值為1表示確認號有效】
E. 第五行【若有】,資料共有的位元組數。
那麼,如何將上述資訊與十六進位制數進行對應呢?我們首先給出一個小總結,並對每一部分進行解釋。
一、資料鏈路層(Ethernet幀,14位元組)
包含:
1.接收資料幀的目的mac地址(dst_mac,6位元組)00:19:b9:0a:69:f1
2.傳送資料幀的源mac地址(src_mac,6位元組)00:c1:b1:14:eb:31
3.接下來的2個位元組標識出乙太網幀所攜帶的上層資料型別,如下:
IPv4: 0x0800 【例子中給出】
ARP:0x0806
PPPoE:0x8864
802.1Q tag: 0x8100
IPV6:0x86DD
MPLS Label:0x8847
二、網路層(IP分組,一般20位元組)
包含:
1.版本號(4位 45):IP協議的版本號 4-> IPv4 6->IPv6
2.首部長度(4位 45):IP分組首部長度,以4位元組為單位 5->IP首部長度為20(5*4)位元組
【以上兩個共佔一個位元組】
3.服務型別(區分服務,TOS,8位,一個位元組 00):指示期望獲得哪種型別的服務,只有在網路提供區分服務(DiffServ)時使用,一般情況下不使用,通常IP分組的該欄位(第二位元組)的值為00H
4.總長度(16位,2個位元組 00 3c):IP分組的總位元組數(首部+資料),最大總長度->65535B 最小的IP分組首部->20B 故IP分組可以封裝的最大資料為:65535-20=66515B
5.標識(16位 19 8b)
6.標識位和片偏移(共16位 40 00 -> 0100 0000 0000 0000):片偏移為0
7.生存時間(TTL 一個位元組 3e):IP分組在網路中可以通過的路由器數(跳步數),路由器轉發一次分組,TTL-1,如果TTL=0,則路由器丟棄該IP分組
8.協議(一個位元組 06):指示IP分組封裝的是哪個協議的資料包,可以用於實現複用/分解 6->TCP 17->UDP
9.首部校驗和(兩個位元組 ac 45):實現對IP分組首部的差錯檢測,計算校驗和時,該欄位置全0;採用反碼算數運算求和,和的反碼作為首部校驗和欄位;逐跳計算、逐跳校驗
10.源IP地址(32位,4個位元組 ac 10 00 01):傳送分組的源主機/路由器(網路介面)的IP地址 172.16.0.1
11.目的IP地址(32位,4個位元組c0 a8 0a 32):接收分組的目的主機/路由器 (網路介面)的IP地址 192.168.10.50
12.選項欄位(長度可變,本例中無):範圍在1~40B之間:攜帶安全、源選路徑、時間戳和路由記錄等內容,實際上很少被使用
填充欄位(長度可變):範圍在0~3B之間,目的是補齊整個 首部,符合32位對齊,即保證首部長度是4位元組的倍數
三、傳輸層(TCP報文段,segment,20~60位元組的首部,其中20位元組是沒有選項的,後面40位元組可選。)
【哪個看著舒服,選哪個奧,哈哈哈哈哈哈哈!】
包含:
1.源地址埠(16位,2個位元組 9F 0E = 40718):傳送該報文段的主機中應用程式的埠號
2.目的地址埠(16位,2個位元組 00 50 = 80 http):標識出遠端埠號
【埠是運輸層與應用層的服務介面。運輸層的複用和分用功能都要通過端口才能實現。】
3.本次傳送的序號欄位(th_seq,4個位元組 fc 85 f3 f7 = 4236637175):TCP 連線中傳送的資料流中的每一個位元組都編上一個序號,序號欄位的值則指的是本報文段所傳送的資料的第一個位元組在整個報文位元組流中的序號(用來解決網路包亂序(reordering)問題)
4.確認號欄位(th_ack,4個位元組00 00 00 00 = 0):是期望收到對方的下一個報文段的資料的第一個位元組的序號(用於確認收到,用來解決不丟包的問題)
5. 下兩個位元組(a0 02 = 1010 0000 0000 0010)是4位首部長度和6位標誌符,中間是6位保留欄位
(1)首部長度(4 位):以32bit為單位的TCP首部長度。最多16行,64位元組;固定5行,20位元組。也叫做data offset,是因為data的第一個位元組前面都是首部且offset從0開始,首部行數和data offset相等
(2)六個標誌位,依次是:
緊急位元 URG —— 當 URG =1 時,表明緊急指標欄位有效。它告訴系統此報文段中有緊急資料,應儘快傳送。(一般不使用)
確認位元 ACK —— 只有當 ACK =1 時確認號欄位才有效。當 ACK = 0 時,確認號無效。
推送位元 PSH (PuSH) —— 接收 TCP** 收到推送位元置 1 的報文段,就儘快地交付給接收應用程序,而不再等到整個快取都填滿了後再向上交付。
復位位元 RST (ReSeT) —— 當 RST = 1 時,表明 TCP 連線中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連線,然後再重新建立運輸連線。
同步位元 SYN —— 同步位元 SYN 置為 1,就表示這是一個連線請求或連線接受報文。
終止位元 FIN (FINal) —— 用來釋放一個連線。當FIN=1 時,表明此報文段的傳送端的資料已傳送完畢,並要求釋放運輸連線。
6.接收視窗欄位(2 位元組, 72 10):用來控制對方傳送的資料量,單位為位元組。TCP 連線的一端根據設定的快取空間大小確定自己的接收視窗大小,然後通知對方以確定對方的傳送視窗的上限,這也就是著名的滑動視窗(SlidingWindow),用於流量控制
7.校驗和(2 位元組, e1 f7):校驗的範圍包括首部和資料兩部分
8.緊急指標(2 位元組, 0000):指出在本報文段中的緊急資料的最後一個位元組的序號
9.可選項(40位元組可選資訊)
(1)MSS:TCP 只規定了一種選項,即最大報文段長度 MSS (Maximum Segment Size)。MSS 告訴對方 TCP:“我的快取所能接收的報文段的資料欄位(不包括首部)的最大長度是 MSS 個位元組。
這兩天將嘗試自己對十六進位制位元組進行解析,努力早日完成下一篇部落格啦!
【最後,這裡給出幾個對於packet分析較為詳細的文章,以供參考哦!】
1.https://blog.csdn.net/hebbely/article/details/54424823/
2. https://blog.csdn.net/u013319359/article/details/81051489
3.https://blog.csdn.net/xu_ya_fei/article/details/46482129
To see I can not see, to know I do not know.