● 不分片位:表示该数据报是否被分片,如果被置为1,则不能对数据报进行分片,如果要对其进行分片处理,就应将其置为0。
● 更多片位:除了最后一个分片,其他每个组成数据报的片都要讲该位置为1. 片偏移:该分片相对于原始数据报开始处位置的偏移量。
生存时间:设置数据报可以经过的最多路由器数,它指定了数据报的生存时间。生存时间由源主机指定,在数据报传输过程中,每经过一个路由器,该值就减1,当该字段的值为0时,数据报就会被丢弃,并发送ICMP报文通知源主机。
协议:向IP层传输数据的协议类型,常见协议类型的值:表示 1. ICMP协议表示 2. IGMP协议 3. 表示TCP协议 4. 表示UDP协议
首部许校验和:校验接收到的IP数据报是否有差错。 源IP地址:源主机的IP地址。 目的IP地址:目的主机的IP地址。
选项:该字段是数据报中的可选字段。这也是前面所说的IP首部长度一般为20B的原因。目前这个选项有如下定义:
1)安全和处理限制(用于军事领域) 2)记录路径 3)时间戳 4)宽松的源站选路 5)严格的源站选路
五、重点要掌握的内容
IP报文分段原理及实现 IP报文重组原理及实现
(教材第9章中重点要理解的函数) append_data() msg_find() msg_frag_intern() msg_frag_queue() struct usermap struct mfq struct msg_hdr
六、协议分析实例
0x0000 00 1B 11 A6 BE 54 00 18-F3 DD 43 69 08 00 45 00
0x0010 00 20 D5 56 00 00 80 01-59 B2 C0 A8 00 8D CA 73
0x0020 80 2B 08 00 1B 39 04 00-14 00 61 62 63 64
协议分析示例
-(1) 该以太帧源
MAC地址和目的MAC地址分别是多少?
源MAC地址00 18 F3 DD 43 69 目的MAC地址00 1B 11 A6 BE 54
-(2)该以太帧的什么字节位置的值表示其承载的是IP报文?
第13、14字节08 00 表示其是IP报文
-(3)该IP报文的头部有选项内容吗?
由头部长度ihl为5得知头部长度为最小20字节,所以没有选项内容。
-(4)该IP报文分段了吗,为什么?
由分段标识frag为000,得知该报文为可以分割的报文且后面没有报文,由片偏移为0 0000 0000 0000,得知这是第一个报文,所以得知这个报文没有被分割。
-(5)该IP报文的头部和数据各是多少字节?
由头部长度ihl为5得知头部长度为5×4=20字节。总长度字段tot_len为0x 00 20 得总长度32字节。数据长度=总长度-(ihl×4)=12。
-(6)该IP报文的检验和按主机字节序表示,应是多少?
检验和check字段为59 B2,由于主机采用小端字节序,所以主机字节序为B2 59。
-(7)该IP报文的ID是多少?
由标识号D5 56 得知该报文ID为54614
-(8)该IP报文的服务类型(type of service)是多少?
由区分服务00 得知 服务类型是00.表示没有服务。
七、内容提要
int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) {
struct iphdr *iph;
if(skb->pkt_type==PACKET_OTHERHOST)……………………………………………(1) goto drop; …,
if(!pskb_may_pull(skb,sizeof(struct iphdr)))……………(2) goto inhdr_error; iph = ip_hdr(skb);
if(iph->ihl<5||iph->version!=4)…………………………………...(3) goto inhdr_error;
if(!pskb_may_pull(skb,iph->ihl*4))…………………………………………(4) goto inhdr_error; iph = ip_hdr(skb);
if(unlikely(ip_fast_csum((u8*)iph, iph->ihl))) goto inhdr_error;
len = ntohs(iph->tot_hen);…………………..(5) if(skb->len IP_INC_STATS_BH(IPSTATS_MIB_INTRUNCATEDPKTS); goto drop; }else if(len<(iph->ihl*4))…………………………………………(7) goto inhdr_error;