第九章协议处理.ppt

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第九章协议处理.ppt

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

文档评论(0)

magui + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8140007116000003

1亿VIP精品文档

相关文档