CS144计算机网络Lab1: Stitching Substrings into a Byte Stream
本文最后更新于:2024年1月30日 下午
The arrangement of modules and dataflow in TCP implementation.
- 将零散的字节流片段拼接成顺序正确的字节流;
- 忽略重复传输的数据包;
- 拒绝过早传输的数据包;
- 将排序好的字节流传递给上层的
ByteStream
。
A. Putting substrings in sequence
在pdf中,作者给出了一个StreamReassembler
的简单示意图,不过比较抽象
StreamReassembler.
首次尝试
具体来说,对于外部输入随机排列的substring
,使用滑动窗口处理陆续到达的substring
并将它们全部储存在buffer_string
中,其中滑动窗口是由_reassembled_pt
和_end_pt
两个指针组成,并保证_end_pt - _reassembled_pt <= _capacity
;同时维护一个buffer_check
用来储存buffer_string
中每个字节的占用情况。
1 |
|
1 |
|
对于push_substring()
,workflow
如下:
StreamReassembler.
- 计算插入
data
后buffer_string的长度:extended_length = index + data.length()
; - 检查
extended_length
是否超出capacity
,若超出则直接return
; - 检查
eof
是否为true
,将_end_pt
设置成extended_length
; - 将
buffer_string
和buffer_check
的长度扩展到extended_length
,并写入data
同时将对应位置的check
置为1
; - 如果
_reassembled_pt
位置上的比特非空,就写入到ByteStream
,并右移_reassembled_pt
直到遇到空位或_reassembled_pt == _end_pt
; - 当
_reassembled_pt == _end_pt
时,结束ByteStream
输入。
1 |
|
对于unassembled_bytes()
函数,我们需要查看滑动窗口里未被连续填充的区间中填充byte的数量,也就是当_reassembled_pt
处为空时,在其之后的substring
数量,这里直接遍历一边就好。
1 |
|
最后,判断StreamReassembler
是否为空
1 |
|
然而,这个方案不能通过测试。
进一步改进
经过复盘发现了一些问题:
- 当
extended_length
超过_capacity
时就直接全部抛弃了,没有考虑部分输入的情况,正确的逻辑应该是仅抛弃无法写入的unacceptable
字节; eof
也没有考虑unacceptable
字节的问题,需要对本次data
是否能完整写入进行判定;- 在写入
ByteStream
时,逐个进行的,并且进行了类型转换。 - 除此之外,在一开始进行分析的时候对
_reassembled_pt
和_end_pt
的说明是_end_pt - _reassembled_pt <= _capacity
,忽略了_end_pt
与eof
的联系。
经过修改新workflow
如下:
- 计算插入
data
后buffer_string
的长度:extended_length = index + data.length()
---->插入长度; - 计算符合
_capacity
要求理论最大长度:max_expended_length = _reassembled_pt + _capacity
---->最大长度; - 检查
index
是否超出capacity
,若超出则直接return
; - 检查
eof
是否为true
,且如果本次的data
能完全插入则令_end_pt = expended_length
; - 调整
buffer
并插入data
- 如果插入长度大于当前
buffer_string
的长度,则将buffer_string
和buffer_check
扩展到插入长度; - 写入
data
同时将对应位置的check
置为1
; - 如果插入后当前
buffer_string
的长度大于最大长度,则将buffer_string
和buffer_check
缩短到最大长度,抛弃掉unacceptable
字节。
- 如果插入长度大于当前
- 如果
_reassembled_pt
位置上的比特非空,就写入到ByteStream
,并右移_reassembled_pt
直到遇到空位或_output
已满; - 当
_reassembled_pt == _end_pt
时,结束ByteStream
输入。
1 |
|
通过了test
。
CS144计算机网络Lab1: Stitching Substrings into a Byte Stream
https://zone.ivanz.cc/p/8eb2211f