CS144
整体实验来自https://cs144.github.io/
查重可以参考 https://github.com/jplag/jplag;简略说明:https://canjuly.github.io/2019/04/15/JPlag/
Lab0
工作量 5-8小时 可能?
虚拟机安装
安装虚拟机镜像之后,记得修改内存,处理器;
在windows terminal 使用
ssh -p 2222 cs144@localhost
,或者在mobaxterm 访问地址为127.0.0.1 名称为cs144 端口号为22的sessionGUI:
sudo apt-get install --reinstall lightdm
启动GUI
sudo systemctl start lightdm
Networking by hand
访问 http://cs144.keithw.org/hello
如果不想安装图形界面,可以安装w3m,然后使用
w3m http://cs144.keithw.org/hello
访问网页使用telnet访问http://cs144.keithw.org/hello 的时候要注意根据文件提示使用
如果用了退出键会进入
telnet >
发邮件那个实验可以参考163邮箱发邮件这个博客
https://blog.csdn.net/qq_33862644/article/details/79339532
qq邮箱参考 https://www.cnblogs.com/cthon/p/9151467.html
以下是QQ邮箱:
base64编码:
601576661 NjAxNTc2NjYx
amd1dXd6ZnN3dG1uYmNn??== 这个由设置-> 账户-> POP3/ SMTP服务开启之后得到的权限码获得的 然后经过base64编码之后的产物,最后两位5我用??代替
操作过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34cs144@cs144vm:~$ telnet smtp.qq.com 25
Trying 203.205.232.7...
Connected to smtp.qq.com.
Escape character is '^]'.
220 newxmesmtplogicsvrsza28.qq.com XMail Esmtp QQ Mail Server.
helo larry
250-newxmesmtplogicsvrsza28.qq.com-10.62.17.92-20691606
250-SIZE 73400320
250 OK
auth login
334 VXNlcm5hbWU6
NjAxNTc2NjYx
334 UGFzc3dvcmQ6
amd1dXd6ZnN3dG1uYmNn??==
235 Authentication successful
mail from:<601576661@qq.com>
250 OK.
rcot to:<492671684@qq.com>
502 Invalid input from 100.107.4.130 to newxmesmtplogicsvrsza28.qq.com
rcpt to:<492671684@qq.com>
250 OK
data
354 End data with <CR><LF>.<CR><LF>. //注意这个是end data的方法
to: hello //这个显示出来是 发件人: hello
from: test //这个显示出来是 收件人: test
subject: this is a test.//这个是标题
hello telnet
.
250 OK: queued as.
502 Invalid input from 100.107.4.130 to newxmesmtplogicsvrsza28.qq.com
quit//使用quit退出
netcat 小实验 体验一下,可以用tmux分屏
Writing a network program using an OS stream socket
这块需要阅读文档,重点要阅读TCPSocket 类 里面的样例
具体实现不是那么复杂
有可能有必要演示怎么debug 用vscode+插件
An in-memory reliable byte stream
- 这块编程是C++ 11;可能预先需要讲一下面向对象?https://github.com/0voice/cpp_new_features
- 需要提示一下STL库啥的
Lab1
- 比较复杂,为了提高速度需要利用STL的set或者其他基于红黑树的数据结构
- 任务目标是实现一个流重组器(stream reassembler),可以将带索引的字节流碎片重组成有序的字节流。
- 可能需要提前教授GDB,或者VS code 代码调试的方法
- 大概需要1-2天 5-10小时
- 建议提示使用STL set,可能得给一个类似于线段树的数据结构?
Lab2
实现TCP Receiver,这是TCP实现中处理传入字元流的部分。TCPReceiver在传入的TCP段(通过Internet携带的数据报的有效负载)和传入的字节流之间进行转换;
总的来说接收端除了写入到来的流,还有两个工作:
- 告诉发送端ackno; This is the first byte that the receiver needs from the sender.
- 告诉发送端window size:the distance between the “first unassembled” index and the “first unacceptable” index
第一部分是实现wrapping_integers,这个用途是实现序列号、绝对序列号与流索引间的转换。
这一部分不是很困难,我觉得1个小时连带搜索应该可以解决;如果要提示的话可以提示比特运算,与或什么的;同时可以提供C++四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast 这类作为写32位数字的提示;另外需要提醒他们查一查位运算,比如bithacks,无符号长整型1(1ul);
第二部分时实现TCP_receiver;这部分会讲TCP段的格式,需要实现一个接收器,基于滑动窗口算法;
文档比较丰富,这块会比较花时间;与此同时 细节比较多
segment_received接口从bool改成了void;
之前的如果段的任何部分在窗口内,则返回true;现在直接是void;这部分业务工作不确定是不是调整到了lab4;讲义中并没有找到;
事实上我做的时候觉得没有博客那么复杂,因为减少了一个判断在不在窗口这个部分;实际上要考虑的就是SYN,初始化ISN,计算要装入Lab1 ressembler里面的东西的index以及payload即可;
Lab3
- 本节比较复杂,需要花一段时间理解逻辑
Lab4
复刻的困难是这个用到了斯坦福的服务器,具体看https://github.com/CS144/sponge/blob/lab4-startercode/tun.sh;服务器的配置在https://github.com/CS144/sponge/blob/lab4-startercode/etc/tunconfig;他们的服务器是169.254.1.1/24 可能也有169.254.1.0/24;
另外在https://github.com/CS144/sponge/blob/lab4-startercode/txrx.sh 里面也有用到服务器的地方;