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 {} }
这样一个东西,同时起ByteStream
和Reassembler
放在一起。
// 测试例子
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
左右。