如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第8章IP:网际协议8.1引言本章我们介绍IP分组的结构和基本的IP处理过程,包括输入、转发和输出。假定读者熟悉IP协议的基本操作,其他IP的背景知识见卷1的第3、9和12章。RFC791[Postel1981a]是IP的官方规范,RFC1122[Braden1989a]中有RFC791的说明。第9章将讨论选项的处理,第10章讨论分片和重装。图8-1显示了IP层常见的组织形式。运输协议网络接口网络图8-1IP层的处理在第4章中,我们看到网络接口如何把到达的IP分组放到IP输入队列ipintrq中去,并如何调用一个软件中断。因为硬件中断的优先级比软件中断的要高,所以在发生一次软件中断之前,有的分组可能会被放到队列中。在软件中断处理中,ipintr函数不断从ipintrq中移走和处理分组,直到队列为空。在最终的目的地,IP把分组重装为数据报,并通过函数调用把该数据报直接传给适当的运输层协议。如果分组没有到达最后的目的地,并且如果主机被配置成一个路由器,则IP把分组传给ip_forward。传输协议和ip_forward把要输出的分组传给ip_output,由ip_output完成IP首部、选择输出接口以及在必要时对分组分片。最终的分组被传给合适的网络接口输出函数。当产生差错时,IP丢弃该分组,并在某些条件下向分组的源站发出一个差错报文。这些报文是ICMP(第11章)的一部分。Net/3通过调用icmp_error发出ICMP差错报文,icmp_error接收一个mbuf,其中包含差错分组、发现的差错类型以及一个选项码,提供依赖于差错类型的附加信息。本章我们讨论IP为什么以及何时发送ICMP报文,至于有关ICMP本身的详细讨论将在第11章进行。8.2代码介绍本章讨论两个头文件和三个C文件。如图8-2所示。文件描述net/route.hinput.c路由入口netinet/ip.hIP首部结构netinet/ip_IP输入处理netinet/ip_output.cIP输出处理netinet/ip_cksum.cInternet检验和算法图8-2本章描述的文件?全局变量在IP处理代码中出现了几个全局变量,见图8-3。变量数据类型描述in_ifaddrstructin_ifaddrip_defttlintIP分组的默认TTLip_idint赋给输出的IP分组的上一个IDip_protoxint[]IP分组的分路矩阵ipforwardingint系统是否转发IP分组?ipforward_rtstructroute大多数最近转发的路由的缓存ipintrqstructifqueueIP输入队列ipqmaxlenintIP输入队列的最大长度ipsendredirectsint系统是否发送ICMP重定向?ipstatstructipstatIP统计图8-3本章中引入的全局变量?统计量IP收集的所有统计量都放在图8-4描述的ipstat结构中。图8-5显示了由netstat-s命令得到的一些统计输出样本。统计是在主机启动30天后收集的。ipstat成员描述SNMP使用的ips_badhlenIP首部长度无效的分组数?ips_badlenIP首部和IP数据长度不一致的分组数?ips_badoptions在选项处理中发现差错的分组数?ips_badsum检验和差错的分组数?ips_badversIP版本不是4的分组数?ips_cantforward目的站不可到达的分组数?ips_delivered向高层交付的数据报数?图8-4本章收集的统计ipstat成员描述SNMP使用的ips_forward转发的分组数?ips_fragdropped分片丢失数(副本或空间不足)?ips_fragments收到分片数?ips_fragtimeout超时的分片数?ips_noproto具有未知或不支持的协议的分组数?ips_reassembled重装的数据报数?ips_tooshort具有无效数据长度的分组数?ips_toosmall无法包含IP分组的太小的