1. 程式人生 > >Python-對Pcap文件進行處理,獲取指定TCP流

Python-對Pcap文件進行處理,獲取指定TCP流

serve cap dscp 解析 地址 沒有 ont wikipedia 校驗和

通過對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流