ip報文是在網絡層傳輸的數據單元,也叫IP數據報。IP報文格式如下圖(圖片來源:百度百科)
版本:IP協議的版本,目前的IP協議版本號為4,下一代IP協議版本號為6。
首部長度:IP報頭的長度。固定部分的長度(20字節)和可變部分的長度之和。共占4位。最大為1111,即10進制的15,代表IP報頭的最大長度可以為15個32bits(4字節),也就是最長可為15*4=60字節,除去固定部分的長度20字節,可變部分的長度最大為40字節。
服務類型:Type Of Service。
總長度:IP報文的總長度。報頭的長度和數據部分的長度之和。
標識:唯一的標識主機發送的每一分數據報。通常每發送一個報文,它的值加一。當IP報文長度超過傳輸網絡的MTU(最大傳輸單元)時必須分片,這個標識字段的值被復制到所有數據分片的標識字段中,使得這些分片在達到最終目的地時可以依照標識字段的內容重新組成原先的數據。
標志:共3位。R、DF、MF三位。目前只有后兩位有效,DF位:為1表示不分片,為0表示分片。MF:為1表示“更多的片”,為0表示這是最后一片。
片位移:本分片在原先數據報文中相對首位的偏移位。(需要再乘以8)
生存時間:IP報文所允許通過的路由器的最大數量。每經過一個路由器,TTL減1,當為0時,路由器將該數據報丟棄。TTL 字段是由發送端初始設置一個 8 bit字段.推薦的初始值由分配數字 RFC 指定,當前值為 64。發送 ICMP 回顯應答時經常把 TTL 設為最大值 255。
協議:指出IP報文攜帶的數據使用的是那種協議,以便目的主機的IP層能知道要將數據報上交到哪個進程(不同的協議有專門不同的進程處理)。和端口號類似,此處采用協議號,TCP的協議號為6,UDP的協議號為17。ICMP的協議號為1,IGMP的協議號為2.
首部校驗和:計算IP頭部的校驗和,檢查IP報頭的完整性。
源IP地址:標識IP數據報的源端設備。
目的IP地址:標識IP數據報的目的地址。
———————————————————————————————————————————————————————————————————
linux下各數據報頭部結構體定義:
#ifndef LITTLE_ENDIAN#define LITTLE_ENDIAN (1) //BYTE ORDER#else#error Redefine LITTLE_ORDER#endif
//Mac頭部,總長度14字節typedef struct _eth_hdr{unsigned char dstmac[6]; //目標mac地址unsigned char srcmac[6]; //源mac地址unsigned short eth_type; //以太網類型}eth_hdr;
//IP頭部,總長度20字節typedef struct _ip_hdr{#if LITTLE_ENDIANunsigned char ihl:4; //首部長度unsigned char version:4, //版本 #elseunsigned char version:4, //版本unsigned char ihl:4; //首部長度#endifunsigned char tos; //服務類型unsigned short tot_len; //總長度unsigned short id; //標志unsigned short frag_off; //分片偏移unsigned char ttl; //生存時間unsigned char PRotocol; //協議unsigned short chk_sum; //檢驗和struct in_addr srcaddr; //源IP地址struct in_addr dstaddr; //目的IP地址}ip_hdr;
//TCP頭部,總長度20字節typedef struct _tcp_hdr{unsigned short src_port; //源端口號unsigned short dst_port; //目的端口號unsigned int seq_no; //序列號unsigned int ack_no; //確認號#if LITTLE_ENDIANunsigned char reserved_1:4; //保留6位中的4位首部長度unsigned char thl:4; //tcp頭部長度unsigned char flag:6; //6位標志unsigned char reseverd_2:2; //保留6位中的2位#elseunsigned char thl:4; //tcp頭部長度unsigned char reserved_1:4; //保留6位中的4位首部長度unsigned char reseverd_2:2; //保留6位中的2位unsigned char flag:6; //6位標志 #endifunsigned short wnd_size; //16位窗口大小unsigned short chk_sum; //16位TCP檢驗和unsigned short urgt_p; //16為緊急指針}tcp_hdr;
//UDP頭部,總長度8字節typedef struct _udp_hdr{unsigned short src_port; //遠端口號unsigned short dst_port; //目的端口號unsigned short uhl; //udp頭部長度unsigned short chk_sum; //16位udp檢驗和}udp_hdr;
//ICMP頭部,總長度4字節typedef struct _icmp_hdr{unsigned char icmp_type; //類型unsigned char code; //代碼unsigned short chk_sum; //16位檢驗和}icmp_hdr;
參考文獻:
http://blog.csdn.net/shinezhang86/article/details/47145907
http://blog.csdn.net/kernel_jim_wu/article/details/7447377
http://www.360doc.com/content/17/0301/10/40723314_632895111.shtml
http://www.360doc.com/content/11/0120/23/1964482_87982213.shtml
http://www.cnblogs.com/yongren1zu/p/6274460.html
http://www.cnblogs.com/kzloser/articles/2582349.html
新聞熱點
疑難解答