{"id":19765660,"url":"https://github.com/cold-bin/cs144-lab","last_synced_at":"2025-09-01T12:34:56.891Z","repository":{"id":183679499,"uuid":"668957643","full_name":"cold-bin/cs144-lab","owner":"cold-bin","description":"实现cs144的一些lab","archived":false,"fork":false,"pushed_at":"2023-08-01T10:19:58.000Z","size":539,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-11T00:12:45.566Z","etag":null,"topics":["cs144","spring-23"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cold-bin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-07-21T02:29:10.000Z","updated_at":"2023-08-01T00:13:05.000Z","dependencies_parsed_at":"2025-01-11T00:12:52.928Z","dependency_job_id":"279722aa-02d3-493a-bef5-25375dbdf99b","html_url":"https://github.com/cold-bin/cs144-lab","commit_stats":null,"previous_names":["cold-bin/cs144-lab"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cold-bin%2Fcs144-lab","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cold-bin%2Fcs144-lab/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cold-bin%2Fcs144-lab/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cold-bin%2Fcs144-lab/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cold-bin","download_url":"https://codeload.github.com/cold-bin/cs144-lab/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241096359,"owners_count":19908969,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cs144","spring-23"],"created_at":"2024-11-12T04:18:49.937Z","updated_at":"2025-02-28T03:46:38.885Z","avatar_url":"https://github.com/cold-bin.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# lab0\n\n## reference link\n\n- [lab0实验手册](https://cs144.github.io/assignments/check0.pdf)\n\n## implementation\n\n### Set up GNU/Linux on your computer\n\n简单地安装`CS144 VirtualBox`和c++环境，以方便后续地测试。\n\n### Networking by hand\n\n接下来就是使用简单地`telnet`来构造HTTP请求和SMTP请求，并得到对应的响应。\n（亲手写出一部分报文\n\n### Listening and connecting\n\n通过`netcat`建立一个全双工通信的服务端，感受`netcat`的使用。\n（类似于即时通讯服务\n\n### Writing a network program\n\n\u003e by using an OS stream socket\n\n#### part 1\n\nlab0的最后一项任务就是使用原生的tcp socket来编写http报文结构，从而在socket的基础上发起一次http请求\n详见`lab0/minow/apps/webget.cc`代码实现。\n\n#### part2\n\npart2实现可靠字节流，使用一个普通string来存储字节流\n***\n\n# lab1\n\n## reference link\n\n- [lab1实验手册](https://cs144.github.io/assignments/check1.pdf)\n- [博客](https://hangx-ma.github.io/2023/05/14/cs144-lab1.html)\n\n## implementation\n\n在tcp/ip协议栈中，数据传输的可靠性不是网络来承担的，而是交由端系统来承担的。网络中的有序字节流从一端发送到另一端，跨越了诸多网络的路由器\n，期间难免出现字节流传输的乱序、重复、重叠等。而lab1就是需要在这样不可靠字节流中去建立可靠的字节流。\n\n### 具体实现\n\n这里参考了上面的博客\u003cbr\u003e\n![Memory usage limitation of Reassembler and ByteStream](static/img-unassembled.png)\n\n## lab2\n\n## reference link\n\n- [lab2实验手册](https://cs144.github.io/assignments/check2.pdf)\n\n## implementation\n\n### `wrap`与`unwrap`\n\n![seqno](static/img-seqno.png)\n\n- `wrap`是将`absolute seqno`转化为`seqno` \u003cbr\u003e\n  由于`absolute seqno`是非循环序号，`seqno`是循环序号，所以需要取模转化。（当然也可以直接截断。\n\n- `unwrap`是将`seqno`转化为`absolute seqno` \u003cbr\u003e\n  \u003e `checkpoint`其实就是`first_unassembled_index`\n\n  这里的处理比较麻烦。我最开始的想法是，循环找出最小的`checkpoint - (seqno+x * 2^32)`，也就是离得最近的`x`。\n  但是复杂度比较高，看了大佬的博客，利用位运算，可以将`O(x)`的时间复杂度降低为O(1). \u003cbr\u003e\n  官方让我们找到离`checkpoint`最近的`absolute seqno`，因为给出`seqno`，会有多个`absolute seqno`与之对应，\n\n### TCP Receiver\n\n\u003e 参考上面`seqno`、`absolute seqno`与`stream index`的对应关系图\n\n- `receive`时，直接在`reassembler`中插入`absolute seqno`，显然不是期待的`stream_index`；\n- `send`时，需要考虑到`available_capacity`不能超过`UINT_MAX`以及`close`时，发送的fin报文也要占据一个序号\n\n# lab3\n\n## reference link\n\n- [lab3实验手册](https://cs144.github.io/assignments/check3.pdf)\n- [博客](https://hangx-ma.github.io/2023/05/24/cs144-lab3.html)\n\n## implementation\n\n\u003e 这里参考了博客实现\n\n- 实现ARQ重传机制\n\n# lab4\n\n## reference link\n\n- [lab4实验手册](https://cs144.github.io/assignments/check4.pdf)\n- [博客](https://hangx-ma.github.io/2023/05/27/cs144-lab4.html)\n\n## implementation\n\nLab4 要求实现网络接口部分， 打通网络数据报 （Internet datagrams） 和链路层的以太网帧（link-layer Ethernet frames）\n之间的桥梁。\u003cbr/\u003e\n也就是，实现ip数据报转化为mac帧。ip数据报在转化为mac帧时，最重要的就是要知道目的mac地址，而mac地址我们可以通过arp协议来学习到。\n所以，这里就牵扯到了arp协议的实现：\n\n- 目的ip地址与mac地址的缓存映射。最多保存30s；\n- 端系统可以组装ip报文和arp请求与响应报文，也能解析之；\n- 不论是arp请求还是arp响应，端系统拿到过后都可以学习到对等端的ip的其mac地址的映射关系\n- 而且，我们并不能任性发送arp请求，我们只能等待相同的arp请求发出去5秒后没有收到arp响应才再次发送，这是为了防止频繁地arp广播导致链路阻塞\n- 端系统在接收报文时，收到ip数据报自然不用说，该怎么处理就怎么处理，但是收到arp报文时，需要进一步处理：\n    - 如果是arp请求报文\n      那么我们在校验合法性通过后，还需要学习arp请求的来源ip地址和来源mac地址的映射关系，并且构造arp响应，返回自己的ip与mac地址的映射关系，以供arp请求方学习\n    - 如果是arp响应报文\n      那么我们在校验合法性通过后，再从arp响应报文中学习到目的ip地址和目的mac地址的映射关系。除了mac地址学习外，我们还需要将arp请求等待列表清空\n- 总之，我们通过arp协议拿到了目的mac地址过后，剩下的事情就非常简单了（将ip数据报组装成mac帧，以方便发送到数据链路上\n\n\u003e 实验手册给的实现已经很详细了，翻译成代码即可。\n\n![img.png](static/img-lab4-network-interface.png)\n\n# lab5\n\n## reference link\n\n- [lab5实验手册](https://cs144.github.io/assignments/check5.pdf)\n- [博客](https://hangx-ma.github.io/2023/05/30/cs144-lab5.html)\n\n## implementation\n\nlab5的要求是在lab4实现的网络接口上，实现`ip router`.路由器有多个网络接口，可以在其中任何一个接口上接收 Internet 数据报。\n路由器的工作是根据路由表转发它获得的数据报：路由表是一个规则列表，告诉路由器对于任何给定的数据报:\n\n- 在哪个`network interface`发出去\n- 确定`next hop`\n\n\u003e 实验手册的`Q \u0026 A`中对`route table`的数据结构要求很低，允许实现O(N)时间复杂度。所以，这里直接使用`std:list\u003ctype\u003e`。\n\nlab5的要求其实很简单了。我们只需要实现路由最长前缀匹配即可，并不需要实现动态路由的一些协议（RIP、OSPF、BGP 或 SDN 控制器）\n当然除了这些，我们还需要注意：\n\n- 每次路由转发ip数据报时，ttl需要减一，直至ttl等于0时，路由器会自动丢弃它\n- 如果路由表里没有找到`next hop`，也会丢弃ip数据报\n- 如果路由的数据报缓存已满，也会丢弃掉（lab5里并没有说\n\n# lab6\n\n\u003e no code\n\n使用以前的所有实现的lab来创建一个真实的网络，其中包括网络堆栈（主机和路由器），与另一台主机上实现的网络堆栈进行通信。\n\n## how to do\n- [lab6实验手册](https://cs144.github.io/assignments/check6.pdf)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcold-bin%2Fcs144-lab","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcold-bin%2Fcs144-lab","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcold-bin%2Fcs144-lab/lists"}