CS144 2024 WINTER lab0(环境配置与webget)
Day 1
lab介绍
刚开始接触到这个实验的时候,我想大多数人应该和我一样,没什么头绪。仅以此博客介绍自己学习CS144的过程。
CS144的官方仓库已经被ban了, 避免了学生抄袭的现象,所以本博客贴出的所有链接均来自网络。
关于计网:那毫无疑问
请选择这本书 。
关于CS144,是美国斯坦福大学计算机网络课的课程实验,但是由于其质量之高,被世界越来越多的计算机学者作为计网实践应用的实例。本acmer退役才开始接触
实验完成时间因人而异,我身边的人大概一周左右。
既然你看到这篇博客就说明你已经初步了解了这门 实验,那废话不多说,我们直接进入正题。
环境配置
这里贴出项目文档lab0部分:check0.pdf (cs144.github.io)
以及官方课程主页CS 144: Introduction to Computer Networking后续就不再重复贴了。
Sponge documentation文档Sponge: TCPSocket Class Reference (cs144.github.io)
既然不知道做什么,那我们来阅读文档吧!就像文档里说的
0、前面部分没什么好说的,就是让你去感受一下网络的一些通信方式,但是也请仔细阅读。
![[Pasted image 20240111135910.png]]
3.1
这里介绍了实验需要的环境,请按照需要配置,现在是2024年,环境我们一站式去安装gcc显然并不可以,我们需要自己安装gcc12,按照bash给的提示安装的软件包是11,并不符合我们的需求,如果你的版本是低于要求的,我这里给出两个方案
(1)卸载原来的,重新安装新版,因为语言环境更新都是向下兼容的,所有不会出什么问题。
(2)添加软链接 这个就比较麻烦犯了,但是也不是特别麻烦,可以自行百度,通过软链接的形式规定gcc,g++各版本的优先级。参考更改gcc默认版本(gcc版本降级/升级)与update-alternatives的使用-CSDN博客
同时,cmake的版本也需要最新的版本(cmake 3.24.2以上),直接sudo snap install cmake --classic
就可以了,如果以前装了cmake,那就需要按照安装时的格式卸载,然后再装新版本。
另外他说使用Ubuntu 23.10LTS,我用的22.04.3LTS,暂时没出什么问题 ,一切测试编译没问题,如果后续实验出现问题,可以看一看是不是这个原因导致的(应该不会)。
这里就不多说环境的问题了。
代码仓库: https://github.com/cs144/minnow
注意,我们是本实验中将全程使用Linux环境,我这里的是Ubuntu22.04.3LIST,配套WSL ,gcc-12,g++-12
使用git clone 把仓库拉到本地。
然后,我们用按照文档的bash
cmake -S . -B build
创建构建代码目录
然后
cmake --build build
编译代码到100%表示我们编译成功
到这,我们第一步环境配置就初步完成。
我个人是通过github进行代码管理 ,各位也可以随着自己习惯来。例如
git init //把这个目录变成Git可以管理的仓库
git add README.md //文件添加到仓库
git add . //不但可以跟单一文件,还可以跟通配符,更可以跟目录。一个点就把当前目录下所有未追踪的文件全部add了
git commit -m "first commit" //把文件提交到仓库
git remote add origin git@github.com:wangjiax9/practice.git //关联远程仓库
git push -u origin master //把本地库的所有内容推送到远程库上
这些就是git的题外话了,总之选择一个自己合适的代码管理方式是必要且高效的。
3.2
这里介绍的是实验的代码规范
禁用动态内存分配(malloc&free、new&delete)
禁用裸指针、如果要用指针就用智能指针,不过看提示说CS144不太用得到指针
避免模板、线程、锁、虚函数,说CS144用不到这些
避免使用C风格字符串和C的那一套str-函数,用std::string代替
避免使用C风格cast,用static_cast代替,不过CS144一般用不到
尽量使用const引用传参
函数和变量能用const修饰则用const修饰
避免使用全局变量,把变量限定在尽可能小的作用域里
使用cmake --build build --target tidy
获取代码建议,cmake --build build --target format
去格式化
都是比较常规的代码规范,没什么好说的,对了,如果你的IDE对某些函数报警(报错)(例如string_view),请把IDE的语言环境调成C++20以上,在设置里搜cppstandard
就可以了,很简单。
3.3
这里让我们去读util/socket.hh and util/file descriptor.hh.这两个文件代码,读基本的一些继承关系以及一些套接字基础函数的封装,这里每个人读的时候体会不一样,这里不做赘述。可以参考这个文档Sponge: Main Page (cs144.github.io)
主要就是这几个东西。
3.4
到这我们就可以开始写代码了。
他让我们实现一个webget在../apps/webget.cc的get URL里面写。回过头来,不知你是否做了2.1的动手部分,让你去发起一个http请求,请求网页信息,其实这里就是实现这一部分。
我们按照2.1的步骤做一下2.1的动手部分。
Assignment就是把/hello换成/lab0/sunetid就可以了。
2.3就是实现一个双工通信,可以自己体验一下。
好了,有点跑题了,回过头来,我们来写代码吧!
他巴拉巴拉说了一堆,我非几个事情
1.使用TCPSocket和Address类,在HTTP中,每一行都必须以“\r\n”结尾,要包含“Connection: close”告诉服务器请求结束,否则服务器会进行回复,确保读取并打印来自服务器的所有输出,直到套接字达到“EOF”为止。
客户端TCP模拟http发送GET的格式为
GET请求方式+空格+路径+空格+HTTP/1.1
没什么问题了我们开始写了就可以。
我们在build目录下make check_webget
来跑测试点
这就表示我们已经通过了所有测试点。那么3.4这块我们就很轻松地完成了,主要就是让我们熟悉一下过程。