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
新闻热点
疑难解答