1 版本域:表示資料報相對應的IP協定是多少,目前是4(代表IPv4,但IPv6也許要替代IPv4了)
2 首部長度:4位,IP協定標頭的長度,指明IPv4協定標頭長度的位元組數包含多少個32位。由于IPv4的標頭可能包含可變數量的可選項,是以這個字段可以用來确定IPv4資料報中資料部分的偏移位置。IPv4標頭的最小長度是20個位元組,是以IHL這個字段的最小值用十進制表示就是5 (5x4 = 20位元組)。就是說,它表示的是標頭的總位元組數是4位元組的倍數。
3 服務類型:定義IP協定包的處理方法,它包含如下子字段
-
- 過程字段:3位,設定了資料包的重要性,取值越大資料越重要,取值範圍為:0(正常)~ 7(網絡控制)
-
- 延遲字段:1位,取值:0(正常)、1(期特低的延遲)
-
- 流量字段:1位,取值:0(正常)、1(期特高的流量)
-
- 可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)
-
- 成本字段:1位,取值:0(正常)、1(期特最小成本)
-
- 未使用:1位
4 總長度域:IP包的總長,以位元組為機關
5 辨別域:是源機賦予資料報的辨別符,以便目的機進行分片的重組工作;
6 标志:是一個3位的控制字段,包含:
保留位(2):1位
不分段位(1):1位,取值:0(允許資料報分段)、1(資料報不能分段)
更多段位(0):1位,取值:0(資料包後面沒有包,該包為最後的包)、1(資料包後面有更多的包)
7 段偏移量:當資料分組時,它和更多段位(MF, More fragments)進行連接配接,幫助目的主機将分段的包組合。偏移量是以8個位元組為機關的;
8 TTL:表示資料包在網絡上生存多久,每通過一個路由器該值減一,為0時将被路由器丢棄。
9 協定:8位,這個字段定義了IP資料報的資料部分使用的協定類型。常用的協定及其十進制數值包括ICMP(1)、TCP(6)、UDP(17)。
10 校驗和:16位,是IPv4資料報標頭的校驗和。
11 源IP位址:為發送方的IP位址 4位元組,0x0a0x080x7a0xfe 對應IP位址 10.8.122.254
12 目的位址:接收方IP位址
13 選項域:可有可無
// IP header
typedef struct _tagX_iphdr
{
unsigned char h_len:4; // IP報頭長度 4位 5<<2 =20
unsigned char version:4; // 版本 4位 4
unsigned char tos; // 服務類型 8位 0
unsigned short total_len; // 總長度 16位 0042
unsigned short ident; // 辨別 16位 410e
unsigned short frag_and_flags; // 報片标志偏移 4+12位 0000
unsigned char ttl; // 生存時間 8位 80
unsigned char proto; // 協定(TCP, UDP etc) 8位 01
unsigned short checksum; // 報頭校驗和 16位 d4d1
unsigned int sourceIP; //信源IP位址 32位 0a 00 08 7a
unsigned int destIP; //信宿IP位址 32位 0a 00 08 7a
}XIpHeader;
//TCP header
typedef struct _tcphdr
{
byte source_port[2]; //發送端端口号,16位
byte dest_port[2]; //接收端端口号,16位
byte sequence_no[4]; //32位,标示消息端的資料位于全體資料塊的某一位元組的數字
byte ack_no[4]; //32位,确認号,标示接收端對于發送端接收到資料塊數值
byte offset_reser_con[2];//資料偏移4位,預留6位,控制位6為
byte window[2]; //視窗16位
byte checksum[2]; //校驗碼,16位
byte urgen_pointer[2]; //16位,緊急資料指針
byte options[3]; //選祥和填充,32位
}TCP_HEADER;