前言
这是自学线上计算机课程系列经验分享的第二篇。
课程介绍
Stanford CS144 Introduction to Computer Networking 是一门经典的互联网课程。我主要的学习方式就是完成 minnow 的项目。首先我分享一些学习资源:
- 课程网站:课程的公开资源,注意每个学期内容都会在下一学期清空,因此想要学习旧的版本就要使用 Wayback Machine 等资源。
- 课程录播:课程录播不对外开放,因此我是通过 UCB CS168 Summer 2025 的视频内容来补充一些知识的。
- 线上教材:课程网站上推荐了几本经典的互联网网络教材,但是我建议只是把这些当作参考即可。课程本身附带的讲义和笔记也很详细。
- 项目代码:这是课程的 minnow 项目框架,注意这个仓库在学期结束后也会清空,因此想要学习就要寻找备份或者同步学习。
- 我没有开放我的代码实现,这也是遵循课程政策要求。此外,项目已经提供了完善的测试框架和丰富的测试用例。
学习内容总结
- 项目0是一个入门项目,第一部分是在 Stanford 课程内部的网站做一些网络访问实验例如 wget,第二部分是用 C++ 实现一个可靠的字节流。
- 项目1要求实现一个 Reassembler,也就是把乱序的 TCP 包重组好,返回一个有序的流。初次尝试时会遇到不少问题,但是讲义提供了非常详细的解释,而测试框架往往也能帮忙调试实现的问题。
- 项目2要求实现一个 TCP Receiver,主要的作用是根据传入的包序号等重组好内容,并且 回复 ACK 和窗口大小等内容给发送方。
- 项目3要求实现 TCP Sender,这是我感觉整个项目里最有挑战的一部分。这部分要求维护一个已发送的列表,并且还要根据回复结果选择重传。虽然和实际的 TCP 协议实现相比已经简化了很多,但是依然需要非常细心的考虑各种边界条件和仔细调试。实现完这四个部分后,就可以将第一部分实现的 wget 与现在的实现结合起来使用,也可以发送给课程的示例网站测试结果。
- 项目4是一个数据分析类的实验,分析实际网络下的 ping 值,RTT 等。这些分析很有意思,相信一些在中国“科学上网”的朋友会觉得有一定帮助。
- 项目5是实现一个在 TCP 层和 IP 层之间的协议 ARP 协议,目的就是把 IP 地址和向下一个发送者的 MAC 地址联系起来。这也是帮助理解互联网各个抽象层的作用和联系。
- 项目6是实现一个 Router,内部维护一个路由表,将传入的包根据路由表的匹配结果执行操作。
- 项目7是将上述这些结合起来,我是用自己本地的机器和一个云服务器互相发送消息。当真正看到 "hello world" 显示在另一端时,还是很有成就感的。
下面附上我的项目0和项目1的测试结果,这是我在 GitHub Action 上运行的: 
C++ 学习
本门课程使用现代 C++ 作为课程语言,在相当程度上减少了 C 风格的内存管理问题。学习这门课程的过程也让我熟悉了很多基本的 C++ 库函数和类模板方法等,也有助于培养比较好的编程习惯。虽然整体上看,项目的很多细节都是“面向测试用例编程”,要通过所有的测试还是要费一些心思。这门课项目也对实际的实现做了很多的简化(例如旧的 sponge 版本的 TCP Connection 就不再要求了),所以可能没有了解很多新的计算机网络概念。在这一方面我更推荐 UCB CS168 的课程视频作为知识内容补充。
评论系统尚未配置。请在 .env 中填写 giscus 所需的环境变量。