pcap檔案解析(三) 拆分SCTP包

2021-06-28 06:18:36 字數 4014 閱讀 1864

這一章,我們將了解sctp資料報結構,並簡要介紹sctp協議,最後將帶有多個chunk的sctp包拆分問單個sctp資料報。

資料報頭

eth資訊

ip頭sctp頭

sctp chunk 1

……sctp chunk n

其中資料報頭和ip頭已經在前面做過介紹了,這裡先簡單介紹一下eth資訊。

[cpp]view plain

copy

// ethernet 資訊

typedef

struct__ethernet_info  

__ethernetinfo;  

dsetmac 目的主機mac位址

srcmac   源主機mac位址

type 協議型別,ip為0x0800

乙個 sctp 分組含了乙個公共的分組頭(common header)和若干資料塊(chunk),每個資料塊中既可以包含控制資訊,也可以包含使用者資料。除了init、init ack和shutdown complete 資料塊外,其他型別的多個資料塊可以**在乙個sctp 分組中,以滿足對 mtu 大小的要求。當然,這些資料塊也可以不與其他資料塊**在乙個分組中。如果乙個使用者訊息不能放在乙個sctp 分組中,這個訊息可以被分成若干個資料塊。

sctp 公共分組頭中包括了源埠號(source port number)、目的埠號(destination portnumber)、驗證標籤(verification tag)和校驗碼(checksum)

1.源埠號(16 bits)

源埠號識別 sctp 傳送端點的sctp 埠號。接收方可以使用源埠號、源ip 位址、目的埠號和目的ip 位址標識該sctp 分組所屬的偶聯。

2.目的埠號(16 bits)

目的埠號為目的端點的 sctp 埠號。接收主機可以使用目的埠號將sctp 分組解復用到正確的端點或應用中。

3.驗證標籤(32 bits)

驗證標籤是偶聯建立時,本端端點為這個偶聯生成乙個隨機標識。偶聯建立過程中,雙方會交換這個tag,到了資料傳遞時,傳送端必須在公共分組頭中帶上對端的這個tag,以備校驗。

4.校驗碼(32 bits)

sctp 通過對使用者資料使用adler-32 演算法,計算出乙個32 位的校驗碼,帶在資料報中,在接收端進行同樣的運算,通過檢查校驗碼是否相等來驗證使用者資料是否遭到破壞。

資料塊包括了塊型別(chunk type)、塊標誌位(chunk flags)、塊長度(chunk length)和塊值(chunk value )。

1.塊型別(8 bits)

塊型別定義在塊值(chunk value)中訊息所屬的型別。

0data(淨資料) 傳輸的使用者資料塊。

1init 用於發起兩個端點之間的sctp 偶聯。

2init ack 用來確認sctp 偶聯的發起訊息(init)。

3sack 該資料塊送至對端,以確認收到data 塊,並且通知對端data 的接收順序間隙。

4heartbeat 端點傳送該資料塊至對端,以檢測當前偶聯中定義的某一目的位址的可達性。

5heartbeat ack 響應heartbeat 訊息。

6abort 關閉偶聯。

7shutdown 偶聯中的乙個端點對其偶聯發起乙個graceful關閉。

8shutdown ack 響應shutdown 訊息,關閉程式完成時發出。

9error 通知對端,sctp 偶聯發生某種錯誤。

10cookie echo 僅用於偶聯發起過程,它由偶聯的發起者傳送至對端以完成發起程式。

11cookie ack cookie 證實,相對於cookie echo

12ecne 保留,應用於外部環境擁塞發布回聲

13cwr 保留,應用於降低擁塞視窗

14shutdown complete用於關閉程式完成時對shutdown ack 訊息進行確認

15-62

ietf 保留

63ietf 定義塊擴充套件使用

64-126

ietf 保留

127定義塊擴充套件使用

128-190

ietf 保留

191定義塊擴充套件使用

192-254

ietf 保留

255ietf 定義塊擴充套件使用如果接收端點不能識別塊型別時,塊型別最高位2bit 用於標識需要進行的各種操作。

bits(最高兩位) 含義

00停止處理並丟棄此sctp 分組,不再處理該sctp 分組中的其他訊息塊。

01停止處理並丟棄此sctp 分組,不再處理該sctp 分組中的其他訊息塊,並且在「error」或「init ack」中向發起端點返回不能識別的引數。

10跳過此資料塊並繼續執行。

11跳過此資料塊並繼續執行,並且在「error」或「init ack」中向發起端點返回不能識別的引數。

2.資料塊標誌位(8bit)塊標誌位用法由塊型別決定。除非被置為其他值,塊標記在傳送過程中會被置0 而且接收端點會忽視塊標記。

定義見:http:\\

3.塊長度(16bit)

塊長度包括塊型別(chunk type)、塊標記(chunk flags)、塊長度(chunk length)和塊值(chunk value),長度使用二進位制表示。

4.塊值(可變長度)

塊值的內容在塊中傳送實際的資訊,內容由訊息塊型別決定。塊值的長度為不定長。

[cpp]view plain

copy

// sctp頭

typedef

struct

__sctp_header  

__sctpheader;  

// chunk頭

typedef

struct

__sctp_chunk_header  

__sctpchunkheader;  

// 單個sctp chunk

typedef

struct

__sctp_chunk  

__sctpchunk;  

下面的**將逐個解析資料報,當資料報位sctp包時,對data chunk進行拆分。

[cpp]view plain

copy

bool

main()  

// 獲得檔案頭

getpcapheader( &header);  

//寫入檔案頭

writefileheader( &header);  

movefirst();  

while

( !ieeof())  

writesctpchunk(&sctpchunk);  

ichunknum = ilenght = 0;  

}  else

ichunkoffset +=sctpchunk.header.ilength;  

if( ichunkoffset>=  

ipdata.itotallength- ((ipdata.bytehdlength & 0x0f) * 4))  

}  break

;  }  

}  }  

free( pbuffer);  

}  closeoutfile();  

closepcapfile();  

printf( "export over"

);  

return

true

;  }  

pcap檔案解析 pcap檔案頭與包檔案頭(一)

前段時間接到乙個公司關於解析pacp檔案的培訓 我是被培訓的 在完成了一部分的功能後決定把一些關於pcap檔案的了解記錄到部落格中。在開始讀取pcap檔案之前,先讓我們來看看pcap檔案的大概結構。如上圖所示在乙個pcap檔案中存在1個pcap檔案頭和多個資料報,其中每個資料報都有自己的頭和包內容。...

Pcap檔案格式解析

一 24位元組pcap檔案頭 乙個檔案只有乙個 linktype為鏈路層型別,決定資料幀頭結構,其他沒啥用 typedef struct pcapfileheader pcapfileheader t 二 pcap包頭 乙個檔案可以有很多個包 時間戳 typedef struct pcaptime ...

python解析pcap檔案中的http資料報

使用scapy scapy http就可以方便的對pcap包中的http資料報進行解析 其中,p為資料報,scapy http將其分為 ethernet tcp raw三個層次,使用p.show 函式可以列印出如下結果 ethernet dst 02 00 00 00 00 39 src 00 00...