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