## 目标
实现了一个带容量限制的字节流 ByteStream,这为后续的 TCP 流量控制、可靠传输奠定基础。
- write:向流中写入数据
- read:从流中读取数据
- peek_output:预览数据但不移除
- pop_output:移除数据但不返回
- 流量控制:通过 capacity 限制缓冲区大小
- 状态跟踪:记录已读/已写字节数,检查流是否结束
## 通过 capacity 限制 是怎么体现出来的
这种容量限制机制模拟了 TCP 中的流量控制:
发送方不能无限制地发送数据
接收方有一个固定大小的接收窗口
当接收窗口满时,发送方必须等待接收方处理数据后才能继续发送
### write
```Java
【ByteStream 的缓冲区示意图】
capacity = 10 (总容量)
buffer.size() = 4 (已使用空间)
canWrite = capacity - buffer.size() = 6 (剩余可写空间)
+---+---+---+---+---+---+---+---+---+---+
| A | B | C | D | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
|<--- 已使用 --->|<----- 剩余空间 ----->|
|<--------------- capacity ------------->|
假设要写入的数据:data = "HELLO" (长度为5)
canWrite = 6 (剩余空间)
canRead = min(6, 5) = 5 (实际可写入长度)
写入后的状态:
+---+---+---+---+---+---+---+---+---+---+
| A | B | C | D | H | E | L | L | O | |
+---+---+---+---+---+---+---+---+---+---+
```
再举一个例子,如果要写入的数据比剩余空间大:
```Java
当前状态:
+---+---+---+---+---+---+---+---+---+---+
| A | B | C | D | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
要写入:data = "HELLOWORLD" (长度为10)
canWrite = 6 (剩余空间)
canRead = min(6, 10) = 6 (只能写入6个字符)
写入后:
+---+---+---+---+---+---+---+---+---+---+
| A | B | C | D | H | E | L | L | O | W |
+---+---+---+---+---+---+---+---+---+---+
|<---- 实际写入 ---->|
```
计算逻辑:
1. `canWrite = capacity - buffer.size()`
- 计算还有多少空闲空间可以写入
- 就是总容量减去已使用空间
2. `canRead = min(canWrite, data.size())`
- 比较剩余空间和要写入的数据长度
- 取两者中的较小值作为实际可写入长度
- 这样可以避免缓冲区溢出
这就像往一个固定大小的水杯里倒水:
- capacity 是水杯的容量
- buffer.size() 是已经装的水量
- canWrite 是还能装多少水
- data.size() 是想要倒入的水量
- canRead 是实际能倒入的水量
## 参考
https://doraemonzzz.com/2022/01/30/2022-1-30-CS144-Lab0%E7%BF%BB%E8%AF%91/#4-%E5%86%85%E5%AD%98%E4%B8%AD%E5%8F%AF%E9%9D%A0%E7%9A%84%E5%AD%97%E8%8A%82%E6%B5%81
1. 在你的提交中,请只对`webget.cc`和`libsponge`顶层的源代码(`byte_stream.hh`和`byte_stream.cc`)进行修改。请不要修改`libsponge/util`中的任何测试或帮助程序。
2. 在提交任何作业之前,请按顺序运行这些:
- (a) `make format`(使编码风格正常化)
- (b) `make`(确保代码可以编译)
- (c) `make check_lab0`(确保自动测试通过)
3. 完成编辑`writeups/lab0.md`,写上这项作业花了你多少时间,以及任何其他评论。
4. 准备提交时,请按照[https://cs144.github.io/submit](https://cs144.github.io/submit)。在提交之前,请确保你已经提交了你想要的一切。
5. 如有任何问题,请在周二晚上的实验课上尽快告知课程负责人,或在Piazza上发表问题。祝您好运,欢迎来到CS144!