10.5.4 数据分块
每个网络设备都有一个包大小的最大值,发送或接收数据包不能比这一值大。IP协议允许将数据分成更小单元以便网络设备能处理。IP协议头有分块字段,它里面包含了一个标志和分割偏移量。
当IP包准备要传输时,IP找到网络设备来将IP包发送出去。这个设备是从IP路由表中找到的。每一 device 结构中有一项 mtu ,用来描述最大传输单元(以字节为单位)。如果设备的 mtu 比要传输的IP包的包大小要小,则IP包必须被分割成更小的单元。每一单元用一个 sk_buff 结构来表征;它的IP头会被做上标记以标识它是一个分块了的包,其中还包含分割偏移量。最后一个包被标识为最后IP单元。如果在分块过程中,IP不能分配 sk_buff ,则传输失败。
接收IP分块单元要比发送它们要麻烦一些,因为这些IP单元可能以任何顺序到达,必须所有的单元都接收 到了以后才能重新将它们组装起来。每接收一个IP包都要检查其是否是IP分割单元。在第一个IP分割单元到达 时,IP会建立一个新的 ipq 结构,这一结构与用于IP单元重组的 ipqueue 列表相连。当接收到更多的IP单元时,先找到正确的 ipq 结构,并为每个单元新建立一个 ipfrag 结构。每个 ipq 结构唯一地描述一个接收IP分割单元的,包括它的源和目的IP地址,上层协议标识和本IP帧的标识。当接收到所有的IP分割单元后,将它们重新组成一个 sk_buff ,然后交给上层协议处理。每个 ipq 中包含一个定时器,它在每接收到一个合法的单元后重新时。如果定时器到时, ipq 结构和它的一些 ipfrag 结构将被丢弃,传送的信息则被假定为丢失。然后提交给层协议来重传该信息。
10.6 地址解析协议 (ARP)
地址解析协议担当了一个把IP地址翻译成物理硬件地址如以太网地址的角色。IP在将数据(以 sk_buff 的形式)通过设备驱动传送时需要这一转换。
它执行各种检查,来看是否这一设备需要硬件头,是否需要重建包的硬件头。Linux缓存了硬件头,这样可以避频繁重建。如果需要重建硬件头,则调用设备指定的硬件头重建例程。所有的以太网设备使用相同的头重例程,这些例程将目的IP地址转换成物理地址。
ARP协议本身是很简单的,它包括两个消息类型,ARP请求与ARP应答。ARP请求包含了需要解析的IP地址,ARP应答(希望它)包含被解析的IP地址,硬件地址。ARP请求向连接在网络上的所有主机广播,因此,对于以网,所有连在网上的机器都能看到ARP请求。拥有ARP请求中的IP地址的机器将发出包含了它自己的物理地址ARP应答。
ARP协议在Linux中是围绕 arp_table 结构表来建立的,每个结构描述一个IP到物理地址的转换。这些表项 在需要进行IP地址解析时生成,在随时间变旧时被删除。每个 arp_table 结构有如下字段:
last used 本ARP项最近一次使用的时间
last updated 本ARP项最近一次更新的时间
flags 描述本项的状态,如是否完成等
IP address 本项描述的IP地址
hardware address 要解析的硬件地址
hardware header 指向缓存硬件头的指针
timer 是个 timer_list 项,用于ARP请求没有响应时的超时
retries ARP请求重试的次数
sk_buff queue 等待IP地址解析的sk_buff项列表
ARP表包括了指向 arp_table 链的指针( arp_table 向量)。缓存这些表项可以加速对它们的访问,每个表项用IP地址的最后两个字节来生成索引,然后就可以查找表链以找到正确的表项。Linux也以 hh_cache 结构的形式来缓存 arp_table 项的预建的硬件头。
请求一个IP地址解析并且没有相应的 arp_table 项时,ARP必须发送一个ARP请求。它在表和sk_buff队列中 生成一个新的 arp_table 项, sk_buff 包含了需要进行地址解析的网络包。发送ARP请求时运行ARP定时器。如果没有响应,ARP将重试几次,如果仍然没有响应,ARP将删除该 arp_table 项。同时会通知队列中等待IP地址解析的 sk_buff 结构,传送它们的上层协议将处理这一失败。UDP不关心丢包,而TCP则会建立TCP连接进行重传。如果IP地址的所有者返回了它的硬件地址,则 arp_table 项被标记为完成,队列中的sk_buff将被删除,传输动作继续。硬件地址被写到每个sk_buff的硬件头中。
ARP协议层必须响应ARP请求。它注册它的协议类型(ETH_P_ARP),生成一个 packet_type 结构。这表示它将检查网络设备收到的所有ARP包。与ARP应答一样,这包括ARP请求。用保存在接收设备的 device 结构中的硬件地址来生成ARP应答。
网络拓扑结构会随时间改变,IP地址会被重新分配不同的硬件地址。例如,一些拨号服务为每一次新建的连接分配一个IP地址。为了使ARP表包含这些数据项,ARP运行一个周期性的定时器,用来查看所有的 arp_table 项中哪一个超时。要注意不要移除包含一个或多个缓存硬件头的项。移除这些项是很危险的,因为其它的数据结构要用到它们。一些 arp_table 项被标记为永久的,它们不会被释放。ARP表不能太大;每个 arp_table 项会消耗一些核心内存。要分配一个新的表项而ARP表的大小已经到达它的最大值时,就要查找并删除最老的表项。
10.7 IP 路由
IP路由函数决定了将预定的有指定IP地址的IP包送到哪。在传送IP包时有很多种选择。能最终到达目标吗?如果能,要用到哪个网络设备呢?如果有多于一个的网络设备可被使用,哪一个是较好的呢?IP路由数据库里存的信息给出了这些问题的答案。有两个数据库,最重要的一个是Forwarding Information Database。这是一个有关已知的目的IP和它们的最佳路由的祥细列表,route cache则用来快速找到目的IP的路由。和其它的缓一样,它包含的只是常用的路由;它的内容来自Forwarding Information Database。
通过IOCTL请求可将路由加入到BSD socket接口或从中删除。这些是通过协议来实现的。INET协议层只允许 处理有超级用户权限的IP路由的添加与删除。这些路由可以是固定的,也可以随时间而动态改变。大多数系统使用固定路由。路由器运行路由协议,路由协议持续地检查所有已知目的IP的可得到的路由。没有路由器的系统是端系统。路由协议是作为一个守护进程来实现的,如GATED,它们也用IOCTL来向BSD socket接口添加和删除路由。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



