【中文精翻】【斯坦福大学】CS144 计算机网络介绍!!!
在斯坦福大学,CS144是网络世界的大门。这门课程不仅传授网络系统的根基原理和框架,更是探索计算机网络核心概念的摇篮。IP、TCP、路由,这些网络骨架的秘密将被揭示,而学子们将会深入了解网络构建、管理和维护的神秘奥秘,以及数据在这个网络舞台上的华丽演绎。 CS144采用炼金术般的教学模式,融合理论授课、资料阅读、编程挑战和实验探索,助力学生深度探究计算机网络的魅力。这门课程要求学生进行一系列项目和作业,可能包括网络协议的创新设计、仿真模拟和深度分析,唤醒学子们将理论知识嵌入实际的巧思。 换而言之,CS144旨在孕育学生对计算机网络的深刻理解,为他们奠定构建、管理和优化网络系统的必备基石和技能。在这个网络狂潮中,CS144为学子们描绘出一幅璀璨的网络未来图景。
斯坦福大学的CS144课程中,Lab0是计算机网络实验的开端。这个实验旨在帮助学生熟悉课程所使用的开发环境,并为接下来的实验做好准备。Lab0通常包含以下几个主要方面:
Lab0通常作为课程的起步,有助于让学生熟悉实验的工作流程、学习使用必要的工具和资源,并确保他们具备开始进行后续更复杂实验所需的基本技能和环境。
1 学习如何获取一个网页的内容 2 学习如何实现简单的客户端-服务端的同步与监听 3 学习编写简单的网络程序 4 学习实现内存中的简单可靠字节流传输
1 我们在此编写一个简短的程序,通过互联网获取一个网页,利用VMware Workstation Pro提供的功能:在两个程序之间创建一个可靠的双向无序字节流的能力,使其中一个在我们的计算机上运行,另一个在互联网上的另一台计算机上运行(例如,Apache或nginx等Web服务器,或netcat程序)。这种被称为流套接字的功能提供尽最大努力传输的服务。
2 我们会看到了可靠的无序字节流的抽象是如何在互联网上进行通信的,尽管互联网本身只提供”不可靠的”数据报的服务。接着,我们将在计算机中实现一个提供这样的功能: 字节在”输入”端写入,并可以从”输出”端以同样的顺序读取。字节流是无限的:写者可以结束输入,然后就不能再写了。当读者读到流的末端时,它将到达”EOF”(结束),不再有更多的字节可以被读取并且这种传输是可靠的。
1 获取一个网页的内容
(1)当我们在浏览器输入网址:🔔http://cs144.keithw.org/hello,我们得到的页面如图1-1所示。现在,我们需要在虚拟机上以命令行的形式获取这个页面的内容。
图1-1 浏览器浏览页面内容
(2)在命令行输入telnet cs144.keithw.org http。这段命令告诉telnet程序在你的计算机和服务器(名为cs144.keithw.org)之间打开一个可靠的字节流,并在该计算机上运行一个特定的服务:“http”服务,即万维网使用的超文本传输协议。
telnet cs144.keithw.org http
(3)输入GET /hello HTTP/1.1。这段命令告诉服务器我们想获取的页面的路径部分(/hello),且获取方式为get,采用的协议版本是HTTP/1.1。
GET /hello HTTP/1.1
(4)输入Host: cs144.keithw.org。这将告诉服务器URL的主机部分。
Host: cs144.keithw.org
(5)输入Connection: close。这告诉服务器在传送完HTML页面后就将连接关闭。
Connection: close
(5)再按一次回车键 ,这告诉服务器我们已经完成了HTTP请求。结果如图1-2所示。可以看到,我们得到了该页面的内容为”Hello,cs144”。
图1-2 命令行结果
2 监听和连接
(1)在前面的实验中,我们发现可以将telnet视为一个客户端程序,它可以向外连接到其他计算机上运行的程序。那么,我们现在可以尝试做一个简单的服务器(等待客户连接的程序)
(2)输入命令” netcat -v -l -p 9090”。 netcat可以在两台设备上面相互交互,即侦听模式/传输模式。-v表示显示监听得到的全部的信息,-l表示使用这个命令行窗口监听入站信息,充当服务器的角色;-p 9090表示使用9090端口。
netcat -v -l -p 9090
(3)打开另外一个命令行窗口,输入命令”telnet localhost 9090”,此时该窗口充当主机的角色,与服务器共享同一个端口9090,这样,服务器与主机之间就可以进行简单的通信。
telnet localhost 9090
(4)现在我们在任意一个窗口输入信息。比如此处我们在服务器端输入123、456,如图1-3所示。
图1-3 服务器端的输入
主机端的显示与服务器一致,如图1-4所示。
图1-4 主机端的显示
3 使用套接字编写网络程序
(1)输入命令”git clone https://github.com/cs144/sponge”以获取一个名为”Sponge”的启动代码库的源代码。运行结果如图1-5所示。
git clone https://github.com/cs144/sponge
图1-5 运行结果
(2)输入”cd sponge”进入实验目录,输入”mkdir build” 创建一个目录来编译实验软件,输入”cd build” 进入build目录,输入”cmake ..” 设置build系统,结果如图1-6所示。
cd sponge
mkdir build
cd build
cmake ..
图1-6 运行结果
(3)打开webget.cc文件,将代码修改,如图1-7所示。代码源码见附录。
图1-7 代码细节
(4)输入make进行编译,编译结果如图1-8所示。
图1-8 编译结果
(5)输入./apps/webget cs144.keithw.org /hello 进行测试,测试结果如图1-9所示。
./apps/webget cs144.keithw.org /hello
图1-9 测试结果
(6)输入make check_webget测试样例,测试结果如图1-10所示。可以看到,所有的测试样例都通过。
make check_webget
图1-10 测试结果
3 实现内存中的可靠字节流
(1)输入命令”../libsponge/byte_stream.hh”进入编辑,将代码修改图1-11所示。代码源码见附录。
../libsponge/byte_stream.hh
图1-11 Byte_stream.hh
(2)输入命令”vi ../libsponge/byte_stream.cc”进入编辑,修改代码如图1-12所示。代码源码见附录。
vi ../libsponge/byte_stream.cc
图1-12 代码细节
(3)对文件进行编译,编译结果如图1-13所示。
图1-13 编译结果
(4)输入make_checklab0进行检查,结果如图1-14所示。可以看出,所有测试样例都通过。
make_checklab0
图1-14 Check结果
1 起初在开始cs144实验前,我们需要在计算机上利用虚拟机(这里我们使用VMware Workstation Pro工具)打开cs144_vm.ova,并且在里面安装了可视化界面,这里基本上按照流程即可解决故不作赘述。
2 lab0的实验一为“Fetch a Web page”(获取网页),以往我们使用web浏览器访问该网页只需输入网址“ http://cs144.keithw.org/hello”进入后即显示内容“Hello, CS144!”,而在虚拟机上进行访问则需输入“ telnet cs144.keithw.org http”这会告诉telnet program在本地计算机和服务器(名为cs144.keithw.org)之间打开一个可靠的字节流,并在该计算机上运行特定协议:“http”协议,用于万维网使用的超文本传输协议。这里需要特别注意连接后需要较快的输入指令否则会默认超时进而退出与服务器的交互过程。
3 实验二为“ Listening and connecting”(倾听和连接),由于需要做到交互我们打开两个终端窗口,输入“netcat -v -l -p 9090”的窗口模拟服务器,输入“telnet localhost 9090”的窗口模拟客户,成功建立连接后在一端输入的信息会在另一端进行打印,实现互连通信的功能。
4 实验三为“Writing a network program using an OS stream socket”(使用OS流套接字编写网络程序),因为在网络层的IP协议信息交互为尽最大努力不能保证准确,而传输层的TCP协议需要确保信息的可靠性,所以需要使用socket完成双向的可靠字节流传输服务。这里在webget.cc文件首先需要创建一个TCPSocket,只要管道未关闭就需要从管道内提取发送的消息,所以这里使用了while循环进行判断,直到eof结束,这里需要注意空格,特别容易出错。
5 实验四为“An in-memory reliable byte stream”(实现内存中可靠的字节流)。需要做到字节流(有限的)在input()写入并以相同顺序在output()读取(读到字节流末端不能继续读取,到达eof结束),这里我们使用链表完成处理比容量capacity更多的字节流对于写:实现相关的函数有write、remain_capacity、end_input、set_error。对于读:实现相关的函数有pop_output、read、input_enced、eof、error、buf_size、buf_empty、bytes_writen、bytes_read,需要注意的是Eof表示写数据已经关闭即(end_input为true)且缓存无数据(buf_empty为true)。
斯坦福大学的CS144实验从Lab0到Lab7涵盖了广泛的网络系统和计算机网络主题。Lab0往往是介绍性的,可能涉及设置实验环境和初步概念。逐步进入Lab1至Lab7,学生将涉及更深层次的网络协议、编程和系统设计。