簡體   English   中英

如何解析TCP數據包有效負載

[英]How to parse TCP packet payload

我正在使用pcap捕獲我想要解析有效負載的TCP數據包。 我的策略如下:

  1. 獲取以太網標頭並檢查它是否具有ETHERTYPE_IP類型(IP數據包)
  2. 檢查IP數據包是否具有協議IPPROTO_TCP (TCP數據包)
  3. 檢查有效負載大小> 0 (size = ntohs(ip_header->total_length - ip->header_length*4 - sizeof(struct tcp_header))

  4. 解析有效負載(抓取主機URL)

我還沒有開始解析有效載荷,因為我得到了不一致。 下面是使用過濾器"host = www.google.com"打印出10個捕獲的TCP數據包的有效負載。

包號:3 :TCP包:源端口:80目的端口:58723包中沒有數據

數據包編號:4 :TCP數據包:源端口:58723目標端口:80數據包中沒有數據

數據包編號:5 :TCP數據包:源端口:58723目標端口:80 有效負載: GET / HTTP / 1.1主機:www.google.com用戶代理:Mozilla / 5.0(Macintosh; U; Intel Mac OS X 10_6_5; en- us)AppleWebKit / 533.19.4(KHTML,類似Gecko)版本/ 5.0.3 Safari / 533.19.4接受:application / xml,application / xhtml + xml,text / html; q = 0.9,text / plain; q = 0.8 ,image / png, / ; q = 0.5 Accept-Language:en-us Accept-Encoding:gzip,deflate Cookie:THICNT = 25; SID = DQAAAKIAAAB2ktMrEftADifGm05WkZmlHQsiy1Z2v-連接:保持活着

包號碼:6 :TCP包:源端口:80目的端口:58723包中沒有數據

包號碼:7 :TCP包:源端口:80目的端口:58723 有效載荷: \\ 272 \\ u \\ 243 \\ 255 \\ 375 \\ 375} \\ 336H \\ 221 \\ 227 \\ 206 \\ 312~ \\ 322 \\ 317N \\ 236 \\ 255A \\ 343 #\\ 226 \\ 370֤\\ 245 [\\ 327` \\ 306ըnE \\ 263 \\ 204 \\ 313 \\ 356 \\ 3268)p \\ 344 \\ 301_Y \\ 255 \\ 267 \\ 240 \\ 222x \\ 364

數據包編號:8 :TCP數據包:源端口:58723目標端口:80數據包中沒有數據

包號碼:9 :TCP包:源端口:80目的端口:58723 有效載荷: HTTP / 1.1 200 OK日期:星期一,2010年11月29日10:11:36 GMT到期:-1緩存控制:私有,最大 - 年齡= 0內容類型:text / html; charset = UTF-8內容編碼:gzip服務器:gws內容長度:8806 X-XSS-Protection:1; mode = block \\ 213

為什么有效載荷和端口存在差異? 理想情況下,我只想解析數據包5之類的數據包。如何忽略像7和9這樣的數據包?

只有通過分析內容。 什么在IP或TCP標頭中什么都不能標記“HTTP請求”數據包。 甚至“連接中的第一個數據包”也不起作用,因為存在持久連接。

此外,要完全確定捕獲所有URI,您需要重新組裝TCP流並解析HTTP請求:URI可以拆分為兩個或更多數據包。

與IP頭一樣,TCP頭也是可變長度的。 你沒有考慮到這一點。 您需要在IP數據中找到TCP標頭,然后使用其長度字段(需要乘以4,就像IP標頭長度字段一樣sizeof(struct tcp_header)) ,而不是盲目地從總數據包大小中減去sizeof(struct tcp_header)) 。 )了解實際數據有效負載的位置。

您的大小計算不正確 - 您無法在網絡主機順序中進行減法,您必須先將每個字段轉換為主機字節順序:

size = ntohs(ip_header->total_length) - ntohs(ip->header_length) * 4 - sizeof(struct tcp_header))

但是,正如Remy Lebeau指出的那樣,您實際上需要檢查TCP標頭中的offset字段以了解有效負載的起始位置。

包5和包7之間的區別在於,前者是客戶端去, 服務器,而后者是從服務器到客戶端的響應。 這就是端口切換的原因 - 源地址和目標地址也將被切換。

如果您只想查看來自客戶端的數據包,請檢查源地址是否等於客戶端的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM