網路資料封裝解析(IP,UDP,TCP)

2021-07-25 19:47:57 字數 2483 閱讀 3837

ip資料報也叫ip報文分組,傳輸在iso網路7層結構中的網路層,它由ip報文頭和ip報文使用者資料組成,ip報文頭的長度一般在20到60個位元組之間,而乙個ip分組的最大長度則不能超過65535個位元組。 

一、下圖為ip分組的報文頭格式,報文頭的前20個位元組是固定的,後面的可變。

版本:佔4位(bit),指ip協議的版本號。目前的主要版本為ipv4,即第4版本號,也有一些教育網和科研機構在使用ipv6。在進行通訊時,通訊雙方的ip協議版本號必須一致,否則無法直接通訊。 

首部長度:佔4位(bit),指ip報文頭的長度。最大的長度(即4個bit都為1時)為15個長度單位,每個長度單位為4位元組(tcp/ip標準,doubleword),所以ip協議報文頭的最大長度為60個位元組,最短為上圖所示的20個位元組。 

服務型別:佔8位(bit),用來獲得更好的服務。其中的前3位表示報文的優先順序,後面的幾位分別表示要求更低時延、更高的吞吐量、更高的可靠性、更低的路由代價等。對應位為1即有相應要求,為0則不要求。 

總長度:16位(bit),指報文的總長度。注意這裡的單位為位元組,而不是4位元組,所以乙個ip報文的的最大長度為65535個位元組。 

標識(identification):該欄位標記當前分片為第幾個分片,在資料報重組時很有用。 

標誌(flag):該欄位用於標記該報文是否為分片(有一些可能不需要分片,或不希望分片),後面是否還有分片(是否是最後乙個分片)。 

片偏移:指當前分片在原資料報(分片前的資料報)中相對於使用者資料字段的偏移量,即在原資料報中的相對位置。 

協議:該欄位指出在上層(網路7層結構或tcp/ip的傳輸層)使用的協議,可能的協議有udp、tcp、icmp、igmp、igp等。 

首部校驗和:用於檢驗ip報文頭部在傳播的過程中是否出錯,主要校驗報文頭中是否有某乙個或幾個bit被汙染或修改了。 

//ip包 

tipheader = packed record 

iph_verlen: byte;           // 版本和長度 

iph_tos: byte;              // 服務型別 

iph_length: word;           // 總長度,2個無符號位元組所以只能65535 

iph_id: word;               // 標識 

iph_offset: word;           // 標誌和片偏移 

iph_ttl: byte;              // 生存時間 

iph_protocol: byte;         // 協議 

iph_xsum: word;             // 頭校驗和 

iph_src: longword;          // 源位址 

iph_dest: longword;         // 目的位址 

end;

這個結構體有什麼用呢?其實在嗅探的時候就很有用了.

二、tcp資料報的頭

typedef struct _tcp_header  tcp_header, *ptcp_header ;
三、udp資料報的頭

typedef struct _udp_header  udp_header, *pudp_header ;
進入協議棧的過程:(從協議棧出來剛好相反)

四、icmp頭和報文校驗和的計算

定義icmp包頭

typedef struct _icmp_header icmp_header, *picmp_header ;

傳送icmp報文時,必須由程式自己計算校驗和,將它填入icmp頭部對應的域中。校驗和的計算方法是:

將資料以字(16位)為單位累加到乙個雙字中(強轉換雙字型別),如果資料長度為奇數(奇數個位元組),最後乙個位元組將被擴充套件到字,累加的結果是乙個雙字,

最後將這個雙字的高16位和低16位相加後取反,便得到了校驗和!

// 計算icmp包校驗值

// 引數1:icmp包緩衝區

// 引數2:icmp包長度

ushort getchecksum ( lpbyte lpbuf, dword dwsize )

// 如果長度是奇數

if ( dwsize == 1 )

dwchecksum += *((lpbyte)lpword) ;

// 高16位和低16位相加

dwchecksum = ( dwchecksum >> 16 ) + ( dwchecksum & 0xffff )

// 取反

return (ushort)(~dwchecksum ) ;

}

Json資料封裝和解析

新增dll引用 右鍵專案 新增引用 net 選擇 c program files x86 reference assemblies microsoft framework v3.0 system.runtime.serialization.dll c program files x86 refere...

資料解析及model的封裝

我們常常需要對資料進行解析,並且建立model存放資料,今天總結一下具體操作以及它們的封裝。1.資料解析並封裝 建立乙個檔案用來進行資料解析。h檔案 import inte ce dataservice nsobject 載入 id loaddatawithlistname nsstring lis...

C 使用Json封裝資料和解析資料

編譯出來的庫名 json vc71 libmtd.lib debug json vc71 libmt.lib release 需要包含的標頭檔案 jsoncpp src 對應原始碼 include json 該目錄下所有檔案 呼叫庫方式 include json json.h ifdef debug...