前言

这是自学线上计算机课程系列经验分享的第二篇。

 

课程介绍

Stanford CS144 Introduction to Computer Networking 是一门经典的互联网课程。我主要的学习方式就是完成 minnow 的项目。首先我分享一些学习资源:

  1. 课程网站:课程的公开资源,注意每个学期内容都会在下一学期清空,因此想要学习旧的版本就要使用 Wayback Machine 等资源。
  2. 课程录播:课程录播不对外开放,因此我是通过 UCB CS168 Summer 2025 的视频内容来补充一些知识的。
  3. 线上教材:课程网站上推荐了几本经典的互联网网络教材,但是我建议只是把这些当作参考即可。课程本身附带的讲义和笔记也很详细。
  4. 项目代码:这是课程的 minnow 项目框架,注意这个仓库在学期结束后也会清空,因此想要学习就要寻找备份或者同步学习。
  5. 我没有开放我的代码实现,这也是遵循课程政策要求。此外,项目已经提供了完善的测试框架和丰富的测试用例。

学习内容总结

  1. 项目0是一个入门项目,第一部分是在 Stanford 课程内部的网站做一些网络访问实验例如 wget,第二部分是用 C++ 实现一个可靠的字节流。
  2. 项目1要求实现一个 Reassembler,也就是把乱序的 TCP 包重组好,返回一个有序的流。初次尝试时会遇到不少问题,但是讲义提供了非常详细的解释,而测试框架往往也能帮忙调试实现的问题。
  3. 项目2要求实现一个 TCP Receiver,主要的作用是根据传入的包序号等重组好内容,并且 回复 ACK 和窗口大小等内容给发送方。
  4. 项目3要求实现 TCP Sender,这是我感觉整个项目里最有挑战的一部分。这部分要求维护一个已发送的列表,并且还要根据回复结果选择重传。虽然和实际的 TCP 协议实现相比已经简化了很多,但是依然需要非常细心的考虑各种边界条件和仔细调试。实现完这四个部分后,就可以将第一部分实现的 wget 与现在的实现结合起来使用,也可以发送给课程的示例网站测试结果。
  5. 项目4是一个数据分析类的实验,分析实际网络下的 ping 值,RTT 等。这些分析很有意思,相信一些在中国“科学上网”的朋友会觉得有一定帮助。
  6. 项目5是实现一个在 TCP 层和 IP 层之间的协议 ARP 协议,目的就是把 IP 地址和向下一个发送者的 MAC 地址联系起来。这也是帮助理解互联网各个抽象层的作用和联系。
  7. 项目6是实现一个 Router,内部维护一个路由表,将传入的包根据路由表的匹配结果执行操作。
  8. 项目7是将上述这些结合起来,我是用自己本地的机器和一个云服务器互相发送消息。当真正看到 "hello world" 显示在另一端时,还是很有成就感的。

下面附上我的项目0和项目1的测试结果,这是我在 GitHub Action 上运行的: benchmark

C++ 学习

本门课程使用现代 C++ 作为课程语言,在相当程度上减少了 C 风格的内存管理问题。学习这门课程的过程也让我熟悉了很多基本的 C++ 库函数和类模板方法等,也有助于培养比较好的编程习惯。虽然整体上看,项目的很多细节都是“面向测试用例编程”,要通过所有的测试还是要费一些心思。这门课项目也对实际的实现做了很多的简化(例如旧的 sponge 版本的 TCP Connection 就不再要求了),所以可能没有了解很多新的计算机网络概念。在这一方面我更推荐 UCB CS168 的课程视频作为知识内容补充。

评论系统尚未配置。请在 .env 中填写 giscus 所需的环境变量。