cs144网络课程1 byte stream#

环境#

https://cs144.github.io/assignments/check1.pdf

commit lab0的代码。

merge lab1的代码
git merge origin/check1-startercode

编译/测试
cmake --build build
cmake --build build --target check1

Reassembler#

这个lab要开始写Reassembler。组装数据包并发给ByteStream

测试结构和lab0类似。ReassemblerTestHarness会做{ ByteStream { capacity }, Reassembler {} }这样一个东西,同时起ByteStreamReassembler放在一起。

// 测试例子
test.execute( Insert { "a", 0 } );
    Insert { "a", 0 }.execute( StreamAndReassembler& sr )

    // 也就是
    Insert { "a", 0 }.execute({ ByteStream { capacity }, Reassembler {} })
        sr.second.insert( first_index_, data_, is_last_substring_, sr.first.writer() );
    
        // 也就是
        Reassembler.insert( first_index_, data_, is_last_substring_, ByteStream );
  • Reassembler会不断收到带index的数据包,同时带一个ByteStream,我们需要把已经收到的连续数据包转给ByteStream

  • 如其名主要任务是把各种情况的数据包组起来。

  • 每个byte都有自己的index。数据可能乱序/重复。

  • 如果后面的数据包先到,需要hold住数据并等待。

  • 如果数据超出ByteStream的容量,丢弃。

  • 重复的丢弃。

  • 如果还没发送的状态下相同index上又来了不同的数据?覆盖老数据。

  • buffer怎么存。开始我用的std::deque暴力存,做成滚动buffer。可跑到reassembler_win。
    reassembler_win测试会有null字符,而std::deque我默认用0判断无效,那么就完蛋了。不太好处理,本身使暴力处理效率也差,直接作废。

  • 还能快速想到的是用std::map存数据块。每次来新数据都进行merge,保持map里都是一段段有效的数据,不存在overlap。
    一旦出现从头开始的连续数据,直接拿出来push即可。

  • is_last_substring上来时,记好末尾的index。当push到末尾时关闭ByteStream

  • 通过全部测试。平均速度在Reassembler throughput: 8.1 Gbit/s左右。