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相关流程。