CS144Lab/writeups/lab1.md
2023-02-16 09:26:38 +00:00

2.7 KiB
Raw Blame History

Lab 1 Writeup

My name: Catfood

My SUNet ID: 998244353

I collaborated with: An orange cat

This lab took me about 3 hours to do.

Program Structure and Design of the StreamReassembler:

首先写几个 dis-ambiguity

  1. capacity限制容量限制指的是bytestream.size + aux_storage.size。比较具有迷惑性的是auxiliary storage的容量这里需要把中间空的字节也算进去因此就可以简单地计算为first_unacceptable = first_unread + capacity = first_unassembled + aux_buffer.size()。形象地理解为类似于一个大的空白数组往里面填东西填满了开头的连续部分就push到bytestream里面。
  2. 关于丢弃这里是以字节为单位的丢弃而不是以packet为单位也就是一个string进来有一部分超出了容量限制这时候不能直接返回不写入而是要把不超出限制的部分写进入剩下的丢掉。
  3. unassembed_bytes的计算这个统计的就是实际收到的但是还没push到字节流的字节不包括空白。因此需要在接受的时候动态统计。
  4. EOF处理因为可能带EOF的packet先到达前面还有没收到的部分因此需要单独记住EOF对应的Index等push到这个Index的时候再去调用字节流的end_input()

然后简单说一下实现:

  • 数据结构是两个deque一个用来当缓冲区另一个用来标志是否是收到的字节这样就不用实现复杂的区间合并了虽然需要消耗双倍内存。开头的时候需要重新调整大小因为可能被read过了。
  • 过程中需要注意各种状态的取值不要超过容量也不要出现非法操作比如取空队列的front这个好像是个UB
  • 每次收到数据之后,都处理一下是否能够推进字节流,说明上是这么要求的(“尽快”)

最后简单记一下STL中deque的一些用法:

  • 初始化:可以用(size, data)这样的方式一次性指定初始容量
  • 入队出队:这个容器可以push/pop_front/back
  • 调整大小:resize(newsize, data)这个调用的行为符合直觉data是用来填充的如果增加了大小如果减小了大小那么尾部数据会被扔掉 === Implementation Challenges: [主要时间都浪费在了调试各种corner case上面了感觉要是自己测试根本测不出来感谢写测试的staff太强啦]

Remaining Bugs: 无

  • Optional: I had unexpected difficulty with: [describe]

  • Optional: I think you could make this lab better by: [describe]

  • Optional: I was surprised by: [describe]

  • Optional: I'm not sure about: [万一eof的地方冲突了咋办虽然好像可以直接忽略来着]