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 ) ;
}
資料的網路傳輸
一 資料傳送過程 從主機進入線路 1 應用程式首先得將需要傳送到資料寫入該程序的記憶體位址空間中 2 應用程式通過系統函式庫介面 比如send函式 向核心發出系統呼叫,系統核心將這些資料從使用者態記憶體區複製到由核心維護的一段稱為核心緩衝區的記憶體位址空間 3 當資料寫入核心緩衝區後,核心會通知網絡...
網路資料(socket)傳輸總結
環境限定 tcp ip下的socket網路傳輸 c c 開發語言,32 64位機。目前有兩種方式對資料進行傳輸 1 字元流形式,即將資料用字串表示 2 結構型方式,即將資料按型別直接傳輸。1 的方式保證所有的資料都是清晰的字串明文,沒有平台不一致問題,但傳輸的資料不定長,復合資料型別 如struct...
網路資料(socket)傳輸總結
環境限定 tcp ip下的socket網路傳輸 c c 開發語言,32 64位機。目前有兩種方式對資料進行傳輸 1 字元流形式,即將資料用字串表示 2 結構型方式,即將資料按型別直接傳輸。1 的方式保證所有的資料都是清晰的字串明文,沒有平台不一致問題,但傳輸的資料不定長,復合資料型別 如struct...