shejialuo / shejialuo.github.io

shejialuo-github-io-shejialuo.vercel.app
0 stars 0 forks source link

2022/11/21/CS144-Introduction-to-Computer-Networking-Lab-1/ #3

Open utterances-bot opened 10 months ago

utterances-bot commented 10 months ago

CS144: Introduction to Computer Networking Lab 1

You can get the whole series from here First, you should carefully read the docs provided by the lab The TCP sender is dividing its byte stream up into short segments so that they can fit inside a d

https://luolibrary.com/2022/11/21/CS144-Introduction-to-Computer-Networking-Lab-1/

LeoLuo0115 commented 10 months ago

你的题解是我看的所有题解里最清楚的,不论是注释,代码还是文档的解释。谢谢你的记录帮助我理解了这个困扰我很久的问题。同时也恭喜博主上岸Nvidia!Respect~

LeoLuo0115 commented 10 months ago

问题

代码似乎没有检擦 capacity。数据超出了容量。注意这里的容量并不是指可保存的字节数量,而是指可保存的窗口大小

首先要搞清楚实验要求中 capacity 究竟是表达什么意思:

ByteStream 的空间上限是 capacity。 StreamReassembler 用于暂存未重组字符串片段的缓冲区空间上限也是 capacity 。 绿色部分代表了 ByteStream 中已经重组并写入但还未被读取的字节流所占据的空间大小。 红色部分代表了 StreamReassembler 中已经缓存但未经重组的若干字符串片段所占据的空间大小。 同时绿色和红色两部分加起来的空间总占用大小不会超过 capacity(事实上会一直小于它)

在你的代码中,_capacity的限制并没有直接体现出来。你的代码中没有明确的检查来确保_output.buffer_size()(绿色部分)和_unassembled_bytes(红色部分)的总和不超过_capacity。例如当capacity = 10时,你的代码允许有10个byte存在与 ByteStream 里,也允许10个byte存在与StreamReassembler 的 _stream 里。 如果你想要确保这一点,你需要在添加新的数据到_stream或者_output之前进行检查。例如,你可以在push_substring方法中添加如下的检查:

first_unacceptable_idx = _next_assembled_idx + _capacity - _output.buffer_size(); 
if (first_unacceptable_idx <= new_idx) return;

当然这只是其中一个检查,我们是否还需要对能进入 _stream 的 data.size() 做出限制,应该是 min(data.size(), first_unacceptable_idx - 1)? 请问我理解是否正确呢?

shejialuo commented 9 months ago

您好,非常感谢我写的题解帮助了你,我一直没有注意仓库把issue的通知关闭了,关于你的问题,我会明天会思考一下!