# CS144: Computer Network

## 课程简介

- 所属大学：Stanford
- 先修要求：一定的计算机系统基础，CS106L
- 编程语言：C++
- 课程难度：🌟🌟🌟🌟🌟
- 预计学时：100 小时

这门课 (开源版本视频) 的主讲人之一是网络领域的巨擘 [Nick McKeown](http://yuba.stanford.edu/~nickm/index.html) 教授。这位拥有自己创业公司的学界业界双巨佬会在他慕课每一章节的最后采访一位业界的高管或者学界的高人，非常开阔眼界。

在这门课的 Project 中，你将用 C++ 循序渐进地搭建出整个 TCP/IP 协议栈。

- `checkpoint 0` 是让你熟悉一下开发环境的 warmup lab，简单玩一玩一些网络相关的命令 (e.g., `telnet`, `netcat`)，借助 Linux Kernel 提供的 `tcp_socket` 抽象写一个基础的网络爬虫 `webget`，最后实现一个 (In-Memory) Reliable Byte Stream。
- 接下来你会在 `checkpoint 1-3` 首先实现一个简易但保留了核心语义且 (almost fully) standards-compliant 的 TCP Protocol，可以与其他 (工业级的) TCP 实现相互通信。
- 在 `checkpoint 4` 中你会通过框架代码的封装 (`TCPMinnowSocket`)，将 `checkpoint 0` 中 `webget` 默认使用 Linux Kernel 的 `tcp_socket` 替换为你自己实现的 TCP Protocol；同时会实际分析真实网络 (i.e., RTT >= ~100ms) 的流量模式，需要自己用 python 等语言进行可视化数据分析 - 我很推荐大家认真的去进行数据分析，真的很有意思。
- 过了课程的前半部分，我们会在 `checkpoint 5` 来到 TCP/IP 协议栈的最底层，你会亲自实现 `NetworkInterface`，通过 ARP 协议抹平 IP Datagram 和 Ethernet Frame 之间的沟壑。
- 最后在 `checkpoint 6` 中，你会基于先前实现的“网卡”，也就是 `NetworkInterface`，实现 IP Router，对接收到的每一个 IP Datagram 进行相对应的转发。
- 与 `checkpoint 4` 类似，`checkpoint 7` 会通过框架代码提供好的胶水 (`endtoend.cc`)，在内存里通过 `network_thread` 模拟底层的网络设施 (Network Infrastructure/Service)，把所有你前面实现过的组件串联起来，通过一个中继服务器 (`cs144.keithw.org`) 实现 Client 和 Server 之间的、每端使用自己实现的 TCP/IP 协议栈的实时通信。

这门课与其说是计算机网络课，我更愿意称其为一门年轻人最好的现代 C++ 入门课。

如果你只是 "浅尝辄止" 的写完 8 个 checkpoint (其中有两个 lab 你甚至不需要亲自写代码！😂😅)，那么这门课大部分的精华你就错过了。

我认为这门课最精华的部分就在于提供给我们的框架代码，如果不自己深入一行行的阅读每个文件，你会发现很多细节的问题一直笼罩在迷雾里，就像魔法一样！

- 比如 `checkpoint 4` 中我们到底是如何将自己实现的 `TCPSender` 和 `TCPReceiver` 拼装使用成一个 (bi-directionally) reliable byte stream 的？
- `TCPMinnowSocket` 到底是如何替换内核里默认的 TCP 实现的？
- 我们常说的三次握手去哪里了？
- 多线程的场景怎么办？
- `checkpoint 7` 提供给你的 `endtoend.cc` 你真的理解了吗？

我很喜欢[蒋炎岩教授](https://github.com/jiangyy)一直强调的，“**计算机的世界里没有魔法**” 这条 quote，上面的这些问题，你仔细读过框架代码后肯定能找到答案。

如果你是计算机网络 (System Programming) 的初学者，别忘了我们还有 O1, Claude, DeepSeek 这些 LLM 的帮助，这比十几年前 RTFM 的效率和效果都好太多了！

计算机的世界里没有魔法，去试试吧！

## 课程资源

比较不幸的是，目前 (2025.1) 这门课的 [GitHub Repository](https://github.com/CS144/minnow) 会随着每一年的进度被**直接清空**，如果你没有先前自己 fork 一份，那就只能跟着现在的进度走了。

课程网站也似乎没有官方的 Archive，每一年都是全新的，我在 Wayback Machine 上找到了课程网站上至 2021 年所有版本的独立备份，24 Winter 的网站链接是：<https://web.archive.org/web/20241209004804/https://cs144.github.io/>。

- 课程网站：<https://cs144.github.io/>
- 课程视频：<https://www.youtube.com/watch?v=r2WZNaFyrbQ&list=PL6RdenZrxrw9inR-IJv-erlOKRHjymxMN>
- 课程教材：无
- 课程作业：<https://cs144.github.io/>，8 个 Project 带你实现整个 TCP/IP 协议栈

## 资源汇总

有关 2024 年以后相对较新的，这门课的详细入门/通关指南，可以参考 [@xzhseh](https://github.com/xzhseh) 的这篇 [Standford CS144 (24 Winter) Computer Network - 可能是年轻人最好的现代 C++ 入门课](https://zhuanlan.zhihu.com/p/20551290958)。

- [PKUFlyingPig](https://github.com/PKUFlyingPig/CS144-Computer-Network)
- [Lexssama's Blogs](https://lexssama.github.io/tags/CS144/)
- [huangrt01](https://github.com/huangrt01/CS-Notes/blob/master/Notes/Output/Computer-Networking-Lab-CS144-Stanford.md)
- [kiprey](https://kiprey.github.io/tags/CS144/)
- [康宇PL's Blog](https://www.cnblogs.com/kangyupl/p/stanford_cs144_labs.html)
- [doraemonzzz](http://doraemonzzz.com/tags/CS144/)
- [ViXbob's libsponge](https://vixbob.moe/25.html)
- [吃着土豆坐地铁的博客](https://www.epis2048.net/categories/Code/Stanford-CS144/)
- [Smith](https://www.inlighting.org/archives/2021-cs144-notes/)
- [星遥见](https://www.cnblogs.com/weijunji/tag/CS144/)
- [EIMadrigal](https://www.cnblogs.com/EIMadrigal/p/15500472.html)
- [Joey](http://yuzijun.life/2021-02/CS144)
