cs144网络课程0 热身#
环境#
CS 144: Introduction to Computer Networking, Spring 2023
这个课程从0开始做出一个tcp协议栈,每个lab可测试。
通信行业中网络相关内容接触得也不少,希望快速完成,后续把此协议栈集成到自己的os里。
旨在调通逻辑,不过多考虑效率。
https://cs144.github.io/assignments/check0.pdf
clone代码
git clone https://github.com/cs144/minnow
需要c++20编译器,否则报错。
ubuntu22.04 apt可安装gcc12.1。
CMakeLists.txt
设置为新的编译器可编译成功。
set(CMAKE_CXX_COMPILER "g++-12")
可按情况设置c++20。set(CMAKE_CXX_STANDARD 20)
webget#
就是用它的socket接口发一条http协议的裸体数据。
用到Address
/TCPSocket
。
它的socket接口是把man7::socket封装了一下。
http/1.1协议
https://www.rfc-editor.org/rfc/rfc2616
看第5节如何拼一个请求。
最后要加"\r\nConnection: close\r\n\r\n"
cmake --build build --target check_webget
进行测试。若通过可看到100% tests passed
。
An in-memory reliable byte stream#
测试命令
cmake --build build --target check0
看它代码。代码搞得挺花哨。
本质是一大堆测试用例。做各种操作然后看相关的值对不对。
ByteStreamTestHarness
会起一个ByteStream
赋值给obj_
。
// 例如
test.execute( IsClosed { false } ); // void execute( const TestStep<T>& step )
step.execute( obj_ );
// 也就是
IsClosed { false }.execute(ByteStream { capacity })
const bool result = value( ByteStream { capacity } );
return bs.writer().is_closed();
if ( result != value_ ) {
throw ExpectationViolation { name(), value_, result };
}
要改ByteStream
代码,把这些测试调通。
本质是要做一个buffer之类的东西。维护size等等信息,可以读写。暂不考虑并发。
buffer我直接用的std::string。
可以学到一些ctest相关流程。