经典--IP包接收过程.docVIP

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
经典--IP包接收过程

IP包的接收过程 IP包的接收过程 1) IP包由包头和数据区组成, 包头由IP头(iphdr)和IP选项区组成, IP头的开始4位为版本号, 下4位为包头32比特字数, 因此IP包头最大长度为64字节, 最小长度为IP头长度(20字节), 数据区起始于32位边界上. 当包头长度大于IP头长度时, 从IP头开始的区域为IP选项区. 2) IP包接收器(ip_rcv)接收帧类型为ETH_P_IP(0x0800)的包, 它首先检查包的正确性, 再将输入包过滤器进行过滤, 再将过滤包绑定到输出路由, 分析其选项区, 最后从路由目的入口输出, 根据不同的路由类型, 输入到IP转发器(ip_forward)或IP本地分发器(ip_local_deliver)以及 IP同播转发器(ip_mc_output)中. 3) 如果系统允许接收带有信源路由选项(IPOPT_LSRR或IPOPT_SSRR)的IP包, 如果是本地包, 则将包重新绑定到信源路由表第1项地址所指定的路由上, 如果该地址是本地地址, 则用它替换IP头的目的地址并分析下一信源路由地址. ; net/ipv4/ip_output.c: static struct packet_type ip_packet_type = { __constant_htons(ETH_P_IP), NULL, /* All devices */ ip_rcv, (void*)1, NULL, }; void __init ip_init(void) { dev_add_pack(ip_packet_type); ip_rt_init(); inet_initpeers(); #ifdef CONFIG_IP_MULTICAST proc_net_create(igmp, 0, ip_mc_procinfo); #endif } ; net/ipv4/ip_input.c: /* * Main IP Receive routine. */ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) { struct iphdr *iph = skb-nh.iph; /* When the interface is in promisc. mode, drop all the crap * that it receives, do not try to analyse it. */ if (skb-pkt_type == PACKET_OTHERHOST) goto drop; IP_INC_STATS_BH(IpInReceives); if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) goto out; /* * RFC1122: 3.1.2.2 MUST silently discard any IP frame that fails the checksum. * * Is the datagram acceptable? * * 1. Length at least the size of an ip header * 2. Version of 4 * 3. Checksums correctly. [Speed optimisation for later, skip loopback checksums] * 4. Doesnt have a bogus length */ if (skb-len sizeof(struct iphdr) || skb-len (iph-ihl2)) goto inhdr_error; if (iph-ihl 5 || iph-version != 4 || ip_fast_csum((u8 *)iph, iph-ihl) != 0) goto inhdr_error; { __u32 len = ntohs(iph-tot_len); if (skb-len len || len (iph-ihl2)) goto inhdr_error; /* Our transport medium may have padded the buffer out. Now we know it * is IP we can trim to the true length of the frame. * Note this now means skb-len holds ntohs(iph-tot_len). */ __skb_trim(skb, le

文档评论(0)

sy78219 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档