九章协议处理.pptVIP

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
九章协议处理

发送端头部预测 在发送端发送的一系列 TCP 段中,TCP头部有变化的域只有少数几个。 发送端头部预测: 发送端在PCB中建立一个TCP头模板 每当需要发送一个TCP段时 ,将模板拷贝到相应的包缓冲区中,填写少数几个有变化的域 9.3 IP分片重组 分片重组的经典实现: 各分片按照分片偏移量保存在一个有序链表中 一个分片到达时,顺序查找链表,插入到合适的位置 在寻找插入位置的过程中,检查分片之前的数据是否全部到达;如果是, 在插入分片后继续沿链表向下查找,检查是否全部数据已到达;如果是, 重新扫描链表,将数据拷贝到另一个缓冲区中 优化预期情形 重组过程复杂的原因: 考虑到IP分片可能乱序到达,且分片之间可能有重叠 预期情形: IP分片按序到达,且没有重叠 优化预期情形: 若判断为预期情形,只需将到来的分片添加到链表尾部(一个常数时间操作) 优化的IP分片重组算法 在有序链表的基础上,增加一个指向链表尾部的指针。 分片到来时,用分片的起始字节偏移量与链表上最后一个分片的末字节偏移量(存在一个变量中)进行比较。 若分片顺序到达且无重叠,将分片添加到链表的尾部,更新指向链表尾部的指针,更新末字节偏移量。 如果这是最后一个分片(MF=0),重组结束。 寻找插入位置及检查重组是否结束,只需要常数时间。 假设与实际相符吗? 分片重组优化算法隐含的假设: IP分片按照偏移量从小到大的顺序发送 多数情况下IP包顺序到达 实际测量: 许多较新的实现(包括Linux),发送端按照分片偏移量从大到小的顺序发送IP分片! 原因:最后一个分片携带了IP包总长度的信息,让最后一个分片最先到达接收端,方便接收端为数据包分配适当大小的缓冲区。 算法调整 使用第一个到来的分片,判断发送端按照什么顺序发送IP分片。 如果第一个到来的分片是第一个分片,使用前述实现。 如果第一个到来的分片是最后一个分片,跳转到按逆序处理的程序: 最后一个分片放在链表头部,其余分片按偏移量降序排列 用分片的末字节偏移量与链表尾部分片的起始偏移量进行比较 9.4 总结 缓冲区分配: 空间利用率 VS 合并不连续空闲区域的难度 缓冲区共享: 缓冲区窃取 TCP输入处理、IP分片重组: 通过优化预期情形的处理,提高大多数情况下的算法性能。 第九章 协议处理 主要内容 缓冲区管理 分片重组 常规协议(TCP/UDP)处理 9.1 缓冲区管理 数据包到达后,首先要分配一个缓冲区 操作系统必须提供分配和释放缓冲区的服务,包括: 管理空闲缓冲区 为数据包找到合适大小的缓冲空间 如果多个连接或用户共享一个缓存空间,还需提供某种形式的公平性 困难:包缓冲区分配必须实时完成 9.1.1 缓冲区分配 经典的BSD UNIX包缓冲区实现称为mbufs: 使用一个缓冲区链来存放一个包,每个缓冲区为一段连续的存储空间 BSD定义了三种大小的缓冲区:100字节、108字节、2048字节(称cluster) Mbufs设计的出发点: 使用一个缓冲区链来存放一个包:允许动态扩展包的缓冲空间;适应各种协议栈 定义不同大小的缓冲区:充分利用内存空间 缺点:访问数据和拷贝数据的开销大 Sk_buf Linux操作系统的包缓冲区实现是sk_buf: 每个包缓冲区都是一块连续地址空间,提前为路径上需要添加的各种协议头预留了空间 用空间换时间(P4b): 包缓冲区必须满足最大包长,有时会浪费空间,但实现简化了。 避免不必要的一般性(P7): 放宽对支持任意协议栈的要求,以提高速度。 如何为不同大小的包分配缓冲区? 按需分配内存: 当一个包到来时,为其分配一块合适大小的缓存空间 动态分配内存的困难: 用户在不同的时间释放缓冲区,导致内存中出现许多不连续的、大小不同的空闲区域 教科书上的标准算法(如Fist-Fit、Best-Fit)可以搜索到合适大小的空闲区域,但速度太慢 高速包缓冲区分配器 隔离池分配器(Segregated Pool Allocator) Linux分配器(Linux Allocator) 批量分配器(Batch Allocator) 隔离池分配器 随BSD 4.2 UNIX发布,称Kingsley malloc()。 将存储空间划分成一组隔离的内存池,同一个内存池中的缓冲区大小相同,为2的幂次。 内存请求被取整到最近的缓冲区大小,从相应的内存池链表头部取一个空闲缓冲区分配。 若对应的内存池空间不足,分配失败。 可能有内存空间浪费,但实现简单。 Linux分配器 Linux分配器最初由Doug Lea实现,称为dlmalloc() 内存被划分成128个内存池: 前64个内存池,缓冲区大小分别为16、24、32、……、512字节(按8字节步长增加) 后64个内存池,大小为2的幂次 分配器会合并相邻

文档评论(0)

118books + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档