
数据在IP网络中的传输过程.ppt
69页数据在IP网络中的传输过程编制人:彭远大版本:v1.0有计划、有总结、有记录、有审核;Date1专业化、规范化、标准化、电子化课程定位与目标• 讲义适用于测试储干 • 学习后,掌握互联网络的基础知识,数据包在经过 各种网络设备时的处理方式和过程,快速定位问题 • 自学建议:tcp/ip协议详解 卷1Date2专业化、规范化、标准化、电子化5 4 3 2 1目录TCP四层模型互联网服务数据包的生成数据包的传输数据包的接收6接收后数据包的处理Date3专业化、规范化、标准化、电子化一 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(网络新闻传输协议)等Date4专业化、规范化、标准化、电子化PC1PC2PC3PC4电信DNS Server网通DNS Server根DNS Server根DNS Server中国网通国际互联网中国电信PC 163 proxy服务器163 proxy服务器ADSL modemADSL modemR8G3124FF1008F1008G1024163 proxy服务器一 互联网服务简示图Date5专业化、规范化、标准化、电子化IP包的生成• 一个数据包的生成到接收大致会经过以下几个过程 • 发送端: • 应用程序-》操作系统(TCP/IP协议践)-》网卡驱动程 序处理-》网卡发送• 到达目的地后各以相反的次序处理 • 接收端: • 网卡接收-》网卡驱动程序处理-》操作系统(TCP/IP协 议践)-》应用程序• IP包的生成由应用层 传输层 网络层完成Date6专业化、规范化、标准化、电子化IP包的生成• IP首部报文格式Date7专业化、规范化、标准化、电子化IP包的生成• IP首部Date8专业化、规范化、标准化、电子化IP包的生成•一个简单的应用程序sockt调用发送一个IP数据包过程•#include •#include •#include •#include •#include •#include •#include •#include •#include •#define MAXBUF 1024Date9专业化、规范化、标准化、电子化IP包的生成•int main(int argc, char **argv) •{ •int sockfd; •struct sockaddr_in dest; •char buf[14]; •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 链表Date28专业化、规范化、标准化、电子化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_inputdst->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一 接收Date29专业化、规范化、标准化、电子化网络函数调用过程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 != 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 ihl*4)) goto inhdr_error;ip_rcv函数Date30专业化、规范化、标准化、电子化网络函数调用过程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函数Date31专业化、规范化、标准化、电子化网络函数调用过程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函数Date32专业化、规范化、标准化、电子化网络函数调用过程#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; st[idx st[idx st[(idx>>16) st[(idx>>16) 。












