標籤:zone led des 指標 版本號碼 根據 連網 選項 線資料
通過對TCP/IP協議的學習,本人寫了一個可以實現對PCAP檔案中的IPV4下的TCP流提取,以及提取指定的TCP流,鑒於為了學習,沒有採用第三方包解析pcap,而是對bytes流進行解析,其核心思想為:若想要提取TCP Content,需在下層的IPV4協議中判斷Protocol是否為TCP,然後判斷下層的乙太網路協議的Type是否為IPV4協議(此處的IPV4判斷,只針對本人所寫項目);對於指定流需要擷取Client以及Server的[IP,PORT]。
一、Pcap檔案解析
對於一個Pcap檔案,其結構為檔案頭,資料包頭,資料包資料,資料包頭,資料包資料……,檔案頭為24位元組,如下:
- Magic:4Byte:標記檔案開始,並用來識別檔案自己和位元組順序
- Major:2Byte: 當前檔案主要的版本號碼
- Minor:2Byte: 當前檔案次要的版本號碼
- ThisZone:4Byte:當地的標準時間,如果用的是GMT則全零,一般都直接寫 0000 0000
- SigFigs:4Byte:時間戳記的精度
- SnapLen:4Byte:最大的儲存長度
- LinkType:4Byte:鏈路類型
資料前序為16位元組,如下:
- Timestamp 4Byte:被捕獲時間的高位,精度為seconds
- Timestamp 4Byte:被捕獲時間的低位,精度為microseconds
- Caplen 4Byte:當前資料區的長度,即抓取到的資料幀長度,不包括Packet Header本身的長度,單位是 Byte ,由此可以得到下一個資料幀的位置。
- Len 4Byte:離線資料長度:網路中實際資料幀的長度,一般不大於caplen,多數情況下和Caplen數值相等。
Packet Data
在資料包頭之後,就是資料包的資料了,資料長度就是Caplen個Byte,在此之後是一個新的Packet Header,新的Packet Data,如此迴圈。 二、乙太網路協議解析 乙太網路協議為14Byte,6Byte Destination,6Byte Source,2Byte Type
三、IPV4協議解析 不同的IP協議各有不同,本項目只選用IPV4下的TCP流
- Version 4bit:對於IPv 4,這總是等於4
- IHL 4bit:資料報協議頭長度,表示協議頭具有32位字長的數量。該欄位的最小值為5,它表示長度為5×32位=160位=20位元組。作為一個4位欄位,最大值為15字(15×32位,或480位=60位元組)
- DSCP 6bit:差異服務代碼點
- ECN 2bit:明確壅塞通知
- Total Length 2Byte:這個16位欄位定義了整個IP資料包大小(以位元組為單位),包括前序和資料,最小大小為20位元組(沒有資料的頭),最大為65535位元組。
- Identification 2Byte:該欄位是一個識別欄位,主要用於唯一標識單個IP資料報的片段組。
- Flags 3bit:用於控制或識別片段
- Fragment Offset 13bit:片段位移欄位以8位元組塊為單位進行測量。它有13位長,並指定特定片段相對於原始未分段ip資料報開頭的位移量。第一個片段的位移量為零。這允許最大位移量(2**13-1)×8=65528位元組,這將超過包含前序長度(65528+20=65548位元組)的最大IP資料包長度65535位元組。
- Time To Live (TTL) 1Byte:一段8位的存活時間有助於防止資料報在互連網上持久化
- Protocol 1Byte:此欄位定義IP資料報的資料部分中使用的協議
- Header Checksum 2Byte:16位IPV4頭校正和欄位用於對標題進行錯誤檢查
- Source address 4Byte:此欄位是資料包寄件者的IPV4地址。
- Destination address 4Byte:該欄位是資料包接收方的IPV4地址
- Options:選項欄位不常使用。
四、TCP協議解析
- Source port (16 bits):標識傳送埠
- Destination port (16 bits):標識接收埠
- Sequence number (32 bits):序號,具有雙重作用,如果syn被設定成1,標誌這是初始序號,如果syn被設定成0,表示這是初始序號,如果syn被設定成0,表示這是當前會話的此段的第一個資料位元組的累積序號
- Acknowledgment number (32 bits):如果設定ACK標誌,則此欄位的值是ACK發送方期望的下一個序號
- Data offset (4 bits):指定以32位為單位的tcp前序的大小。最小標題為5字,最大為15字,從而使其最小為20位元組,最大為60位元組,允許在標題中設定多達40位元組的選項
- Reserved (3 bits):供將來使用,並應設定為零
Flags (9 bits) (aka Control bits):包含9個標誌位
- NS (1 bit): ECN-nonce - 隱藏保護
- CWR (1 bit): 發送主機設定擁塞視窗減少(Cwr)標誌,以表明它收到了設定了ecc標誌的tcp段,並在擁塞控制機制中作出了響應
- ECE (1 bit): ECN-Echo具有雙重角色,這取決於SYN標誌的值
- URG (1 bit): 指示緊急指標欄位是有效
- ACK (1 bit): 指示確認欄位是有效。用戶端發送的初始SYN資料包之後的所有資料包都應該設定此標誌
- PSH (1 bit): 推送功能,請求將緩衝資料推送到接收應用程式
- RST (1 bit):重設串連
- SYN (1 bit): 同步序號。只有從每一端發送的第一個資料包應該設定此標誌。其他一些標誌和欄位根據此標誌更改含義,有些只有在設定1時才有效,而另一些則在0時才有效
- FIN (1 bit): 來自發送方的最後一包
- Window size (16 bits):接收視窗的大小
- Checksum (16 bits):16位校正和欄位用於對前序、有效載荷和偽頭進行錯誤檢查
- Urgent pointer (16 bits):如果設定了URG標誌,則此16位欄位與表示最後一個緊急資料位元組的序號之間的位移量
- Options (Variable 0–320 bits, divisible by 32):該欄位的長度由資料位移欄位決定
五、處理檔案
部分核心代碼如下:
此部分是對pcap(bytes)檔案讀入,將每一個資料包資料作為一幀,判斷為IPV4-TCP資料後,將TCP裡面的[src, dst,src_port,dst_port, seq, ack, flags, content]一幀幀提取,儲存在tcp_stream,此處即為提取pcap檔案中所有的TCP流
此處是對於上面傳入的tcp_stream,提取出我們想要指定的Tcpstream,如果flags_ack,flages_push為1時,即有Client或Server進行http請求,若此包被確認接收,則進行儲存(避免重傳,丟包的情況),判斷flags_fin為1時,結束迴圈,返回指定的Tcp流。
六、完整代碼
TCP學習:https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure
IPV4學習:https://en.wikipedia.org/wiki/IPv4#Packet_structure
完整代碼:https://github.com/sunpudding/python,裡面不僅有完整項目代碼,還有單元測試,歡迎下載,一起學習交流。
Python-對Pcap檔案進行處理,擷取指定TCP流