IP頭 TCP頭 UDP頭詳解以及定義

2021-08-26 11:29:00 字數 1708 閱讀 2362

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

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

由於delphi裡面沒有位域這個概念,所以定義結構的時候只能整位元組了,挺懷戀c++或者erlang的,有位域定義出來和使用起來都很方便了

//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資料報的頭

udp資料報的頭

進入協議棧的過程:(從協議棧出來剛好相反)

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 ) ;

}

MAC頭 IP頭 TCP頭 UDP頭詳解以及定義

一 mac幀頭定義 資料幀定義,頭14個位元組,尾4個位元組 typedef struct mac frame header attribute packed mac frame header,pmac frame header typedef struct mac frame tail attri...

IP頭,TCP頭,UDP頭,MAC幀頭定義

一 mac幀頭定義 資料幀定義,頭14個位元組,尾4個位元組 typedef struct mac frame header attribute packed mac frame header,pmac frame header typedef struct mac frame tail attri...

IP頭,TCP頭,UDP頭,MAC幀頭定義

一 mac幀頭定義 資料幀定義,頭14個位元組,尾4個位元組 typedef struct mac frame header attribute packed mac frame header,pmac frame header typedef struct mac frame tail attri...