CS144

整体参考https://www.cnblogs.com/kangyupl/p/stanford_cs144_labs.html;https://juejin.cn/post/6929693406528536583#heading-6

整体实验来自https://cs144.github.io/

查重可以参考 https://github.com/jplag/jplag;简略说明:https://canjuly.github.io/2019/04/15/JPlag/

Lab0

工作量 5-8小时 可能?

  1. 虚拟机安装

    安装虚拟机镜像之后,记得修改内存,处理器;

    在windows terminal 使用ssh -p 2222 cs144@localhost,或者在mobaxterm 访问地址为127.0.0.1 名称为cs144 端口号为22的session

    GUI:sudo apt-get install --reinstall lightdm

    启动GUIsudo systemctl start lightdm

  2. Networking by hand

    1. 访问 http://cs144.keithw.org/hello

      如果不想安装图形界面,可以安装w3m,然后使用w3m http://cs144.keithw.org/hello访问网页

    2. 使用telnet访问http://cs144.keithw.org/hello 的时候要注意根据文件提示使用

      如果用了退出键会进入telnet >

    3. 发邮件那个实验可以参考163邮箱发邮件这个博客

      https://blog.csdn.net/qq_33862644/article/details/79339532

      qq邮箱参考 https://www.cnblogs.com/cthon/p/9151467.html

      以下是QQ邮箱:

      1. base64编码:

        601576661 NjAxNTc2NjYx

        amd1dXd6ZnN3dG1uYmNn??== 这个由设置-> 账户-> POP3/ SMTP服务开启之后得到的权限码获得的 然后经过base64编码之后的产物,最后两位5我用??代替

      2. 操作过程

        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
        34
        cs144@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退出
    4. netcat 小实验 体验一下,可以用tmux分屏

  3. Writing a network program using an OS stream socket

    1. 这块需要阅读文档,重点要阅读TCPSocket 里面的样例

      具体实现不是那么复杂

    2. 有可能有必要演示怎么debug 用vscode+插件

  4. An in-memory reliable byte stream

    1. 这块编程是C++ 11;可能预先需要讲一下面向对象?https://github.com/0voice/cpp_new_features
    2. 需要提示一下STL库啥的

Lab1

  1. 比较复杂,为了提高速度需要利用STL的set或者其他基于红黑树的数据结构
  2. 任务目标是实现一个流重组器(stream reassembler),可以将带索引的字节流碎片重组成有序的字节流。
  3. 可能需要提前教授GDB,或者VS code 代码调试的方法
  4. 大概需要1-2天 5-10小时
  5. 建议提示使用STL set,可能得给一个类似于线段树的数据结构?

Lab2

  1. 实现TCP Receiver,这是TCP实现中处理传入字元流的部分。TCPReceiver在传入的TCP段(通过Internet携带的数据报的有效负载)和传入的字节流之间进行转换;

    总的来说接收端除了写入到来的流,还有两个工作:

    1. 告诉发送端ackno; This is the first byte that the receiver needs from the sender.
    2. 告诉发送端window size:the distance between the “first unassembled” index and the “first unacceptable” index
  2. 第一部分是实现wrapping_integers,这个用途是实现序列号、绝对序列号与流索引间的转换。

    这一部分不是很困难,我觉得1个小时连带搜索应该可以解决;如果要提示的话可以提示比特运算,与或什么的;同时可以提供C++四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast 这类作为写32位数字的提示;另外需要提醒他们查一查位运算,比如bithacks,无符号长整型1(1ul);

  1. 第二部分时实现TCP_receiver;这部分会讲TCP段的格式,需要实现一个接收器,基于滑动窗口算法;

    1. 文档比较丰富,这块会比较花时间;与此同时 细节比较多

    2. segment_received接口从bool改成了void;

      之前的如果段的任何部分在窗口内,则返回true;现在直接是void;这部分业务工作不确定是不是调整到了lab4;讲义中并没有找到;

    3. 事实上我做的时候觉得没有博客那么复杂,因为减少了一个判断在不在窗口这个部分;实际上要考虑的就是SYN,初始化ISN,计算要装入Lab1 ressembler里面的东西的index以及payload即可;

Lab3

  1. 本节比较复杂,需要花一段时间理解逻辑

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 里面也有用到服务器的地方;