Skip to content

Commit

Permalink
update automatic tests
Browse files Browse the repository at this point in the history
  • Loading branch information
liuyi-thu committed Mar 13, 2024
1 parent fc730ff commit 666a5a8
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 4 deletions.
8 changes: 8 additions & 0 deletions docs/framework.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,14 @@ $ make && ./builddir/lab-client -l c -r s -p lab-client.pcap

最后,别忘了可以用调试器来单步调试。

## 如何执行自动化测试

框架里为各项任务提供了自动化的测例,在 `src/test` 下,同学们可以自行阅读并修改其源代码。不建议直接执行这些 Python 文件,而是通过 `make test` 命令调用,这会自动编译源代码并执行相应的测试。

如果你只想执行部分测试,可以修改 `meson.build` 的内容。`meson.build`的语法其实并不复杂,注释掉不想运行的测试即可。

如果测试不通过,可以通过 `builddir` 目录下的日志文件来排查问题。

## 定时器设计

框架代码是一个单线程并发的模式,有些类似 Node.JS,即不会进行阻塞的操作。如果进行的操作可能阻塞,注册一个回调函数,定期轮询是否可以继续。以 `lab-client.cpp` 的发送逻辑为例子:
Expand Down
21 changes: 17 additions & 4 deletions docs/requirement.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,16 @@
1. 必选部分(60 分):`sum(scores)`
2. 自选部分(40 分):`min(sum(scores),40)`

在实验报告中,对于所实现的每个功能,请编写一个章节,包括下列事情
在实验报告中,对于所实现的每个功能,请编写一个章节,包括下列内容

1. 标注这是属于下面哪个类别里的哪一项功能
2. 为了实现这个功能,做了哪些代码改动
3. 可以展示功能的 Wireshark 截图展示或者命令行输出

在选择实现的自选功能的时候,请研究一下如何实现和触发该功能。有的功能可能容易实现,但是不容易触发。另外,请注意,部分功能由 lwip 支持,可以在 `lwipopts.h` 中打开;如果有不支持的功能,可能需要自己实现客户端 + 服务端,难度较大。为了展示实现的客户端功能,可以用自己的协议栈或者 lwip 作为服务端进行测试;同样地,为了展示实现的服务端功能,可以用自己的协议栈或者 lwip 作为客户端进行测试。

框架里为各项任务提供了自动化的测例,可以通过 `make test` 命令调用。你也可以适当修改 `src/test` 下的测例,以便于更好地展示你的实验结果,但是修改之处请在最终提交的`实验报告`中注明。

主要参考文档:

- [RFC 793](https://www.rfc-editor.org/rfc/rfc793.html)[RFC 793 勘误](https://www.rfc-editor.org/errata/rfc0793)
Expand Down Expand Up @@ -92,21 +94,28 @@
- 给做实验的你一个有成就感的阶段性成果
- 分数:5
- 测试 6:在本地运行 socat 命令(命令:`sudo socat TCP-LISTEN:80,reuseaddr,fork TCP:www.baidu.com:80`),监听 80 端口并转发百度主页;然后运行 lab-client 并设置为 TUN 模式(命令:`make run-lab-client-tun`),那么 lab-client 会通过本机 80 端口访问百度主页 80 端口,并下载到本地
- 注意:部分发行版可能没有自带 socat命令, 需要额外安装 socat 软件包
- 教学目的:了解一个最小的 TCP 实现所需要的功能,并获得阶段性的成就

### Step 6. 重传和乱序重排(retransmission and out of order handling)

- 重传的实现思路是,对于发出去的 TCP 分组,记录在一个列表中,并且启动一个计时器,每一段时间检查一下列表中的 TCP 分组,如果发现有已经被对端 ACK 的,就删掉;否则就再次发送。
- 乱序重排的实现思路是,如果发现 TCP 分组的序列号不等于 RCV.NXT,此时出现了乱序,先把数据保存到列表中,当之后接受到序列号等于 RCV.NXT 的分组时,再将列表中已有的数据拼接起来,写入到接收缓冲区中。
- 分数:10
- 暂无自动化测试
- 测试 7a:启动 lwip-client 和 lab-server,模拟接收端的丢包,在输出日志中检查是否出现了正确的状态机转移
- 测试 7b:启动 lab-client 和 lab-server,lab-server模拟 HTTP response 的延迟、乱序发送,在输出日志中检查是否出现了正确的状态机转移
- 测例的具体实现机理可以参见源代码。欢迎对这两个测例进行改进,通过其他方式来展现重传和乱序重排的效果
- 教学目的:理解在网络中出现丢包或者乱序的时候,如何在协议上保持不重不漏、顺序正确地实现数据传输

### Step 7. 实现 Nagle 算法(Nagle's algorithm)

- 分数:5
- 参考文档:[RFC 896](https://datatracker.ietf.org/doc/html/rfc896)
- 暂无自动化测试
- 测试 8a:启动 lwip-client 和 lab-server,启用 Nagle 算法,在输出日志中检查是否出现了正确的状态机转移
- 测试 8b:启动 lwip-client 和 lab-server,禁用 Nagle 算法,在输出日志中检查是否出现了正确的状态机转移
- lab-server 以每次发送 13 字节的 `Hello World!\n` 的方式,向客户端返回共计 1300 字节的 Content ,共调用 `tcp_write` 100 余次,产生较多的小数据包
- 请比较开启 Nagle 算法与关闭 Nagle 算法时,TCP 连接的传输效率
- 注意:编译时,我们用 `ENABLE_NAGLE` 这个宏来区分 Nagle 算法是否启用。如果存在 `ENABLE_NAGLE` 这个宏,你的 TCP 实现就应该启用 Nagle 算法
- 教学目的:学习并实现一个经典的 TCP 上的优化

### Step 8. 实现慢启动,冲突避免和快速重传(slow start, congestion avoidance and fast retransmit/recovery)
Expand All @@ -117,7 +126,11 @@
- 当发现重复的 ACK 时,采用快速重传算法,更新 cwnd 和 ssthresh。
- 分数:10
- 参考文档:[RFC 5681 Section 3.1](https://datatracker.ietf.org/doc/html/rfc5681#section-3.1)[RFC 5681 Section 3.2](https://datatracker.ietf.org/doc/html/rfc5681#section-3.2)
- 暂无自动化测试
- 测试 9a:启动 lwip-client 和 lab-server,在输出日志中检查是否出现了正确的状态机转移
- 测试 9b:启动 lwip-client 和 lab-server,在输出日志中检查是否出现了正确的状态机转移
- 在测试中在模拟的网络层中实现一个类似漏桶算法的限速方法,当客户端平均接收带宽超过 10KiB/s 时,通过丢包(在客户端接收时丢弃)模拟网络拥塞
- 测试 9a 模拟极端的网络拥塞情况,带宽超过上限时,丢弃所有到达的包;测试 9b 模拟偶然的网络拥塞情况,带宽超过上限时,以一定概率丢弃到达的包
- 请比较测试 9a 和 9b 下,TCP 连接的传输效率
- 教学目的:学习并实现经典的拥塞控制协议,并理解 TCP 协议栈是如何通过丢包和重复的 ACK 来判断链路上是否拥挤的,拥挤时要如何让出带宽来缓解网络的拥挤程度

## 限选功能(总分 40 分)
Expand Down

0 comments on commit 666a5a8

Please sign in to comment.