⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000011.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 4 页
字号:
顺序到达,必须所有的单元都接收到了以后才能重新将它们组装起来。每接&nbsp;<BR>收一个IP包都要检查其是否是IP分割单元。在第一个IP分割单元到达时,IP&nbsp;<BR>会建立一个新的&nbsp;ipq&nbsp;结构,这一结构与用于IP单元重组的&nbsp;ipqueue列表相连。&nbsp;<BR>当接收到更多的IP单元时,先找到正确的&nbsp;ipq结构,并为每个单元新建立一个&nbsp;<BR>ipfrag&nbsp;结构。每个&nbsp;ipq结构唯一地描述一个接收IP分割单元的,包括它的源&nbsp;<BR>和目的IP地址,上层协议标识和本IP帧的标识。当接收到所有的IP分割单元后,&nbsp;<BR>将它们重新组成一个sk_buff&nbsp;,然后交给上层协议处理。每个&nbsp;ipq中包含一个&nbsp;<BR>定时器,它在每接收到一个合法的单元后重新时。如果定时器到时,ipq&nbsp;结构&nbsp;<BR>和它的一些&nbsp;ipfrag结构将被丢弃,传送的信息则被假定为丢失。然后提交给&nbsp;<BR>层协议来重传该信息。&nbsp;<BR>&nbsp;<BR>10.6&nbsp;&nbsp;地址解析协议&nbsp;(ARP)&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;地址解析协议担当了一个把IP地址翻译成物理硬件地址如以太网地址的角&nbsp;<BR>色。IP在将数据(以sk_buff&nbsp;的形式)通过设备驱动传送时需要这一转换。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;它执行各种检查,来看是否这一设备需要硬件头,是否需要重建包的硬件&nbsp;<BR>头。Linux缓存了硬件头,这样可以避频繁重建。如果需要重建硬件头,则调用&nbsp;<BR>设备指定的硬件头重建例程。所有的以太网设备使用相同的头重例程,这些例&nbsp;<BR>程将目的IP地址转换成物理地址。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ARP协议本身是很简单的,它包括两个消息类型,ARP请求与ARP应答。ARP&nbsp;<BR>请求包含了需要解析的IP地址,ARP应答(希望它)包含被解析的IP地址,硬件&nbsp;<BR>地址。ARP请求向连接在网络上的所有主机广播,因此,对于以网,所有连在网&nbsp;<BR>上的机器都能看到ARP请求。拥有ARP请求中的IP地址的机器将发出包含了它自己&nbsp;<BR>的物理地址ARP应答。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ARP协议在Linux中是围绕&nbsp;arp_table结构表来建立的,每个结构描述一个&nbsp;<BR>IP到物理地址的转换。这些表项在需要进行IP地址解析时生成,在随时间变旧&nbsp;<BR>时被删除。每个&nbsp;arp_table结构有如下字段:&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;last&nbsp;used&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本ARP项最近一次使用的时间&nbsp;<BR>&nbsp;last&nbsp;updated&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本ARP项最近一次更新的时间&nbsp;<BR>&nbsp;flags&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述本项的状态,如是否完成等&nbsp;<BR>&nbsp;IP&nbsp;address&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本项描述的IP地址&nbsp;<BR>&nbsp;hardware&nbsp;address&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要解析的硬件地址&nbsp;<BR>&nbsp;hardware&nbsp;header&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指向缓存硬件头的指针&nbsp;<BR>&nbsp;timer&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是个&nbsp;timer_list&nbsp;项,用于ARP请求没有响应时的超时&nbsp;<BR>&nbsp;retries&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ARP请求重试的次数&nbsp;<BR>&nbsp;sk_buff&nbsp;queue&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等待IP地址解析的sk_buff项列表&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ARP表包括了指向&nbsp;arp_table&nbsp;链的指针(&nbsp;arp_table向量)。缓存这&nbsp;<BR>些表项可以加速对它们的访问,每个表项用IP地址的最后两个字节来生成&nbsp;<BR>索引,然后就可以查找表链以找到正确的表项。Linux也以hh_cache&nbsp;结构&nbsp;<BR>的形式来缓存&nbsp;arp_table&nbsp;项的预建的硬件头。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;请求一个IP地址解析并且没有相应的&nbsp;arp_table项时,ARP必须发送&nbsp;<BR>一个ARP请求。它在表和sk_buff队列中&nbsp;生成一个新的arp_table&nbsp;项,&nbsp;<BR>sk_buff包含了需要进行地址解析的网络包。发送ARP请求时运行ARP定时器。&nbsp;<BR>如果没有响应,ARP将重试几次,如果仍然没有响应,ARP将删除该arp_table&nbsp;<BR>项。同时会通知队列中等待IP地址解析的&nbsp;sk_buff结构,传送它们的上层协&nbsp;<BR>议将处理这一失败。UDP不关心丢包,而TCP则会建立TCP连接进行重传。如&nbsp;<BR>果IP地址的所有者返回了它的硬件地址,则arp_table项被标记为完成,队&nbsp;<BR>列中的sk_buff将被删除,传输动作继续。硬件地址被写到每个sk_buff的硬&nbsp;<BR>件头中。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ARP协议层必须响应ARP请求。它注册它的协议类型(ETH_P_ARP),生成&nbsp;<BR>一个packet_type结构。这表示它将检查网络设备收到的所有ARP包。与ARP&nbsp;<BR>应答一样,这包括ARP请求。用保存在接收设备的device&nbsp;结构中的硬件地址&nbsp;<BR>来生成ARP应答。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;网络拓扑结构会随时间改变,IP地址会被重新分配不同的硬件地址。例&nbsp;<BR>如,一些拨号服务为每一次新建的连接分配一个IP地址。为了使ARP表包含这&nbsp;<BR>些数据项,ARP运行一个周期性的定时器,用来查看所有的arp_table项中哪一&nbsp;<BR>个超时。要注意不要移除包含一个或多个缓存硬件头的项。移除这些项是很危&nbsp;<BR>险的,因为其它的数据结构要用到它们。一些arp_table&nbsp;项被标记为永久的,&nbsp;<BR>它们不会被释放。ARP表不能太大;每个arp_table项会消耗一些核心内存。要&nbsp;<BR>分配一个新的表项而ARP表的大小已经到达它的最大值时,就要查找并删除最老&nbsp;<BR>的表项。&nbsp;<BR>&nbsp;<BR>10.7&nbsp;&nbsp;IP&nbsp;路由&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;IP路由函数决定了将预定的有指定IP地址的IP包送到哪。在传送IP包时&nbsp;<BR>有很多种选择。能最终到达目标吗?如果能,要用到哪个网络设备呢?如果&nbsp;<BR>有多于一个的网络设备可被使用,哪一个是较好的呢?IP路由数据库里存的&nbsp;<BR>信息给出了这些问题的答案。有两个数据库,最重要的一个是Forwarding&nbsp;<BR>Information&nbsp;Database。这是一个有关已知的目的IP和它们的最佳路由的祥&nbsp;<BR>细列表,route&nbsp;cache则用来快速找到目的IP的路由。和其它的缓一样,它包&nbsp;<BR>含的只是常用的路由;它的内容来自Forwarding&nbsp;Information&nbsp;Database。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;通过IOCTL请求可将路由加入到BSD&nbsp;socket接口或从中删除。这些是通&nbsp;<BR>过协议来实现的。INET协议层只允许处理有超级用户权限的IP路由的添加与&nbsp;<BR>删除。这些路由可以是固定的,也可以随时间而动态改变。大多数系统使用&nbsp;<BR>固定路由。路由器运行路由协议,路由协议持续地检查所有已知目的IP的可&nbsp;<BR>得到的路由。没有路由器的系统是端系统。路由协议是作为一个守护进程来&nbsp;<BR>实现的,如GATED,它们也用IOCTL来向BSDsocket接口添加和删除路由。&nbsp;<BR>&nbsp;<BR>10.7.1&nbsp;&nbsp;路由缓存&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;无论什么时候查找IP路由,首先都要在路由缓存中检查是否有匹配的路&nbsp;<BR>由。如果路由缓存里没有匹配的路由,则要从Forwarding&nbsp;Information&nbsp;Database&nbsp;<BR>中查找路由。如果那里也没有找到路由,则IP包发送失败并通知应用程序。如&nbsp;<BR>果在路由缓存中没有而在Forwarding&nbsp;Information&nbsp;Database中找到路由,则&nbsp;<BR>会为些路由生成一个新项,并添加到路由缓存中。路由缓存是一个表&nbsp;<BR>(ip_rt_hash_table),它包括指向rtable数据结构链的指针。hash函数利用IP&nbsp;<BR>地址中最小最重要的两个字节来从路由表中进行索引。这两个字节是在目的与&nbsp;<BR>提供的最佳hash值间是不同的。第个rtable项包含路由信息,目的IP地址,用&nbsp;<BR>于到达那个IP地址的网络设备,信息大小的最大值等等。它还有一个reference&nbsp;<BR>count,一个usage&nbsp;count和一个最近一次被用的时间信息(在&nbsp;jiffies里)。&nbsp;<BR>reference&nbsp;count在每次路由后增加,用于显示该次路由的网络连接数。它在应&nbsp;<BR>用程序停止使用路由时减小。useage&nbsp;count在每次查找路由时增加,用于将&nbsp;rtable&nbsp;<BR>项在它的hash链中排序。路由缓存中的对于所有项的最后被用时间信息将被周&nbsp;<BR>期性地检查,以确定是否rtable已经旧了。如果某一路由最近没有被使用,则从&nbsp;<BR>路由缓存中将之丢弃。由于路由缓存中的路由在有序的,所以常用的路由会排在&nbsp;<BR>hash链的前面。这意味着能更快地找到这些路由。&nbsp;<BR>&nbsp;<BR>10.7.2&nbsp;&nbsp;The&nbsp;Forwarding&nbsp;Information&nbsp;Database&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Forwarding&nbsp;Information&nbsp;Database包含对当前系统当前时间可得到的IP路&nbsp;<BR>由。它是一个很复杂的数据结构,尽管进行了合理有效的安排,它仍然不是一个&nbsp;<BR>快速的数据库。特别是要在这个数据库中为每一要传送的IP包查找目的地时将会&nbsp;<BR>非常慢。这就是要用路由缓存的原因:可以用已知的好的路由来加速IP包的传送。&nbsp;<BR>路由缓存中的路由来源于Forwarding&nbsp;Information&nbsp;Database。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;每个IP子网用一个&nbsp;fib_zone&nbsp;结构来描述。&nbsp;fib_zonehash表指向着这些&nbsp;<BR>结构。hash索引来源于IP子网掩码。所有通向同一子网的路由由fib_node&nbsp;和&nbsp;<BR>fib_info&nbsp;结构来描述,这两结构在每个&nbsp;fib_zone&nbsp;结构的fz_list中排队。如&nbsp;<BR>果这个子网中的路由数增大,则生成一个hash表,以使查找fib_node&nbsp;结构更&nbsp;<BR>加容易。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;通向同一子网可以有多个路由,这些路由可能通过多个网关中的一个。IP&nbsp;<BR>路由层不允许用同一个网关对一个子网有多于一个的路由。换言之,如果通向&nbsp;<BR>同一子网有多个路由,则每个路由要保证使用一个不同的网关。与每个路由相&nbsp;<BR>关的有一个metric&nbsp;结构。它用来测量该路由有多优。一个路由的&nbsp;metric&nbsp;<BR>实质上是它在到达目的子网前所经过的IP子网数。&nbsp;metric&nbsp;越大,路由越差。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;<BR>--&nbsp;<BR>※&nbsp;来源:·BBS&nbsp;水木清华站&nbsp;bbs.net.tsinghua.edu.cn·[FROM:&nbsp;202.114.2.2]&nbsp;<BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -