资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,专业化、规范化、标准化、电子化,2024/11/26,1,专业化、规范化、标准化、电子化,数据在,IP,网络中的传输过程,编制人:彭远大,版本:,v1.0,有计划、有总结、有记录、有审核;,2024/11/26,2,专业化、规范化、标准化、电子化,课程定位与目标,讲义适用于测试储干,学习后,掌握互联网络的基础知识,数据包在经过各种网络设备时的处理方式和过程,快速定位问题,自学建议:,tcp/ip,协议详解 卷,1,2024/11/26,3,专业化、规范化、标准化、电子化,5,4,3,2,1,目录,互联网服务概述,数据包的生成,路由选择与,iptables,链表 流程,路由处理流程,netfilter,6,接收后数据包的处理,2024/11/26,4,专业化、规范化、标准化、电子化,一,TCP/IP,四层模型,TCP/IP,协议被组织成四个概念层,其中有三层对应于,ISO,参考模型中的相应层。,ICP/IP,协议族并不包含物理层和数据链路层,因此它不能独立完成整个计算机网络系统的功能,必须与许多其他的协议协同工作。,TCP/IP,分层模型的四个协议层分别完成以下的功能:第一层,:,网络接口层包括用于协作,IP,数据在已有网络介质上传输的协议。实际上,TCP/IP,标准并不定义与,ISO,数据链路层和物理层相对应的功能。相反,它定义像地址解析协议,(Address Resolution Protocol,ARP),这样的协议,提供,TCP/IP,协议的数据结构和实际物理硬件之间的接口。第二层,:,网间层对应于,OSI,七层参考模型的网络层。本层包含,IP,协议、,RIP,协议,(Routing Information Protocol,,路由信息协议,),,负责数据的包装、寻址和路由。同时还包含网间控制报文协议,(Internet Control Message Protocol,ICMP),用来提供网络诊断信息。第三层,:,传输层对应于,OSI,七层参考模型的传输层,它提供两种端到端的通信服务。其中,TCP,协议,(Transmission Control Protocol),提供可靠的数据流运输服务,,UDP,协议,(Use Datagram Protocol),提供不可靠的用户数据报服务。第四层,:,应用层对应于,OSI,七层参考模型的应用层和表达层。因特网的应用层协议包括,Finger,、,Whois,、,FTP(,文件传输协议,),、,Gopher,、,HTTP(,超文本传输协议,),、,Telent(,远程终端协议,),、,SMTP(,简单邮件传送协议,),、,IRC(,因特网中继会话,),、,NNTP,(网络新闻传输协议)等,2024/11/26,5,专业化、规范化、标准化、电子化,PC1,PC2,PC3,PC4,电信,DNS Server,网通,DNS Server,根,DNS Server,根,DNS Server,中国网通,国际互联网,中国电信,PC1,163 proxy,服务器,163 proxy,服务器,ADSL modem,ADSL modem,R8,G3124F,F1008,F1008,G1024,163 proxy,服务器,一 互联网服务简示图,2024/11/26,6,专业化、规范化、标准化、电子化,IP,包的生成,一个数据包的生成到接收大致会经过以下几个过程,发送端:,应用程序,-,操作系统(,TCP/IP,协议践),-,网卡驱动程序处理,-,网卡发送,到达目的地后各以相反的次序处理,接收端:,网卡接收,-,网卡驱动程序处理,-,操作系统(,TCP/IP,协议践),-,应用程序,IP,包的生成由应用层 传输层 网络层完成,2024/11/26,7,专业化、规范化、标准化、电子化,IP,包的生成,IP,首部报文格式,2024/11/26,8,专业化、规范化、标准化、电子化,IP,包的生成,IP,首部,2024/11/26,9,专业化、规范化、标准化、电子化,IP,包的生成,一个简单的应用程序,sockt,调用发送一个,IP,数据包过程,#include ,#include ,#include ,#include ,#include ,#include ,#include ,#include ,#include ,#define MAXBUF 1024,2024/11/26,10,专业化、规范化、标准化、电子化,IP,包的生成,int main(int argc, char *argv),int sockfd;,struct sockaddr_in dest;,char buf14;,if (sockfd = socket(AF_INET, SOCK_STREAM, 0) return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL,ip_rcv_finish);,net/ipv4/ip_input.c ,return NF_HOOK(PF_INET, NF_IP_LOCAL_IN, skb, skb-dev, NULL,ip_local_deliver_finish);,net/ipv4/ip_forward.c return NF_HOOK(PF_INET, NF_IP_FORWARD, skb, skb-dev, rt-u.dst.dev,ip_forward_finish);,net/ipv4/ip_output.c ,return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt-u.dst.dev,dst_output);,net/ipv4/ip_output.c ,return NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev,ip_finish_output, !(IPCB(skb)-flags ,net/ipv4/ip_output.c ,return NF_HOOK(PF_INET, NF_IP_POST_ROUTING, newskb, NULL,newskb-dev, ip_dev_loopback_xmit);,路由选择与,iptables,链表,2024/11/26,29,专业化、规范化、标准化、电子化,Linux-2.6.21.1,网络函数调用过程,网络函数调用过程,接收以太帧,(,驱动程序,),:,netif_rx,- queue,- netif_receive_skb,- bond,- packet_type_all: deliver_skb,- bridge,- packet_type(IPV4)-func = ip_rcv,接收,IPv4,包,:,(Ip_input.c),ip_rcv,- NF_HOOK(PREROUTING),-ip_rcv_finish,- ip_route_input,- ip_route_input_cached,- ip_route_input_slow,- ip_mkroute_input,- _mkroute_input,dst-input = (ip_forward/ ip_local_deliver),dst-output = ip_output,- dst_input,- LOCAL_IN: dst-input = ip_local_deliver,- NF_HOOK(NF_INPUT),- ip_local_deliver_finish,- ipprot-handler(tcp, udp, icmp .),- FORWARD: dst-input = ip_forward,一 接收,2024/11/26,30,专业化、规范化、标准化、电子化,网络函数调用过程,int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev),struct iphdr *iph;,u32 len;,if (dev-nd_net != &init_net),goto drop;,if (skb-pkt_type = PACKET_OTHERHOST),goto drop;,IP_INC_STATS_BH(IPSTATS_MIB_INRECEIVES);,if (skb = skb_share_check(skb, GFP_ATOMIC) = NULL) ,IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS);,goto out;,if (!pskb_may_pull(skb, sizeof(struct iphdr),goto inhdr_error;,iph = ip_hdr(skb);,if (iph-ihl version != 4),goto inhdr_error;,if (!pskb_may_pull(skb, iph-ihl*4),goto inhdr_error;,iph = ip_hdr(skb);,if (unlikely(ip_fast_csum(u8 *)iph, iph-ihl),goto inhdr_error;,len = ntohs(iph-tot_len);,if (skb-len dst = NULL) ,int err = ip_route_input(skb, iph-daddr, iph-saddr, iph-tos,skb-dev);,if (unlikely(err) ,if (err = -EHOSTUNREACH),IP_INC_STATS_BH(IPSTATS_MIB_INADDRERRORS);,else if (err = -ENETUNREACH),IP_INC_STATS_BH(IPSTATS_MIB_INNOROUTES);,goto drop;,ip_rcv_finish,函数,2024/11/26,33,专业化、规范化、标准化、电子化,网络函数调用过程,#ifdef CONFIG_NET_CLS_ROUTE,if (unlikely(skb-dst-tclassid) ,struct ip_rt_acct *st = ip_rt_acct + 256*smp_processor_id();,u32 idx = skb-dst-tclassid;,stidx,stidx,st(idx16),st(idx16),#endif,if (iph-ihl 5 & ip_rcv_options(skb),goto drop;,rt = (struct rtable*)skb-dst;,if (rt-rt_type = RTN_MULTICAST),IP_INC_STATS_BH(IPSTATS_MIB_INMCASTPKTS);,else if (rt-rt_type = RTN_BROADCAST),IP_INC_STATS_BH(IPSTATS_MIB_INBCASTPKTS);,return dst_input(skb);,drop:,kfree_skb(skb);,return NET_RX_DROP;,ip_rcv_finish,函数,2024/11/26,34,专业化、规范化、标准化、电子化,(,ip_forward.c,)ip_forward - xfrm4_route_forward (net/xfrm.h, get xfrm_dst) - xfrm_route_forward - _xfrm_route_forward - xfrm_lookup - xfrm_find_bundle - afinfo-find_bundle = _xfrm4_find_bundle - xfrm_bundle_create - afinfo-bundle_create = _xfrm4_bundle_create tunnel mode - xfrm_dst_lookup - afinfo-dst_lookup = xfrm4_dst_lookup - _ip_route_output_key,/*,调用,ip_route_output_slow,函数创建路由*,/,- dst_list: dst-list=policy_bundles, policy-bundles = dst - NF_HOOK(NF_FORWARD) - ip_forward_finish - dst_output,二 转发,网络函数调用过程,2024/11/26,35,专业化、规范化、标准化、电子化,1,:icmp:icmp_send - ip_route_output_key,- ip_route_output_flow /*,调用,ip_route_output_flow,创建路由*,/,- icmp_push_reply - ip_append_data- skb_queue_walk - ip_push_appending_frames,三 输出,网络函数调用过程,2024/11/26,36,专业化、规范化、标准化、电子化,2,:tcp:tcp_connect - ip_route_connect - ip_route_output_flowtcp_sendmsg - _tcp_push_appending_frames - tcp_write_xmit - tcp_transmit_skb - net_xmit_eval - icsk-icsk_af_ops-queue_xmit = ipv4_specific-queue_xmit = ip_queue_xmit - tcp_push_one - tcp_transmit_skb - net_xmit_eval - icsk-icsk_af_ops-queue_xmit = ipv4_specific-queue_xmit = ip_queue_xmit,tcp,接收,tcp_protocol-handler = tcp_v4_rcv - _inet_lookup - xfrm_policy_check - tcp_v4_do_rcv - tcp_rcv_state_process - icsk-icsk_af_ops-conn_request = tcp_v4_conn_request - tcp_v4_send_synack,(,ip_output.c,),- ip_build_and_send_pkt - NF_HOOK( NF_OUTPUT ) - dst_output,三 输出,网络函数调用过程,2024/11/26,37,专业化、规范化、标准化、电子化,3,:udp:udp_sendmsg - ip_route_output_flow - ip_append_data - _skb_queue_tail( sk_write_queue ) - udp_push_pending_frames - ip_push_pending_frames,raw:raw_sendmsg - ip_route_output_flow - ip_append_data - _skb_queue_tail( sk_write_queue ) - ip_push_pending_frames,ip_push_pending_frames - _skb_dequeue(sk_write_queue) - NF_HOOK(NF_OUTPUT) - dst_output,三 输出,网络函数调用过程,2024/11/26,38,专业化、规范化、标准化、电子化,3,:udp:,ip_queue_xmit - ip_route_output_flow - xfrm_lookup - xfrm_find_bundle - bundle_create - afinfo-bundle_create = _xfrm4_bundle_create - xfrm_dst_lookup - afinfo-dst_lookup = xfrm4_dst_lookup - _ip_route_output_key - dst_list - dst-list=policy_bundles, policy-bundles = dst,- NF_HOOK(NF_OUTPUT) - dst_output - dst-output,三 输出,网络函数调用过程,2024/11/26,39,专业化、规范化、标准化、电子化,(Ip_output.c),dst_output: dst_list,循环,- dst-output = xfrm_dst-output = xfrm4_output = xfrm4_state_afinfo-output - NF_HOOK(POSTROUTING) - xfrm4_output_finish - gso :,- xfrm4_output_finish2 - xfrm4_output_one - mode-output - type-output - skb-dst=dst_pop(skb-dst) - nf_hook(NF_OUTPUT) - !dst-xfrm - dst_output - nf_hook(POSTROUTING) - dst-output = ip_output - NF_HOOK(POSTROUTING) - ip_finish_output - ip_finish_output2 - hh_output = dev_queue_xmit,四 发送,网络函数调用过程,2024/11/26,40,专业化、规范化、标准化、电子化,路由处理过程,在Linux中,从2.1版本的内核开始就实现了对基于策略的路由的支持,它是通过使用路由策略数据库(RPDB,routing policy database)替代传统的、基于目的地址的路由表来实现的。RPDB通过包含的一些规则和多张路由表来选定合适的IP路由。这些规则可能会包含很多各种不同类型的键值(key),因此这些规则没有默认的特定次序,规则查找次序或规则优先级都是由网络或系统管理员设定的。,Linux的RPDB是一个由数字优先级值进行排序的线性规则列表。RPDB能匹配数据报源地址、目的地址、TOS、进入接口和fwmark值等。每个路由策略规则由一个选择器和一个动作指示组成。RPDB按照优先级递增的顺序被扫描,RPDB包含的每条规则的选择器被应用于数据报的源地址、目的地址、进入接口、TOS和fwmark值。若数据报匹配该规则对应于该规则的动作被执行。若动作成功返回,则规则输出将是一个有效的路由或是路由查找失败指示;否则查找RPDB的下一条规则。规则的动作通常是查一张与之对应的路由表,但也可以是如下几种:,REJECT(丢弃),PROHIBIT或决UNRECHABLE(丢弃并向源地址发送ICMP包),,NAT(源地址网络地址转换)等。,路由表项的类型除了表示指出下一跳的相关信息外,还可以表示:BLACKHOLE(丢弃),PROHIBIT或UNREACHABL(丢弃并向源地址发送ICMP包),NAT(目的地址网络地址转换)等.,2024/11/26,41,专业化、规范化、标准化、电子化,路由策略图:,路由处理过程,由图中所示,系统默认已经实现了三个策略(本地策略、主策略和默认策略),与之对应的是三张默认路由表(本地路由表、主路由表和默认路由表),2024/11/26,42,专业化、规范化、标准化、电子化,路由部分总体结构图:,路由处理过程,2024/11/26,43,专业化、规范化、标准化、电子化,路由处理过程,内核路由部分代码实际上是ipv4协议栈的一部分,它被ip层的代码所调用。主要的调用时机有两个:一个是IP包输出时,需要确定由哪个端口出去;另一个是IP包输入时,需要确定是发给本机还是选择一个端口发送出去。,整个路由系统可以分成三部分:IP层调用接口,路由策略数据库,和前,底端接口。,1. IP层调用接口主要是提供一组调用接口给IP层代码,这些接口最终完成了整个的路由工作。为了提高效率,这部分代码维护了一个路由策略数据库的缓存或者叫cache,这部分代码另一个主要功能就是维护这个缓存了。这部分的代码主要在route.c文件中。,2. 路由策略数据库部分主要包括一个策略库和多张路由表,还有一些相关的操作它们的函数。当路由缓存没有命中的情况下,就要由这部分完成最后的查找工作。这部分的代码主要在fib_rules.c,fib_hash.c,fib_semantics.c中。,3. 前,底端接口部分主要是给用户提供的一些对路由策略数据库增删改的操作函数,对,/proc接口的实现,以及一些定时器的操作。这部分代码主要在fib_frontend.c中,还有一些分散在其它文件中。,2024/11/26,44,专业化、规范化、标准化、电子化,一 :,IP,层主要提供了两个供,IP,层调用的入口函数:,ip_route_input,函数和,ip_route_output,函数,一 :,IP,层入口函数:,IP层接到一个数据包以后,如果需要进行路由,就调用函数ip_route_input,ip_route_input,先,在缓存里寻找,如果失败则 ip_route_inpu,t,调用ip_route_input_slow, ip_route_input_slow里调用fib_lookup在路由表里寻找路由,如果命中,首先在缓存里添加这个路由,然后返回结果。,它的结果主要有两个:即如果是本地包则传给上层协议层,如果不是则选则一个出端口再发送出去。函数的参数有,5,个:,skb,表示,ip,包的缓冲区,,dst,目的地址,,src,源地址,,tos,表示,IP,包服务类型,,dev,表示入端口。函数返回值指示错误,如果成功查到路由,函数返回后,,skb-dst,会被赋值。,接收路由接口,ip_route_input,:,int,ip_route_input,( struct,sk_buff,* skb,u32,dst,u32,src,u8,tos, struct,net_device,*dev );,2024/11/26,45,专业化、规范化、标准化、电子化,IP层在发送数据时如果需要进行路由工作的时候,就会调用ip_route_output函数。这个函数在完成一些键值的简单转换以后,就会调ip_route_output_key函数,这个函数首先在缓存里寻找路由,如果失败就会调用 ip_route_output_slow,ip_route_output_slow里调用fib_lookup在路由表里寻找路由,如果命中,首先在 缓存里添加这个路由,然后返回结果。,它的结果只是为其选择一个下一跳以及出端口。参数也是,5,个:,rp,是个输出参数,返回时*,rp,指向一个返回的,rtable,结构的路由结点;,daddr,目的地址,,saddr,源地址,,tos,服务类型,,oif,出接口。,发送,路由接口,ip_route_output,:,int,ip_route_output,( struct,rtable,*rp,u32,daddr,u32,saddr,u32,tos, int oif ),一 :,IP,层入口函数:,2024/11/26,46,专业化、规范化、标准化、电子化,二,.,路由策略数据库部分结构 :,这一部分主要包括策略表及路由表的定义,以及查询等操作。,二,.,路由策略数据库部分结构,struct fib_rule,struct fib_rule *r_next;,atomic_t r_clntref;,u32 r_preference;,unsigned char r_table;,unsigned char r_action;,unsigned char r_dst_len;,unsigned char r_src_len;,u32 r_src;,u32 r_srcmask;,u32 r_dst;,u32 r_dstmask;,u32 r_srcmap;,u8 r_flags;,u8 r_tos;,int r_ifindex;,char r_ifnameIFNAMSIZ;,int r_dead;,;,1:,策略表,fib_rules,即是策略表,它是一个,fib_rule,结构,2024/11/26,47,专业化、规范化、标准化、电子化,整个策略表的结构如下图:,策略表是一个单链表,整个单链表按策略的优先级由高到低的顺序排列,表头指针即是,fib_rule,。每个策略是一个,fib_rule,结构。这个结构有几个重要的域:,r_preference,这个策略的优先级。,r_table,这个策略对应的路由表,它是路由表索引表,fib_tables,的一个索引值。,r_action,策略的动作,如单播,丢弃,,NAT,等。,r_src,r_srcmask,r_dst,r_dstmask,r_tos,等,策略的选择器,即描述什么样的,IP,包匹配这条策略,系统默认已经定义了三个策略,local_rule main_rule default_rule,二,.,路由策略数据库部分结构,2024/11/26,48,专业化、规范化、标准化、电子化,struct fib_table ,unsigned char tb_id;,unsigned tb_stamp;,int (*tb_lookup)(struct fib_table *tb, const struct rt_key *key, struct fib_result *res);,int (*tb_insert)();,int (*tb_delete)();,int (*tb_dump)();,int (*tb_flush)(struct fib_table *table);,int (*tb_get_info)();,void (*tb_select_default)();,unsigned char tb_data0;,;,2:,路由表,它是一个,fib_table,结构 ,定义如下:,fib_table ,是系统中所有路由表的索引数组。,fib_table,结构只是一个路由表结构中最上层的一个结构,它下面还很多的层次 。,二,.,路由策略数据库部分结构,2024/11/26,49,专业化、规范化、标准化、电子化,这部分的处理函数中最为重要的就是对路由策略数据库的查找函数fib_lookup,以及对单个路由表进行查找的fn_hash_lookup函数。,fib_lookup的定义:,int fib_lookup(const struct rt_key *key, struct fib_result *res)这个函数的工作就是对整个路由策略数据库进行查找,它会在需要的时候调用fn_hash_lookup,查找特定的路由表。函数有两个参数,key是查找的关键字,它与路由缓存查找时的key是一致的。res是输出参数,函数返回后如果成功则在res存入查找结果。,函数的返回值用来指示错误,3: 处理函数,它是一个,fib_table,结构 ,定义如下:,二,.,路由策略数据库部分结构,2024/11/26,50,专业化、规范化、标准化、电子化,三 :接口部分结构,这一部分主要实现以下几个功能:,1,对路由表,策略表进行增加项,删除项,创建表,表空路由缓存等操作。,2,为路由策略数据库,路由缓存提供,/proc
展开阅读全文