1. 程式人生 > >[轉載]Python-對Pcap檔案進行處理,獲取指定TCP流 https://www.cnblogs.com/sunpudding/p/9538889.html

[轉載]Python-對Pcap檔案進行處理,獲取指定TCP流 https://www.cnblogs.com/sunpudding/p/9538889.html

https://www.cnblogs.com/sunpudding/p/9538889.html

 

Python-對Pcap檔案進行處理,獲取指定TCP流

        通過對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,裡面不僅有完整專案程式碼,還有單元測試,歡迎下載,一起學習交流。