CS144 lab1 字节重组器

Posted Hello,world!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CS144 lab1 字节重组器相关的知识,希望对你有一定的参考价值。

 概述

    在实验 0 中,您使用 Internet 流套接字从网站获取信息并发送电子邮件,使用 Linux 的传输控制的内置实现协议 (TCP)。这个 TCP 实现设法产生了一对可靠的有序字节流(一个从你到服务器,一个在相反的方向),即使底层网络只提供“尽力而为”的数据报。我们的意思是:可以丢失、重新排序、更改或复制的数据包。您还实施了自己的字节流抽象,在一台计算机的内存中。在接下来的四个星期里,您将实现 TCP,以提供一对计算机之间的字节流抽象由不可靠的数据报网络分隔。
  我为什么要这样做?在不同的基础上提供服务或抽象不太可靠的服务是网络中许多有趣问题的原因。结束在过去的 40 年里,研究人员和从业者已经找到了如何传达各种事物——消息和电子邮件、超链接文档、搜索引擎、声音和视频、虚拟世界、协作文件共享、数字货币——通过互联网。TCP 本身的作用,使用不可靠的数据报提供一对可靠的字节流,是这方面的经典例子之一。一个合理的观点认为 TCP 实现算作地球上使用最广泛的非平凡计算机程序。
实验室作业将要求您以模块化方式构建 TCP 实现。
 

CS144:计算机网络简介

1. 在实验 1 中,您将实现一个流重组器——一个拼接小块的模块字节流(称为子串,或段)返回到连续流正确顺序的字节数。
2. 在实验 2 中,您将实现处理入站字节流的 TCP 部分:TCP接收器。这涉及考虑 TCP 将如何表示每个字节的位置在流中 - 称为“序列号”。TCPReceiver 负责告诉发送者 (a) 它能够组装多少入站字节流成功(这称为“确认”)和(b)发送方还有多少字节允许立即发送(“流量控制”)。
3. 在实验 3 中,您将实现处理出站字节流的 TCP 部分:TCP发送器。当发送方怀疑它传输的一个段时,它应该如何反应一路上迷路了,从未到达接收器?什么时候再试一次并重新传输丢失的段?
4. 在实验 4 中,您将把之前的工作与实验结合起来,创建一个工作TCP 实现:一个包含 TCPSender 和 TCPReceiver 的 TCPConnection。您将使用它与世界各地的真实服务器对话。
 

将子串按顺序排列

     在本实验和下一个实验中,您将实现一个 TCP 接收器:接收数据报并将它们转换为可靠的字节流以供用户读取(就像您的webget 程序从实验 0 中的 webserver 读取字节流)。
TCP 发送方将其字节流分成短段(子串不超过每个大约 1,460 字节),以便它们每个都适合数据报。但是网络可能重新排序这些数据报,或者丢弃它们,或者多次传送它们。接收者必须将这些段重新组合成它们开始时的连续字节流。
     在本实验中,您将编写负责此重组的数据结构:流重组器。它将接收子串(由一串字节和索引组成较大流中字符串的第一个字节)并提供一个 ByteStream 与所有数据正确排序。
界面如下所示:
// 构造一个 `StreamReassembler`,最多可以存储 `capacity` 个字节。
StreamReassembler( const size_t capcity);
// 接收一个子字符串并将任何新的连续字节写入流中。
//
// `data`: 段
// `index` 表示 `data` 中第一个字节的索引(按顺序放置)
// `eof`:该段的最后一个字节是整个流中的最后一个字节
void push_substring ( const string & data, const uint64_t index, const bool eof);
// 访问重组的字节流
const ByteStream stream_out();
// 已存储但尚未重组的子串中的字节数
size_t unassembled_bytes () const ;
// 内部状态是否为空(输出流除外)
bool empty() const ;

 

重组器的完整(公共)接口由 StreamReassembler 类描述在流 reassembler.hh 标头中。你的任务是实现这个类。您可以添加您希望 StreamReassembler 类的任何私有成员和成员函数,但是你不能改变它的公共接口。
⋆我为什么要这样做?
因为它是 TCP 对段的健壮性的核心重新排序,它将使处理传入的段变得更加容易。

常见问题

• 整个流中第一个字节的索引是多少?零。
• 我的实施应该有多高效?我们不会指定一个特定的还没有效率的概念,但请不要将其视为构建粗犷空间的挑战-或时间效率低下的数据结构——这种数据结构将成为你的基础TCP 实现。
• 如何处理不一致的子串?你可能认为他们没有存在。也就是说,您可以假设存在唯一的底层字节流,并且所有子字符串是它的(准确)切片。
• 我可以使用什么?您可以使用标准库的任何您觉得有用的部分。特别是,我们希望您至少使用一种数据结构。
• 什么时候应该将字节写入流?尽快。唯一的情况在哪个字节不应该在流中是当它之前有一个字节时还没有被“推”过。
• 子串可以重叠吗?是的。
• 我是否需要向StreamReassembler 添加私有成员?是的。由于字串可能以任何顺序到达,您的数据结构将必须“记住”子字符串,直到它们准备好放入流中——也就是说,直到它们之前的所有索引都被填满。

实验结果

实验总结

   这个实验主要是利用lab0写的读写字节流,完成一个字节重组器,对不按序到达的字串重组,排序好后读入字节流中,测试程序会自动读取字节流中的数据.

 

 

根据实验指示图,我们需要写一个数据结构,维持容量为capcity,绿色部分代表已经读入字节流但是还没读出的部分,红色部分代表存入数据结构,

但是还没有重组的部分,蓝色部分表示已经从字节流中读出的部分。

我们接受到data后,将不能重组的部分存储起来,如果能重组则直接重组,然后直接读入字节流。

不用担心读入失败问题,因为初始化时设置字节流的最大容量capcity和我们的数据结构维持的width是一样的,即绿色的部分永远小于width,所以只要能放进width的部分就可以直接读入字节流.

接受到data时,可能有超界的情况,比如:

 

 

 

 

 

 

 

 

 

 
 

以上是关于CS144 lab1 字节重组器的主要内容,如果未能解决你的问题,请参考以下文章

MIT-6.828 Lab1实验报告

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

lab1 系统启动 bios加载 bootloader加载

Lab1:Part 2 The Boot Loader

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

ucore lab1实验笔记