




已阅读5页,还剩108页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网际协议与选路 第二讲 第5章IP 软件总体结构第6章IP 选路表与选路算法第7章IP 分片与重组 2020 3 19 2020 3 19 第5章IP 软件的总体结构 5 1引言本章所关心的是实现网际协议 IP 的软件的组织结构 IP提供的功能看似简单 但它的纷繁难懂使软件的实现过程变得复杂 而其精细微妙之处又使软件很难做到准确无误 在讲解IP的过程中 为了不至于因突然涉及所有部分而使人无法接受 我们将具体实现方案分3章讨论 本章给出了数据结构并描述软件的整体结构 还讨论了IP软件的理论性操作以及通过IP层的数据报流程 在稍后的章节中 还要详述选路和差错处理的细节 展示IP软件中的各段程序代码是如何使用这些数据结构的 2020 3 19 5 2中心环节 单从主机的角度来看 人们会很自然地将IP软件分为两个不同的部分考虑 一部分处理输入 另一部分处理输出 输入部分使用IP首部中的PROTO字段来决定应该由上层协议中的哪个模块来接收传入数据报 输出部分使用一张本地选路表来选择外发数据报要送往的下一跳 它使得IP和上层协议软件之间的沟通变得十分笨拙 另外 网关中的选路过程要比主机中的更复杂 由于一个网关必须将发送来的数据报继续转送到它的下一跳 所以网关中的软件都不能轻易地被划分成输入和输出部分 这样 在IP处理传入数据报时可能会产生输出数据 而当发送来的数据报引起错误时 网关还必须生成ICMP差错信息 这更进一步地使输入和输出的界限模糊 2020 3 19 5 3lP软件设计思想 为保持IP软件的简单性和统一性 在范例中采用的组织结构上的技巧有 统一的输入队列及统一的选路过程 独立的IP进程 本地主机接口 虽然建立网关的必要性引发了许多的设计思想 但针对网关的设计在主机上同样有效 并允许在主机和网关上使用同样的程序 2020 3 19 5 4IP软件结构和数据报流程 5 4 1选择传入数据报的策略在第3章中曾提到过 每个网络接口 包括伪网络接口 都有属于自己的 送往IP进程的数据报队列 图5 1描画出该数据流 如果有多个数据报正在输入队列中等待 IP进程必须选取其中之一 并为其选择路由 IP选取哪一个数据报将决定系统的行为 挑选数据报并为其选择路由的IP程序段实现了一个重要策略 它决定了数据报来源的相对优先级 2020 3 19 5 4 1选择传入数据报的策略 正确的做法是公平分配优先权 使传入和外发数据流在选择路由时享有平等的优先权 我们的实现策略是以循环法 round robin 来选择数据报 以期达到公平合理 也就是说 它从某个队列中选择出一个数据报 并为其做路由处理之后 继续向前移动并检查下一个队列 如果有K个含有数据报的队列正在等待着路由处理 那么IP在处理完所有K个队列中的第一个数据报之后 才有可能处理到任一队列中的第二个数据报 过程ipgetp实现了循环法选择的策略 2020 3 19 5 4 1选择传入数据报的策略 正如程序代码所示 静态变量ifnext用作接口数组的索引 它遍历整个网络接口结构 在每个接口中 它检查状态变量ni state 以确定接口是否已被打开 当ipgetp发现一个打开的接口中有正在等待的数据报时 它就使用宏NIGET来提取并返回第一个数据报 再次调用ipgetp时 将跨过前一次处理的接口 继续查找 2020 3 19 5 4 2允许IP进程被阻塞 过程ipgetp包含了一种微妙的优化思想 如果所有输入队列都空 IP进程在调用过程ipgetp时被阻塞 一旦有一个数据报到达 IP进程就恢复执行并立刻检查已有数据报到达的那个接口 首先 当与某个特定接口相关联的设备驱动程序在它的输入队列中放入一个数据报时 就向IP进程发送一个报文 其次 ipgetp中的循环语句以调用receive结束 在ipgetp遍历了所有网络接口而没有发现任何数据报之后 它调用receive receive在信息到达之前为阻塞状态 当ipgetp返回时 它以函数值的形式向主调过程传送一个报文 报文中包含了一个指针 指向已有数据报到达的接口 ipgetp将该接口指针赋值给ifnext 并重新开始遍历 2020 3 19 5 4 2允许IP进程被阻塞 既然已经知道了IP所使用的选择数据报的策略 那么来查看一下IP进程的结构 其基本算法非常简单 IP不断地调用ipgetp来选择一个数据报 接着调用一个过程来计算下一跳的地址 并将数据报置入与将要发送该数据报的网络接口相关联的队列中 尽管从概念上看似简单 但许多细节问题使程序代码复杂化 例如 如果数据报来自于某个网络 IP必须验证此数据报的校验和是否正确 如果选路表中没有指定的目的站 IP必须生成一个ICMP 目的站不可达 报文 如果选路表指出该数据报应当被送往产生这个数据报的网络中的某个目的站 IP必须生成一个ICMP 重定向 报文 最后 IP必须处理定向广播这一特殊情况 此时IP向指定的网络发送数据报的副本 并向网关自身的上层协议软件也发送一份副本 IP进程从过程ipproc的执行开始 2020 3 19 5 4 3IP使用的常量的定义 在文件ip h中定义了IP软件使用的符号常量 另外 它还用结构IP定义了IP数据报的格式 2020 3 19 5 4 4校验和的计算 ipproc利用过程cksum来计算或验证数据报的首部校验和 首部校验和将首部视为16位整数的序列 并把校验和定义为对首都中所有16位整数各求反码 并将结果相加 再对求得的和计算一次二进制反码 得到的和数及反码定义为使用二进制反码算法 大多数设备使用二进制补码算法 因此仅累加得出一个16位的校验和并不能得到正确的结果 为了便于移植并避免以汇编语言编写程序 过程cksum使用了c语言编写 在范例中使用了32位 长整型 算法来累加得到一个和 然后通过向这个整数和中增加所有进位位的办法 将结果折合成一个16位的值 最后 cksum返回结果的反码 2020 3 19 5 4 5处理定向广播 只要一个数据报发送到定向广播地址 则在指定的目的网络中的所有机器都必须接收到一份副本 关键是要记住 定向广播包括了目的网络上的网关和主机 即便是负责在网络上继续向前发送该数据报的网关也不能例外 然而 大多数网络硬件不会将广播分组的副本再次传送回发出这个广播的机器 如果一个网关需要一份广播数据报的副本 那么软件必须采取明确的措施 以保留一份副本 因此 如果一个网关接收到的数据报的目的地址是直接与这个网关相连的某个网络的定向广播地址 那么这个网关必须做两件事 1 为本机的协议软件复制一份数据报 2 在指定的网络上广播该数据报 2020 3 19 5 4 5处理定向广播 ipproc为所有的数据报调用ipdbc 其中绝大多数并没有指定要定向广播 ipdbc一开始就检查数据报来源 因为如果该数据报是由本地机器生成的 则不需要复制 然后ipdbc调用isbrc 将数据报的目的地址与这个网关直接相连接的所有网络的定向广播地址相比较 如果均不相同 则说明这是一个非广播数据报 而非广播数据报也不需要复制 在不需要复制的情况下 ipdbc不采取任何行动 直接返回 ipproc将像平常那样选择一个路由并继续向前发送该数据报 如果数据报的目的地址是某个直接与网关相连的网络上的定向广播地址 它必须被复制 其中一份副本送往本地机器软件 另 份以正常方式继续转发 为了复制数据报 ipdbc根据数据报的大小从标准网络缓冲池或大缓冲池中分配一个缓冲区 如果缓冲区分配成功 ipdbc将数据报复制到新缓冲区中 并把新缓冲区放入输出端口 此端口与发送数据报时经过的网络接口相关联 当ipdbc返回后 ipproc将副本原件通过伪网络接口传递给本地机器 2020 3 19 5 4 6识别一个广播地址 IP协议标准规定了三种类型的广播地址 本地网络广播地址 全 1 定向网络广播地址 主机地址段为全 1 的A B C三级IP地址 以及一个子网广播地址 主机地址段为全 1 的子网IP地址 遗憾的是 当Berkeley将TCP IP合并入BSDUNIX时 他们决定使用非标准广播地址 有时称为Berkeley广播 这些广播的格式在应该是全 1 的地方使用了全 0 表示 尽管BerkeIey格式的广播地址肯定是非标准的 但许多从Berkeley程序代码中衍生出来的商用体系已经采纳了这种格式 为了与广泛使用的Berkeley规范兼容 我们的范例代码接收使用全 0 或全 1 两种格式的广播 此程序代码段包含在过程isbrc中 2020 3 19 5 5lP首部中的字节顺序 为了使网际协议独立于运行它的机器 协议标准为首部中所有整型值规定了网络字节顺序在发送一个数据报之前 主机必须将所有整型值从本机字节顺序转换成标准网络字节顺序 而当接收到一个数据报之后 主机必须将这些整型值从标准网络字节顺序转换成本机字节顺序 过程iph2net和iPnet2h执行这一转换任务 ipnet2h在ipproc中被调用 而iph2net在ipfsend ipproc和ipputp中被调用 实用程序使用函数net2hs 从网络到主机短整型 和hs2net 从主机短整型到网络 为每个字段进行转换 为了优化处理时间 在我们的程序代码中 所有IP地址以网络字节顺序保存 并且不转换协议首都中的地址字段 这样 这段程序代码只需转换不含IP地址的整型字段 2020 3 19 5 6向lP发送数据报 5 6 1发送本地生成的数据报给出一个本地生成的数据报和一个IP目的地址 过程ipsend填写IP首部并将数据报放入本机接口的队列中 IP进程将从这个队列中取出并发送数据报 ipsend填写首部中的每个字段 包括指定的目的地址 为了保证每个外发数据报中标识字段都有唯一的值 ipsend将全局变量ipackid的值赋予该标识字段 然后递增变量ipackid ipsend完成填写首部的任务之后 调用enq把数据报置入本地主机 伪网络 接口的队列中 注意 虽然网络接口的ni ipinq队列在正常情况下包含的是传入数据报 也就是来自其他网点的数据报 但从应用软件的角度看 伪网络接口的队列中包含的是 外发 的数据报 最后 在IP进程因等待数据报的到达而处于阻塞状态的情况下 ipsend调用send向IP进程发送一个报文 2020 3 19 5 6 2发送传入数据报 当一个经由网络发送来的数据报到达时 网络接口层的设备驱动程序必须将其放置在适当的IP队列中 它调用ip in完成这项工作 给出 个指向分组缓冲区的指针 ip in调用enq将分组置入接口的队列中 如果队列已满 ip in递增变量IplnDiscards的值 以记录下这个队列的溢出差错 并丢弃分组 最后 在IP进程被阻塞并等待接收数据报的情况下 ip in向IP进程发送一个报文 2020 3 19 5 7表格的维护 IP软件需要一个时钟机制 用于维护网络数据结构 包括IP选路表和分片重装表 在我们的范例中 使用一个单一的定时器进程来完成这种周期性任务 事实上 定时器进程并不仅用于IP任务中 它还触发ARP高速缓存的超时 并且可被用于其他任何没有严格时延要求的长时间的周期性任务中 在过程slowtimer中的程序代码段 体现了如何轻易地将新任务加入列表中 正如程序代码所示 slowtimer由 个无限循环构成 它重复不断地唤醒一组维护过程 一个特定的维护过程可能花费相当长的时间来完成它的任务 而且一次唤醒与下一次唤醒之间的执行时间也可能不一样长 因此slowtimer计算两次执行之间的实际时延 并将其作为参数递给维护过程 2020 3 19 5 8小结 为简化程序代码 IP作为唯一的 独立的进程执行 并通过一个伪网络接口与本机的高层协议软件交互作用 在没有数据报时 IP进程被阻塞 一旦从任何地方发来一个或多个数据报后 IP进程被唤醒 并处理这些数据报 直至为它们选择路由为止 为了使处理过程公平合理 并避免出现 饥饿状态 我们在范例中对所有输入数据源 包括对应于本机的伪网络接口 采用了循环法策略 这样不论是本地产生的通信量 还是来自网络连接的传入通信量都没有优先权 2020 3 19 5 8小结 定向广播是指将数据报发送到特定网络的所有主机和网关上 协议标准允许设计者自己决定是否继续向前传送由其他网络产生的定向广播 如果网关选择了允许定向广播 它正常地为这些定向广播选择路由 如果目的地址给出了一个直接与网关相连的网络 IP必须保证本机的上层协议软件接收到一份数据报的副本 为了提高它的实用性 在实现范例中 既可使用TCP IP标准 全 1 也可使用BSDUNIX格式 全 0 的广播地址 它复制广播数据报 并安排网络接口发送副本 而原数据报经过选路 被发往本机的协议软件 IP校验和由16位二进制反码组成 其值可用32位二进制补码及进位传递来计算 2020 3 19 第6章IP 选路表和选路算法 2020 3 19 6 1引言 前 章描述了网际协议 IP 软件的总体结构 并提供了其关键过程ipproc的程序代码 本章将提供选择路由的细节 继续讨论IP 本章详细描述IP选路表的结构 以及实现选路表的数据结构 还讨论了路由算法 并叙述了IP在选择路由时如何使用子网掩码 最后 它叙述了IP是如何区分网络路由 子网路由以及主机路由的 2020 3 19 6 2路由维护和查找 选路软件在理论上可划分为两组 其中一组由那些用来为数据报选择正确路由的过程组成 另一组由增加 改变或删除路由的过程组成 因为网关必须为自己所处理的每个数据报判定路由 所以路由查找程序代码决定了网关的整体性能 因此 通常将查找程序代码优化 以期达到最高速度 路内的插入 改变或删除的速率通常比为数据报选择路由的速率要低得多 计算新路由的程序需要与其他设备通信以建立其可达性 它们可以在重定向之前花任意长的时间 因此 路由更新过程不需要像查找操作那样被优化 其基本观点是 应当选择能使查找路由花费最小的IP数据结构和算法 维护路由的花费则并不那么重要 2020 3 19 6 2路由维护和查找 虽然在早期的TCP IP软件中 选路表的查找经常采用线性查找 但现在大多数系统利用 张散列表 使之能够快速查找任意大小的选路表 我们的软件采用了桶散列 buckethashing 结构 它将选路表的入口划分成许多 散列表元 并利用一个散列函数迅速找到正确的散列表元 2020 3 19 6 3选路表结构 2020 3 19 6 3选路表结构 保存路由的主要数据结构是数组 数组的每个元素对应一个散列表元 并包含一个指针 指向被装入这个散列表元中的通往目的站的路由记录链表 表中每个记录包含一个IP目的地址 子网掩码 下 跳地址 用于向下一跳地址发送数据的网络接口 以及其他在路由管理中使用的信息 由于IP预先并不知道子网掩码 因此它仅使用IP目的地址的网络部分计算散列函数 然而当IP在一个链表中查找表项时 使用的是完整的目的地址来进行比较 2020 3 19 6 4选路表数据结构 除route结构外 文件route h中还定义了选路表rttable 如图6 1所示 rttable是指向route结构的指针数组 除选路表之外 IP还需要其他几个数据项 它们保存在全局结构rtinfo中 例如 系统提供唯一的 默认路由 任何不在选路表中的目的站都可使用 字段ri default指向一个route结构 在这个route结构中包含的是默认路由的下一跳地址 在字段ri valid中是一个布尔变量 如果此路由的数据结构已被初始化 则它的值为TRUE 2020 3 19 6 5路由的生成源及保持时间 选路表中的信息有几个来源 通常 当系统启动时 初始化程序从备份存储器中获得一组初始路由 并将它们安装到选路表中 在执行过程中 传入的报文会导致ICMP或选路协议软件改变现有的路由或建立新路由 最后 网络管理员也可以增加路由或重定向 选路表项的易失性与它的来源有关 例如 初始路由被认为是简单估计的 只要有其他地方发来的路由信息 它就应该被替换 然而 网络管理员必须能够推翻任何路由并建立不可变的永久性路由 以使他们能够排除网络中的路由问题 而无需路由协议的干涉 为了适应路由的灵活性 每个选路表项中的rt ttl 寿命 字段指出此表项还能保持多长时间有效 以秒为单位计算 当rt ttl值达到0时 路由失效并被丢弃 由选路协议建立的路由 其寿命根据协议规则计算得到 而管理员能够建立寿命无限长的路由 以保证它们不会被删除 2020 3 19 6 6为数据报选择路由 6 6 1实用过程一些实用过程提供了选择路由时用到的功能 过程netnum利用地址类别确定在地址字段中哪些八位组包含的是网络部分 哪些八位组是主机部分 从而提取出IP地址中的网络部分 它返回给出的地址 但这时其主机地址字节为全 0 2020 3 19 6 6 1实用过程 在为数据报选择路由时 IP使用过程netmatch 将目的 主机 地址与选路表项中的地址进行比较 选路表项中包含了子网掩码和给定网络的IP地址 netmatch使用子网掩码来屏蔽目的地址中的主机位 并将结果与表项中的网络地址相比较 如果它们相符 netmatch返回TURE 否则返回FALSE 广播是一种特殊情况 因为要采取何种动作取决于数据报的来源 来自网络接口的广播数据报必须经过伪网络接口发送给本地机器 而本地生成的广播数据报必须被发送到适当的网络接口 为了区分这两种情况 软件使用了 个特定主机路由 全 1 的掩码 为来自网络的广播数据报选择路由 并用特定网络路由 掩码仅屏蔽网络部分 为向外发送的广播选择路由 这样netmatch明确地判定一个广播数据报的来源 并使用IP源地址来决定此广播是否与给定路由相符 2020 3 19 6 6 1实用过程 要为一个数据报选择路由 IP必须光查看它是否认识该数据报目的地址的有效子网掩码 要做到这一点 IP调用过程netmask netmask把IP目的地址当作参数 然后检查几种情况 根据约定 如果目的地址为全 0 则意味着使用默认路由 因此netmask返回全 0 的子网掩码 对其他类型的目地站 netmask调用netnum从目的地址中提取出网络部分 然后检查每个与本机直接连接的网络 如果有任何与本地直接连接的网络地址与目的地址的网络部分相符 netmask从和此网络相关的网络接口结构中提取出子网掩码 然后将其返回调用者 最后 如果IP找不到有关这个目的地址的子网掩码的信息 它就根据地址的类别是A B还是C来设置屏蔽地址网络部分的子网掩码 2020 3 19 6 6 1实用过程 选路函数调用实用过程rthash计算目的地网络地址的散列值 散列函数是一个简单有效的计算函数 对于A B或C类的地址 rthash将网络地址的每个八位组相加 所得的和除以散列表长度 最后返回余数 对于D类的地址 rthash将网络地址的前4位比特数乘以16 所得的值除以散列表长度 最后返回余数 2020 3 19 6 6 2获得一个路由 对每一个路由表项 rtget调用netmatch 检查其入口参数给出的目的地址是否能与表项中的地址匹配 如果在查找中没有发现精确的匹配 rtget使用Route ri valid中默认的路由 当然 也可能出现既没有精确匹配 也没有默认路由的情况 因此 当完成路由查找工作后 rtget还必须继续检查它找到的是否是一个有效指针 如果是有效指针 rtget在返回调用者之前 要给路由表项中的引用计数值和使用计数值字段加1 维护软件利用引用计数字段来决定如果删除与该路由相关的存储区是否安全 只要调用rtget的过程还需要这个路由表项 该表项的引用计数值就不为0 使用计数字段提供了管理网络的一种手段 用以掌握每个表项在数据报选择路由时使用的频繁程度 2020 3 19 6 6 3数据结构初始化 过程rtinit初始化选路表和默认路由 生成互斥信号量 为路由链表中的结点分配存储区并将存储区链接成一个空闲列表 其实现方案很简单 2020 3 19 6 7选路表的定期维护 系统定期发起清理选路表的行动 它递减选路表中所有表项的寿命字段位 如果某个寿命字段超时 则丢弃对应的路由 过程rttimer用来实现这项定期性的表项更新任务 定时进程大约每秒调用一次rttiemr 利用参数delta 提供上次调用与这次调用之间的间隔时间 在等待互斥信号量之后 rttiemr循环遍历选路表 对每个表项来说 它遍历并查看各个路由链表 对正常的路由 rttiemr递减寿命字段计数值 如果计时值为0 从链表中删除该结点 然而 如果网关运行RIP 则rttiemr将超时路由标记为费用无穷大 这样它就无法将其作为数据报的有效路由 同时又使这些超时路由在表中短暂地保留一段时间 最后 rttiemr递减默认路由中的寿命计数值 2020 3 19 6 7 1增加路由 网络管理软件和选路信息协议都可调用那些用来增加 删除或重定向的函数 例如向表中增加一个新路由 rtadd调用过程rtnew来分配一个新结点 并初始化它的各个字段 然后rtadd将默认路由当作特殊情况对待 对于非默认的路由 rtadd利用rthash计算新路由在路由表中的索引值 并遍历该表项中的路由链表 一旦它在链表中找到新路由应该被插入的地方 就查看链表是否包含一个具有相同目的站的已有路由 如果有 rtadd比较旧路由和新路由的度量 是否新路由更好 如果不是 就丢弃新路由 最后 rtadd或者在链表中插入一个新结点 或者将信息复制到具有同样地址的已有结点中 过程rtnew分配并初始化一个新路由表项 它调用getbuf来为新结点分配存储区 然后填写首部信息 2020 3 19 6 7 2删除路由 过程rtdel以一个目的地址作为入口参数 并通过从选路表中移走结点来删除路由 象通常那样 程序代码查看并以特殊情况对待默认路由 如果没有找到匹配表项 rtdel计算目的地址的散列值 并在路由链表中搜索 一旦它找到正确的路由 rtdel将该结点从链表中删除 并利用宏RTFREE来递减引用计数值 回想一下 如果引用计数值达到0 RTFREE就将该结点返回空闲结点表 如果引用计数值仍为正值 表示肯定还有其他一个或几个进程正在使用该结点 只有当最后一个进程将引用计数值减至0时 此结点才被释放回空闲结点表 宏RTFREE假设正在执行中的进程已经获得了单独访问选路表的权力 因此它可在诸如rtdel之类的过程中被使用 任意 个需要递减选路表中引用计数值的过程部可以调用过程rtfree 当rtfree被唤醒后 首先它等待互斥信号量 然后唤醒宏RTFREE 最后释放信号量 2020 3 19 6 8IP选项处理 IP支持一组选项 用来控制IP如何处理主机和网关中的数据报 为了使例程代码简洁易懂 我们决定忽略对选项的处理 虽然如此 我们还是在程序代码中包括了两个实例程序的框架 用于搜寻IP首部中的选项 网关调用过程ipdoopts 它仅仅返回调用者 使得网关在发送数据报时 并没有对选项做任何处理 主机调用过程ipdstopts来处理到达主机的数据报的选项 虽然我们在过程中并没有真正实现选项的处理 但它分析了IP首部中选项长度八位组的信息 并将选项字段从IP首部中删除 2020 3 19 6 9小结 IP选路表是一个至关重要的数据结构 当为数据报选择路由时 IP进程利用该选路表 在表中查找指向数据报目的站的下一跳路由 由于路由查找的频繁使用 因此选路表在其组织结构上尽量考虑提高查找的效率 同时 掌握新的路由信息的高层协议软件还要在选路表中插入 删除或更改路由 本章详述了负责选路表的查找和维护的过程 从中可了解到选路表怎样利用桶散列结构提高效率的 还可以了解到当进程正在删除路由时引用计数器怎样允许另一进程继续使用该路由 2020 3 19 第7章IP 分片与重组 2020 3 19 7 1引言 本章详述将外发数据报进行分片以及将传入数据报进行重组的软件 由于最终目的站需要把分片的数据报重新组装起来 因此每个应用TCP IP的计算机必须具有负责重组的程序代码 否则 它就不能与互联网上所有的计算机通信 协议标准规定 任何实现IP的程序都必须能够将数据报分片及重组 事实上 任何网关若连接两个以上且具有不同MTU大小的网络 则经常需要将数据报分片传输 由于设计良好的应用软件会主动生成足够小的 能够直接通过网络传输的数据报 因此主机并不需要经常执行分片任务 2020 3 19 7 2数据报的分片 数据报的分片发生在IP为数据报选择路由之后 以及将其置入一个与指定的网络接口相关联的队列之前的这段时间里 IP把数据报长度与网络的MTU相比较 以确定是否有必要将其分片 在最简单的情况下 整个数据报可以被封装成 个网络分组或帧 因而无需分片 对需要分片的情况 IP首先生成多个数据报 并将每个数据报中的分片比特置为1 然后将源数据报中的数据按顺序分片 并将它们装入这些数据报中 它还要在向一源数据报产生的所有数据报片中将MF比特置为1 末尾的分片除外 IP 边为数据报分片 一边将它们传递给网络接口发送出去 2020 3 19 7 2 1为一个数据报片再次分片 如果被分片的数据报本身就是一个数据报片 分片处理会变得复杂一些 当一个数据报通过两个或更多的网关时 可能会出现这种情况 如果某一个网关为源数据报分片 分片后的数据报可能还是太大 以致无法通过沿途经过的下个网络 因此 个网关可能会接收到需要再次分片的数据报片 为数据报分片和为数据报片再次分片之间的细微差别就在于网关处理MF比特的不同 当一个网关为原来未分片的数据报分片时 除了末尾的数据报片 它将其余所有分片上的MF比特都置为1 类似地 如果一个数据报片上的MF比特并未置为1 则网关会和处理原来未分片的数据报完全一样地处理这个数据报片 除末尾的分片外 将每个子分片的MF比特置为1 然而 当网关为一个非末尾的数据报片再次分片时 它会把生成的所有 子 分片中的MF比特全部置为1 因为所有这些子分片都不可能是整个数据报的末尾数据报片 2020 3 19 7 3分片的实现 ipputp的入口参数 接口号 下一跳以及一个分组 如果仅用一个分组无法发送该数据报 那么ipputp将数据报顺序划分为能够装入分组中的数据报片 为了做到这一点 ipputp计算分片的最大可能长度 然后将数据报顺序划分为一连串最大长度的数据报片 最后剩余的数据被装入末尾数据报片 一旦ipputp计算出了最大分片长度 它遍历整个数据报 并调用iPfsend 发送每个数据报片 在程序代码中包含了几个微妙的地方 首先 每个数据报片必须含有一个IP首都 因此 次可发送的最大数据量等于MTU减去IP首部的长度 然后截短成为最接近的8的倍数 其次 仅当数据报中剩余的数据大于一次可发送的最大数据量时 发送动作才会继续进行 因此 在发送末尾数据报片之前 如果末尾数据报片的长度与其他数据报片的长度相同 则不会发送最后这个数据报片 第三 发送末尾数据报片时 ipputp仅对源数据报做适当更改 而不再把生成的数据报片复制到一个新缓冲区中 第四 通常末尾数据报片中的MF比特值为0 然而 当网关为一个非末尾的数据报片再次分片时 它必须设置所有子分片的MF比特为1 2020 3 19 7 3 1发送一个数据报片 过程ipfsend生成并发送一个数据报片 它首先为副本数据分配一个新缓冲区 调用ipfhcopy将IP首部和选项复制到新缓冲区中 形成新数据报 然后将作为此数据报片的数据复制到新数据报中 并将结果传递给netwrite 2020 3 19 7 3 2复制数据报首部 过程ipfhcopy用于复制数据报首部 大多数程序代码要考虑到IP选项的细节 根据协议标准 某些选项只应当出现在第一个数据报片中 而其他一些则必须出现在所有的数据报片中 ipfhcopy遍历选项宇段 并查看是否应该将某个选项复制到所有分片中 最后 当ipfhcopy返回后 ipfsend调用netwrite来发送这个数据报片 2020 3 19 7 4数据报的重组 重组数据报时 要求接收方的IP在能够重组完整的数据报之前 不断累积传入的数据报片 一旦重组成功 IP为数据报选择路由 继续送往目的站 因为IP并不保证顺序交付 协议要求IP能够接受顺序混乱的或延迟的数据报片 此外 在某个数据报的各个分片陆续到达期间 也可能混杂着其他数据报的分片 2020 3 19 7 4 1数据结构 为了使数据报的重组效率更高 用于保存数据报片的数据结构必须能够做到 为构成某个特定数据报的一组数据报片快速定位 在一组数据报片中快速插入新的数据报片 有效地判断一个完整的数据报是否已经全部抵达具有数据报片超时机制 如果在重组完成之前定时器溢出 则删除数据报片 本例中的代码使用一个列表数组来保存数据报片 数组中的每个元素对应于一个已有数据报片到达的数据报 并包含了一个指针 指向此数据报的分片表 文件ipreass h说明了数据结构 2020 3 19 7 4 1数据结构 数组ipfqt构成了数据报片的主要数据结构 数组的每个元素对应一个数据报 结构ipfq定义了需要保存的信息 除数据报的源地址和ID字段 iPf src和ipf id 之外 每个元素还包含了一个寿命计数字段 ipf ttl 用来指出该数组元素在超时之前能保留多长时间 ipf q字段指向一个链表 链表的表项是所有已经到达的数据报片 重组软件必须判断某个数据报的数据报片是否已经全部抵达 为了提高判断的效率 分片链表按顺序存放 链表中的数据报片根据它们在原来的数据报中的偏移量大小排序 协议设计思想使序号的选取变得简单 因为即使是为一个数据报片再次分片时 它的偏移量还是以原来的数据报为基准的 因而能够做到在链表中插入任何数据报而不需要知道它是一次分片还是多次分片的结果 2020 3 19 7 4 2互斥操作 为了保证进程在访问数据报片的链表时不会互相干扰 重组程序代码使用了 个互斥信号量ipfmutex 在文件ipreass h中说明了它是一个外部的整数值 可被所有程序代码访问 正如我们将要看到的 由于互斥操作使系统能够使用各自独立的超时进程和重组进程 而使它显得尤其重要 2020 3 19 7 4 3在链表中加入一个数据报片 IP使用传入数据报片首部中的信息来确定出对应的数据报片链表 如果几个数据报片的源地址字段和IP标识符字段中的值相同 那么这些数据报片就属于同一个数据报 过程ipreass接收数据报片 找出相应的链表 并将数据报片插入该链表中 给定一个数据报片 ipreass在分片表中搜索 看表中是否有与该数据报片所属的数据报相对应的表项 对每一个表项 它比较两者的源地址和标识符字段 如果找到匹配的表顶 就调用ipfadd向链表中加入该数据报片 然后调用ipfjoin来查看是否所有的数据报片己全部到齐 可以重组数据报 如果没有发现匹配表项 ipreass分配数组中的第一个空闲表项 复制源地址和标识符字段 并将数据报片置入一个新分配的队列中 2020 3 19 7 4 3在链表中加入一个数据报片 在我们的实现过程中 使用了线性查找来为一个传入数据报片找出适当的链表 对于性能要求高的应用 这种方法似乎效率很低 当然 一些计算机的确同时接收来自许多数据报的数据报片 因而要求更快的查找方式 然而 由于大多数计算机更多地与本地环境中的计算机通信 它们很少会收到分片的数据报 再者 因为重组只能在数据报到达本机时才发生 而途经的数据流不需要重组 所以网关重组数据报的速度不需要像为数据报选择路由时那么快 因而 对典型的计算机系统来说 线性查找已经足够了 2020 3 19 7 4 4溢出时的丢弃 过程ipfadd将数据报片插入给定的链表 在正常情况下 此过程显得微不足道 ipfadd只是调用enq将数据报片放入队列中 然后将数据报的寿命字段复位 但是 在分片列表空间已全满的情况下 新的数据报片无法加入链表中 当这种情况发生时 ipfadd丢弃对应数据报的所有数据报片 并释放ipfqt数组中对应的表项 表面上看 这种做法似乎有些奇怪 然而丢弃整个链表的原因其实很简单 只要丢失一个数据报片 IP就永远无法重组并继续处理这个数据报 因此 释放它所对应的数据报片占用的内存空间 可以使其他数据报有可能进行重组 更进一步讲 一旦链表的容量达到极限值 它就无法再扩展 此时若保留该链表 只会徒然耗费内存资源 而不会对成功重组数据报起什么作用 2020 3 19 7 4 5测试一个完整的数据报 当IP向链表中增加一个新数据报片后 必须检查它是否已拥有了组成一个完整数据报的全部数据报片 过程的ipfjoin检查数据报片链表 看它们是否能形成一个完整数据报 在证实了指定的某个数据报片链表正处于使用状态后 ipfjoin进入一个循环语句 遍历链表中的每个数据报片 它先设置变量off的值为0 然后利用变量off来查看它当前指向的数据报片所处的位置是否正确 是否就是它在原来的数据报中所处的位置 首先 ipfjoin查看当前数据报片的偏移量是否与off值相符 如果当前数据报片的偏移量超过了off的值 那么必定还有尚未到达的数据报片 因此ipfjoin返回0 这意味着数据报片还不能被重组 如果偏移量与off值一致 那么ipfjoin通过将off值加上当前数据报片的长度 计算出下一个数据报片的偏移量 2020 3 19 7 4 5测试一个完整的数据报 一旦ipfjoin证实所有的数据报片已被全部收集齐 则通过判断来保证数据报可以被装入一个大缓冲区中 软件只能处理装入大缓冲区中的数据报 因为数据报在被传送给应用程序之前 必须在连续的存储空间中重组 这样 如果数据报无法装入到一个缓冲区中 ipfjoin就将这些数据报片丢弃 最后 对于可装入 个缓冲区的数据报来说 ipfjoin调用ipfcons来收集数据报片并重建完整的数据报 2020 3 19 7 4 6将数据报片组装成完整的数据报 过程ipfcons将数据报片重组成完整的数据报 除了将每个数据报片中的数据复制到合适的位置外 它还要建立 个有效的数据报首部 所需要的信息来自第一个数据报片的首部中 但数据报长度字段中的值要修改为整个数据报的长度 ipfcons将MF比特复位为0 以表明这个重建的数据报不是数据报片 并将偏移字段置为0 在数据报的重组过程中 ipfcons逐个释放保存每个数据报片的缓冲区 当重组完成后 ipfcons释放分片表ipfqt中对应的表项 2020 3 19 7 5数据报片链表的维护管理 因为IP是不可靠交付机制 数据报在互联网中传输时有可能会丢失 如果一个数据报片丢失 接收端的IP软件就不能重组原来的数据报 更进一步说 因为IP不提供确认机制 所以无法重传数据报片 因此一旦某个数据报片丢失 IP将永远无法恢复它所对应的数据报 事实上 如TCP的高层协议 会使用一个新的数据报进行重传 为了使丢失数据报片的数据报不再浪费存储资源 并防止因为标识符字段的重新使用而给IP带来混乱 当已经不可能再收到剩余数据报片时 IP必须定期检查数据报片链表并丢弃旧链表 过程ipftimer执行定期的清理工作 2020 3 19 7 5数据报片链表的维护管理 ipftimer在每次被调用时 通常每秒一次 遍历数据报片链表 它递减每个表项中的寿命字段 并丢弃其值达到0的链表 在丢弃一个链表时 ipftimer从链表中提取出第一个结点 并利用分组缓冲区向源地址发送ICMP超时报文 在发送了ICMP报文之后 ipftimer释放链表 并将iPfqt中的表项设置为空闲状态 可以被再次使用 2020 3 19 7 6初始化 重组数据报片时所使用的数据结构的初始化过程很简单 过程ipfinit生成互斥信号量并将iPfqt数组中的每个表项置为空闲状态 使之可用 2020 3 19 7 7小结 所有实现IP协议的机器必须能够将外发的数据报分片 并且当被分片的数据报到达后 将其重组 事实上 网关通常在遇到一个太大的数据报而无法将其作为网络MTU传送到它必须经过的网络上时 就需要将这个数据报分片 数据报的分片过程包括为每个数据报片复制数据报的首部 设置偏移字段和MF比特 复制部分数据 并每次发送一个所得到的数据报片 软件在IP为数据报选择路由之后 以及IP将其置入一个与特定网络接口相关联的输出队列之前 将 个数据报分片 与重组相比 分片要更直截了当 2020 3 19 7 7小结 为了执行重组 IP采用了 个数据结构 用于把来自某一特定数据报的所有数据报片收集起来 一旦所有的数据报片都已聚齐 就可以重组 重建 数据报并继续处理 重组与一个维护进程并行工作 每当某个数据报的一个新数据报片到达时 IP在分片表中将此数据报的寿命字段复位 维护进程定期检查数据报片链表 并递减每个表项中的寿命字段 如果在所有数据报片到达之前 寿命已达到0 则维护进程丢弃整个数据报 2020 3 19 差错与控制报文协议 因特网控制报文协议ICMP报文格式与类型ICMP差错报告ICMP控制报文ICMP请求与应答报文对ICMP报文封装 2020 3 19 因特网控制报文协议 ICMP ICMP协议设计的最初目的主要是用于IP层的差错报告 由路由器或信宿以一对一的模式向信源报告传输错误的原因 随着网络的发展 检测和控制功能逐渐被引入到ICMP协议中 使得ICMP协议不仅用于传输差错报告 而且大量用于传输控制报文 ICMP与IP协议位于同一个层次 IP层 但ICMP报文是封装在IP数据报的数据部分进行传输的 ICMP协议是IP协议的补充 用于IP层的差错报告 拥塞控制 路径控制以及路由器或主机信息的获取 返回 2020 3 19 ICMP报文格式与类型 ICMP报文由首部和数据段组成 首部为定长的8个字节 前4个字节是通用部分 后4个字节随报文类型的不同有所差异 ICMP报文的一般格式如图所示 2020 3 19 ICMP报文虽然细分为很多类 但总的来看可以分为如图所示的三大类 差错报告 控制报文和请求应答报文 返回 2020 3 19 ICMP差错报告 ICMP差错报告的数据区包含出错数据报的首部及该数据报的前64位数据 这些信息有助于信源或管理人员发现错误原因 ICMP差错报告具有以下特点 1 只报告差错 但不负责纠正错误 纠错工作留给高层协议去处理 2 发现出错的设备只向信源报告差错 3 差错报告作为一般数据传输 不享受特别优先权和可靠性 4 产生ICMP差错报告的同时 会丢弃出错的IP数据报 2020 3 19 形成ICMP差错报告时有以下例外 1 ICMP差错报文本身不会再产生ICMP差错报告 2 分片报文的非第一个分片不会产生ICMP差错报告 3 组播地址报文不会产生ICMP差错报告 4 特殊地址127 0 0 0和0 0 0 0的报文不会产生ICMP差错报告 2020 3 19 1信宿不可达报告 当路由器无法根据路由表转发IP数据报时或主机无法向上层协议和端口提交IP数据报时 将丢弃当前的数据报 并产生信宿不可达差错报告 向信源报告出错 信宿不可达报文如图所示 2020 3 19 信宿不可达报文可能由路由器产生 也可能由信宿机产生 产生信宿不可达报文的原因的16种可能 2020 3 19 2数据报超时报告 在数据报的传输过程中 首部的TTL值用于防止数据报因路由表的问题而无休止地在网络中传输 当TTL值为0时 路由器会丢弃当前的数据报 并产生一个ICMP数据报超时报告 另外 在信宿进行分片重组时会启动重组定时器 一旦重组定时器超时 信宿就会丢弃当前正在重组的数据报 然后产生一个ICMP数据报超时报告 并向信源发送该超时报告 2020 3 19 数据报超时报告的报文格式与信宿不可达报告的报文格式相同 只是类型和代码值不同 数据报超时报告的类型和代码的含义如表所示 类型值11表示是数据报超时报文 代码 0 表示TTL超时 代码 1 表示分片重组超时 2020 3 19 3数据报参数错报告 数据报参数错报告是由数据报首部字段值不明确或空缺而引起的差错报告 一旦路由器或信宿机发现错误的数据报首部和错误的数据报选项参数时 便抛弃该数据报 并向信源发送差错报告报文 数据报参数错报文的格式如图所示 2020 3 19 类型12表明数据报参数错代码 0 表示数据报首部中的某个字段的值有错或不明确 这时ICMP报文首部的指针指向数据报中有问题的字节 代码 1 表示数据报首部中缺少某一选项所必须具有的部分参数 此时的ICMP报文没有指针字段 表3给出了数据报参数错报告的类型 代码为 0 的参数错只能报告一个出错参数代码为 1 的参数错只能报告缺少参数 不能说明缺少哪个参数 返回 2020 3 19 ICMP控制报文 ICMP控制报文包括源抑制报文和重定向报文源抑制报文 用于拥塞控制重定向报文 用于路径控制下表给出了这两类报文的类型和作用描述 2020 3 19 1源抑制报文 IP协议采用的是无连接数据报方式进行传输发送方事先并不了解中间的路由器和信宿的处理能力和缓冲区大小在数据报传输过程中没有采用任何流量控制机制当大量的数据报进入路由器或信宿时 会造成缓冲区溢出 即出现拥塞 Congestion ICMP利用源抑制的方法来进行拥塞控制 通过源抑制来减缓信源发出数据报的速率 2020 3 19 源抑制报文的格式如图所示 2020 3 19 源抑制包括三个阶段 发现拥塞阶段 解决拥塞阶段和恢复阶段 在发现拥塞阶段 路由器对缓冲区进行监测 一旦发现拥塞 立即向相应的信源发送ICMP源抑制报文 该信源收到源抑制报文后 便知道拥塞已经发生 而且所发送的数据报已经丢掉 在解决拥塞阶段 信源根据收到的源抑制报文中所带的原数据报的首部信息决定对去往某一特定信宿的信息流进行抑制 通常信源在收到源抑制报文后 按一定的规则降低发往某信宿的数据报传输率 拥塞解除后 信源逐渐恢复数据报传输速率 2020 3 19 在拥塞控制中以下几点值得关注 1 虽然对于每个因拥塞而丢弃的数据报都产生ICMP源抑制报文 但信源只按照自己的时间段进行响应 2 拥塞的解除由信源依据是否有进一步的源抑制报文到达来进行判断 3 拥塞可能是由多个源共同行为的结果 由于各个信源的发送速率相差较大 源抑制的效果未必很好 2020 3 19 2重定向报文 因特网上的路由器和主机中都存有一个路由表 路由表决定了去往目的地的下一跳路由器的地址 路由器上的路由表能够及时地反映网络结构的变化 这一特点由路由器之间定期交换路由信息加以保证 主机因为不能保证全天开机 所以主机中的路由表不能及时反映网络结构的变化情况 另外 由于因特网上的主机数量远大于路由器的数量 主机如果参与路由信息的交换 势必带来大量的通信开销 因此主机中的路由表不通过路由协议进行更新 但主机所在的网络可能和多个路由器相连 主机在发送信息时也要根据其路由表来选择下一跳路由器 为了解决主机路由表的刷新问题 ICMP提供了重定向机制 2020 3 19 主机路由表所给出的下一跳路由器可能并非去往信宿的最佳下一跳路由器 当主机的下一跳路由器收到数据报后 该路由器根据它的路由表判断本路由器是否是去往信宿的最佳选择 如果不是 该路由器仍然会向信宿网络转发该数据报 但在转发的同时会产生一个ICMP重定向报文 通
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 标准化文件归档与存储工具包
- 摄影风格与品牌定位-洞察及研究
- 产品创新快速设计模板与设计步骤手册
- 在校园里过元宵节的作文7篇范文
- 全方位产品需求分析文档模板
- 厨房砧板知识培训课件
- 奥体消防安全知识培训课件
- 大黄敷脐课件
- 大风天气防范火灾课件
- 2025商业写字楼租赁合同范本
- 新能源汽车的维护与故障诊断项目三:新能源汽车的故障诊断
- A320飞机理论知识概要
- MySQL数据库技术与应用PPT完整全套教学课件
- 全自动生化分析仪advia2400中文操作手册
- 中国石油资金集中管理案例课件
- crh5a型动车组四级检修修订改
- 纯净水生产项目可行性分析报告
- 3.1《太阳系大家庭》课件
- 税务尽职调查报告(参考)
- 初中七年级上《综合实践》活动课程课件
- 全屋定制家居整装安装师傅专业安装服务技巧培训指导手册
评论
0/150
提交评论