




已阅读5页,还剩64页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019/7/13,1,专业化、规范化、标准化、电子化,数据在IP网络中的传输过程,编制人:彭远大 版本:v1.0,有计划、有总结、有记录、有审核;,2019/7/13,2,专业化、规范化、标准化、电子化,课程定位与目标,讲义适用于测试储干 学习后,掌握互联网络的基础知识,数据包在经过各种网络设备时的处理方式和过程,快速定位问题 自学建议:tcp/ip协议详解 卷1,2019/7/13,3,专业化、规范化、标准化、电子化,5,4,3,2,1,目录,TCP四层模型,互联网服务,数据包的生成,数据包的传输,数据包的接收,6,接收后数据包的处理,2019/7/13,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(网络新闻传输协议)等,2019/7/13,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服务器,一 互联网服务简示图,2019/7/13,6,专业化、规范化、标准化、电子化,IP包的生成,一个数据包的生成到接收大致会经过以下几个过程 发送端: 应用程序-操作系统(TCP/IP协议践)-网卡驱动程序处理-网卡发送 到达目的地后各以相反的次序处理 接收端: 网卡接收-网卡驱动程序处理-操作系统(TCP/IP协议践)-应用程序 IP包的生成由应用层 传输层 网络层完成,2019/7/13,7,专业化、规范化、标准化、电子化,IP包的生成,IP首部报文格式,2019/7/13,8,专业化、规范化、标准化、电子化,IP包的生成,IP首部,2019/7/13,9,专业化、规范化、标准化、电子化,IP包的生成,一个简单的应用程序sockt调用发送一个IP数据包过程 #include #include #include #include #include #include #include #include #include #define MAXBUF 1024,2019/7/13,10,专业化、规范化、标准化、电子化,IP包的生成,int main(int argc, char *argv) int sockfd; struct sockaddr_in dest; char buf14; if (sockfd = socket(AF_INET, SOCK_STREAM, 0) 0) perror(“Socket“); exit(errno); bzero( ,2019/7/13,11,专业化、规范化、标准化、电子化,IP包的生成,IP包头中各个字段是如何确定的? 其中最重要的系统是如何确定IP包的源IP地址,目的IP地址,以及如何进行选路? 一般应用程序给出目的IP地址和目的端口,比如在浏览器里输入“”,此时确定了要访问的是的80端口 还需要确定源IP地址和源端口,2019/7/13,12,专业化、规范化、标准化、电子化,IP包的生成,下图为Linux系统下路由表,源IP地址,2019/7/13,13,专业化、规范化、标准化、电子化,寻路,我们把寻路按TCP/IP模型分为二层寻路和三层寻路 二层(数据链路层) 在数据链路层,传输的是数据帧,他以48bit的MAC地址来表示源地址(网卡的MAC地址)和目的地址(下一跳设备的网卡的MAC地址) 注意:二层目的地址(即下一跳设备的网卡的MAC地址)可能只是一个中转设备地址而不是数据的最终目的地,2019/7/13,14,专业化、规范化、标准化、电子化,寻路,2.三层(网络层) 在网络层,传输的是数据包,他以32bit的IP地址来表示源地址和目的地址 注意:三层的目的IP地址是数据包传送的最终目的地,2019/7/13,15,专业化、规范化、标准化、电子化,寻路,应用程序把必要的信息传递给操作系统后(调用socket),系统协议践还要做一大堆工作,我们看一下其中一些必要的工作: 一.IP层寻找路由 根据数据包要到达的目的IP地址来查找路由表,通过查找路由表确定数据包要传送到的下一跳IP地址(即通过那一个设备能够把数据包传送到目的地),2019/7/13,16,专业化、规范化、标准化、电子化,寻路,二.数据链路层寻址 通过IP层寻址找到要传送到的下一跳IP地址后,数据链路层要找到这个IP地址相对应的MAC地址,因为在以太网上传输的是数据帧,而数据帧是以MAC地址来表示源地址和目的地址。 寻找IP地址相对应的MAC地址,此时会用到一个协议 即ARP协议(Address Resolution Protocol 地址解析协议),负责将某个IP地址解析成对应的MAC地址,2019/7/13,17,专业化、规范化、标准化、电子化,寻路,下图描述了ARP协议工作过程,当主机A要和主机B通信(如主机A Ping主机B)时。主机A会先检查其ARP缓存内是否有主机B的MAC地址。如果没有,主机A会发送一个ARP请求广播包,此包内包含着其欲与之通信的主机的IP地址,也就是主机B的IP地址。当主机B收到此广播后,会将自己的MAC地址利用ARP响应包传给主机A,并更新自己的ARP缓存,也就是同时将主机A的IP地址/MAC地址对保存起来,以供后面使用。主机A在得到主机B的MAC地址后就可以与主机B通信了。同时,主机A也将主机B的IP地址/MAC地址对保存在自己的ARP缓存内。,2019/7/13,18,专业化、规范化、标准化、电子化,寻路,ARP请求报文格式,黄色的部分是以太网(这里是Ethernet II类型)的帧头部。其中,第一个字段是广播类型的MAC地址:0XFF-FF-FF-FF-FF-FF,其目标是网络上的所有主机。第二个字段是源MAC地址,即请求地址解析的主机MAC地址。第三个字段是协议类型,这里用0X0806代表封装的上层协议是ARP协议 接下来是ARP协议报文部分。其中各个字段的含义如下: 硬件类型:表明ARP实现在何种类型的网络上。 协议类型:代表解析协议(上层协议)。这里,一般是0800,即IP。 硬件地址长度:MAC地址长度,此处为6个字节。 协议地址长度:IP地址长度,此处为4个字节。 操作类型:代表ARP数据包类型。0表示ARP请求数据包,1表示ARP应答数据包。 源MAC地址:发送端MAC地址。 源IP地址:代表发送端协议地址(IP地址)。 目标MAC地址:目的端MAC地址(待填充)。 目标IP地址:代表目的端协议地址(IP地址)。,2019/7/13,19,专业化、规范化、标准化、电子化,寻路,三.网卡选择及MTU(最大传输单元) 一台主机可能配置有多个网卡,选择哪一个网卡来发送数据是根据IP选路来确定的,即能够直接到达下一跳设备的网卡(一般来说是配置了与下一跳IP地址在同一网段的网卡,这也是为什么同一台主机的多个网卡不允许配置多个在同一网段的IP地址,这样系统就不知道应该从哪块网卡发送数据) 每块网卡都有自己的MTU值,确定了发送的网卡就可以通过MTU值来计算一个IP包最大能带多少数据(数据大小=MTU-IP包头-上层协议(tcp udp icmp等)包头),2019/7/13,20,专业化、规范化、标准化、电子化,寻路,必要的信息都收集好了,系统可以开始构建数据发送了 先看一看主机路由表信息 执行ping 34 发送ICMP包到主机34,2019/7/13,21,专业化、规范化、标准化、电子化,寻路,使用Wireshark抓包,源主机MAC地址,目的地址_广播地址,的MAC地址,源主机MAC地址,Ping request包,下一跳路由器的MAC地址,源主机IP地址,目的IP地址,2019/7/13,22,专业化、规范化、标准化、电子化,路由选择与iptables 链表,Netfilter介绍,netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加、编辑和删除规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的 链(chain)中。 netfilter/iptables IP 信息包过滤系统实际上由两个组件 netfilter和 iptables 组成。netfilter 组件也称为 内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。 iptables 组件是一种工具,也称为 用户空间(userspace),它使插入、修改和删除信息包过滤表中的规则变得容易。 通过使用用户空间,可以构建自己的定制规则,这些规则存储在内核空间的信息包过滤表中。这些规则具有 目标,它们告诉内核对来自某些源、前往某些目的地或具有某些协议类型的信息包做些什么。如果某个信息包与规则匹配,那么使用目标 ACCEPT 允许该信息包通过。还可以使用目标 DROP 或 REJECT 来阻塞并杀死信息包。对于可对信息包执行的其它操作,还有许多其它目标。,2019/7/13,23,专业化、规范化、标准化、电子化,Netfilter过程,根据规则所处理的信息包的类型,可以将规则分组在链中。处理入站信息包的规则被添加到 INPUT 链中。处理出站信息包的规则被添加到 OUTPUT 链中。处理正在转发的信息包的规则被添加到 FORWARD 链中。这三个链是基本信息包过滤表中内置的缺省主链。另外,还有其它许多可用的链的类型(如 PREROUTING 和 POSTROUTING ),以及提供用户定义的链。每个链都可以有一个 策略,它定义“缺省目标”,也就是要执行的缺省操作,当信息包与链中的任何规则都不匹配时,执行此操作。 建立规则并将链放在适当的位置之后,就可以开始进行真正的信息包过滤工作了。这时内核空间从用户空间接管工作。当信息包到达防火墙时,内核先检查信息包的头信息,尤其是信息包的目的地。我们将这个过程称为 路由。 如果信息包源自外界并前往系统,而且防火墙是打开的,那么内核将它传递到内核空间信息包过滤表的 INPUT 链。如果信息包源自系统内部或系统所连接的内部网上的其它源,并且此信息包要前往另一个外部系统,那么信息包被传递到 OUTPUT 链。类似的,源自外部系统并前往外部系统的信息包被传递到 FORWARD 链。,路由选择与iptables 链表,2019/7/13,24,专业化、规范化、标准化、电子化,在目前内核版本中已内建了三个iptables表:filter、nat和mangle,绝大部分报文处理功能都可以通过在这些内建(built-in)的表格中填入规则完成: Filter:该模块的功能是过滤报文,不作任何修改,或者接受,或者拒绝。它在NF_IP_LOCAL_IN、NF_IP_FORWARD和NF_IP_LOCAL_OUT三处注册了钩子函数,也就是说,所有报文都将经过filter模块的处理。 Nat:网络地址转换(Network Address Translation),该模块以Connection Tracking模块为基础,仅对每个连接的第一个报文进行匹配和处理,然后交由Connection Tracking模块将处理结果应用到该连接之后的所有报文。nat在NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING注册了钩子函数,如果需要,nat仅对报文头的地址信息进行修改,而不修改报文内容,按所修改的部分,nat可分为源NAT(SNAT)和目的NAT(DNAT)两类,前者修改第一个报文的源地址部分,而后者则修改第一个报文的目的地址部分。SNAT可用来实现IP伪装(通过路由器上网),而DNAT则是透明代理的实现基础(端口映射 DMZ)。 Mangle: 属于可以进行报文内容修改的IP Tables,可供修改的报文内容包括MARK、TOS、TTL等,mangle表的操作函数嵌入在Netfilter的NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT两处。,路由选择与iptables 链表,2019/7/13,25,专业化、规范化、标准化、电子化,Netfilter流程图,路由选择与iptables 链表,2019/7/13,26,专业化、规范化、标准化、电子化,Netfilter结构,路由选择与iptables 链表,Netfilter是嵌入内核IP协议栈的一系列调用入口,设置在报文处理的路径上。网络报文按照来源和去向,可以分为三类:流入的、流经的和流出的,其中流入和流经的报文需要经过路由才能区分,而流经和流出的报文则需要经过投递,此外,流经的报文还有一个FORWARD的过程,即从一个接口转到另一个接口。Netfilter就是根据网络报文的流向,在以下几个点插入处理过程: NF_IP_PRE_ROUTING,在报文作路由以前执行; NF_IP_FORWARD,在报文转向另一个NIC以前执行; NF_IP_POST_ROUTING,在报文流出以前执行; NF_IP_LOCAL_IN,在流入本地的报文作路由以后执行; NF_IP_LOCAL_OUT,在本地报文做流出路由前执行。,2019/7/13,27,专业化、规范化、标准化、电子化,如下图所示:,Netfilter框架为多种协议提供了一套类似的钩子(HOOK)。每个希望嵌入Netfilter中的模块都可以为多个协议族的多个调用点注册多个钩子函数(HOOK),这些钩子函数将形成一条函数指针链,每次协议栈代码执行到NF_HOOK()函数时(有多次),都会依次启动所有这些函数,处理参数所指定的协议栈内容。 每个注册的钩子函数经过处理后都将返回下列值之一,告知Netfilter核心代码处理结果,以便对报文采取相应的动作: NF_ACCEPT:继续正常的报文处理; NF_DROP:将报文丢弃; NF_STOLEN:由钩子函数处理了该报文,不要再继续传送; NF_QUEUE:将报文入队,通常交由用户程序处理; NF_REPEAT:再次调用该钩子函数。,路由选择与iptables 链表,2019/7/13,28,专业化、规范化、标准化、电子化,netfilter在协议流程中加入的钩子函数 :,net/ipv4/ip_input.c 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 ,路由选择与iptables 链表,2019/7/13,29,专业化、规范化、标准化、电子化,Linux- 网络函数调用过程,网络函数调用过程,接收以太帧(驱动程序): 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,一 接收,2019/7/13,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 != ,ip_rcv函数,2019/7/13,31,专业化、规范化、标准化、电子化,网络函数调用过程,if (pskb_trim_rcsum(skb, len) IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS); goto drop; /* Remove any debris in the socket control block */ memset(IPCB(skb), 0, sizeof(struct inet_skb_parm); return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); inhdr_error: IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS); drop: kfree_skb(skb); out: return NET_RX_DROP; ,ip_rcv函数,2019/7/13,32,专业化、规范化、标准化、电子化,网络函数调用过程,static int ip_rcv_finish(struct sk_buff *skb) const struct iphdr *iph = ip_hdr(skb); struct rtable *rt; /* * Initialise the virtual path cache for the packet. It describes * how the packet travels inside Linux networking. */ if (skb-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函数,2019/7/13,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 ,ip_rcv_finish函数,2019/7/13,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,二 转发,网络函数调用过程,2019/7/13,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,三 输出,网络函数调用过程,2019/7/13,36,专业化、规范化、标准化、电子化,2:tcp: tcp_connect - ip_route_connect - ip_route_output_flow tcp_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_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,三 输出,网络函数调用过程,2019/7/13,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,三 输出,网络函数调用过程,2019/7/13,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,三 输出,网络函数调用过程,2019/7/13,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,四 发送,网络函数调用过程,2019/7/13,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(目的地址网络地址转换)等.,2019/7/13,41,专业化、规范化、标准化、电子化,路由策略图:,路由处理过程,由图中所示,系统默认已经实现了三个策略(本地策略、主策略和默认策略),与之对应的是三张默认路由表(本地路由表、主路由表和默认路由表),2019/7/13,42,专业化、规范化、标准化、电子化,路由部分总体结构图:,路由处理过程,2019/7/13,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中,还有一些分散在其它文件中。,2019/7/13,44,专业化、规范化、标准化、电子化,一 :IP 层主要提供了两个供IP层调用的入口函数: ip_route_input函数和ip_route_output函数,一 :IP 层入口函数:,IP层接到一个数据包以后,如果需要进行路由,就调用函数ip_route_input,ip_route_input先在缓存里寻找,如果失败则 ip_route_input调用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 );,2019/7/13,45,专业化、规范化、标准化、电子化,IP层在发送数据时如果需要进行路由工作的时候,就会调用ip_route_out函数。这个函数在完成一些键值的简单转换以后,就会调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 层入口函数:,2019/7/13,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结构,2019/7/13,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,二 .路由策略数据库部分结构,2019/7/13,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结构只是一个路由表结构中最上层的一个结构,它下面还很多的层次 。,二 .路由策略数据库部分结构,2019/7/13,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结构 ,定义如下:,二 .路由策略数据库部分结构,2019/7/13,50,专业化、规范化、标准化、电子化,三 :接口部分结构,这一部分主要实现以下几个功能: 1对路由表,策略表进行增加项,删除项,创建表,表空路由缓存等操作。 2为路由策略数据库,路由缓存提供/proc接口。 3设置定时器,以定时对路由缓存进行清理工作。,三 :接口部分结构 :,2019/7/13,51,专业化、规范化、标准化、电子化,IP层会在输入和输出两个时候去调用路由函数(ip_route_input/ip_route_output)。下面分析一下IP包输入时的路由流程,如下图 :,四 :主要路由流程,2019/7/13,52,专业化、规范化、标准化、电子化,IP协议层的ip_rcv接收函数调用ip_rcv_finish函数。 在这个函数,它调用路由代码的IP接口函数ip_route_input进行路由。传递给路由代码的参数有5个: skb IP包缓冲区,iph-daddr IP包的目的地址,iph-saddr IP包源地址,iph-tos 服务类型,dev 输入的网络设备。 当这个ip_route_input函数返回时,意味着路由工作已经结束,如果返回值是0,那么就说明已经成功找到了路由。路由查询结果放在在skb-dst,它指向的就是查到的路由缓存中的一个结点。下边通过调用skb-dst-input(skb)就可以对这个IP进行处理了。这个input是路由缓存结点中的一个函数指针,如果这个路由项表示转发的,那么这个指针实际上指向的是ip_forward,而如果是传送给本地的,那么指向的是ip_local_deliver。ip_local_deliver会将这个IP包进一步传给上层协议层处理,ip_forward则会再将这个IP包从网络设备发送出去。,四 :主要路由流程,2019/7/13,53,专业化、规范化、标准化、电子化,/net/ipv4/route.c是Linux 路由的核心源代码,里面主要包含了对路由的初始化,以及查找路由,路由cache中的垃圾回收,创建路由等等。 ip_route_input函数:,路由函数调用过程,int ip_route_input(struct sk_buff *skb, _be32 daddr, _be32 saddr, u8 tos, struct net_device *dev) struct rtable * rth; unsigned hash; int iif = dev-ifindex; struct net *net; /*返回dev所对应的struct net指针*/ net = dev_net(dev); if (!rt_caching(net) goto skip_cache; tos /*计算哈希值*/,2019/7/13,54,专业化、规范化、标准化、电子化,/在路由缓存中查找对应的路由*/ rcu_read_lock(); for (rth = rcu_dereference(rt_hash_tablehash.chain); rth; rth = rcu_dereference(rth-u.dst.rt_next) /* 只有这五个量
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 系统构建中的项目管理技巧考察试题及答案
- 法律实践中的有效沟通试题及答案
- 企业融资策略与风险管理的结合试题及答案
- 校招:管理培训生笔试题目及答案
- 小米软件开发面试题及答案
- 2025年软件技术员试题与答案的持续更新
- 新版统编语文一年级上册第五单元大单元教学设计示例
- 消防作业测试题及答案解析
- 法学概论考前复习试题及答案
- 法学概论学习中的心理调节技巧试题及答案
- 心理危机干预培训课件
- 2023年心血管内科学考博真题
- 保温杯生产工艺流程
- GB/T 6482-2007凿岩用螺纹连接钎杆
- 理正深基坑算例
- 公司休假销假单模板
- 《基于杜邦分析法的企业财务分析国内外文献综述》
- 全国高中数学联赛广东省预赛试题及解答
- DB33T 2226-2019 空气负(氧)离子观测与评价技术规范-纯图
- 高中政治教学的经验分享课件
- 办公室事故防范(典型案例分析)
评论
0/150
提交评论