手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>操作系统>Linux>列表

Linux 核心--11.网络

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!