【计算机网络】Stanford CS144(原实验相关内容已删)

15 篇文章 1 订阅
6 篇文章 0 订阅
  • 原博客内容已删,仅仅保留环境配置和一些调试的记录。原因如下: 写的质量很差,代码是有问题的,浪费别人看博客的时间,同时也会误导大家,影响大家写代码的思路。
  • 只要不能保证每次跑测试都稳定通过lab4,实际上实现的就是有问题的。我和朋友讨论的结果是,必须把状态图上的所有内容都清楚每步是啥样的该做什么,才能最终完全写对。实现的时候虽然pdf上说了不要求记录状态,我代码主体思路是没记录状态,但是实际上我跑十几次lab4就会发现有失败的现象。然后打日志自己手动跑测试调用的脚本的时候发现,由于FIN交错,实际上状态转换图上的所有状态和每条路线都是有可能被走上去的。实现的Tcp应该保证完全遵从tcp状态图,不然边边角角的样例迟早会出错,因此就产生了矛盾,我重构完全按照状态转换搞。
  • 体会:这个实验给我的感觉是,lab4完全通过之前写的啥都不一定是正确的,如果做完lab4对tcp状态转换图不能非常熟悉(不止是能看懂,还要了如执掌),那实现多半就是错的。尽管我跑lab4十几次都能连续通过,代码依然代码是有问题的。
  • 实验的过程中发生了如下timeout的情况,和朋友讨论应该是Linux的tcp的协议和我们的不够匹配。(红线圈出来那一行探测窗口的包丢了就会造成tcp废了),按照我们实现的逻辑,后续那些探测窗口的包应该重传的是bytes=4的包,而不是一个空包)。(尝试让我们的Tcp兼容这个集成测试(linux socket?),但是往往过不去之前的单元测试)。不过我保留这个问题只要不把扩大窗口的包丢了就依然可以通过所有测试。
    在这里插入图片描述
    仓库,其中sponge-v1-fai分支是我重构之前的代码,可能有其他bug,但是打开被注释掉的日志足以把上图的关于linux socket的行为给展现出来。master分支是重构之后的代码。
    在这里插入图片描述

环境搭建

开始时,我使用的是ubuntu16.04,apt下载的gcc版本较低,中间make编译时发现gcc要求8+(lab0的pdf也明确说明),装了半天没成功于是又装了一个ubuntu20.04。之后参考课程网站lab0的pdf,在git上clone项目即可开始实验。
如果编译无法通过,则需要下载下述的包。可以参考Ubuntu下libpcap安装步骤

LAB0

Networking by hand

Fetch a web page

使用telnet 发送http(命令中http换成80也是可以的)请求,需要注意的最后一行需要输入一个回车
在这里插入图片描述

Send yourself an email

可以尝试使用国内的邮箱,稍微比文档中的要麻烦一些。

Writing a network program using an OS stream socket

本次lab的核心,分别是实现一个get_URL函数以及完成一个字节流控制类,在开始之前,最好仔细读一下PDF。有详细的文档、作业要求以及对于C++的使用有一些要求。

Writing webget

实现webget,这是一个使用操作系统的TCP支持和流套接字抽象在Internet上提取网页的程序,就像上面使用telnet进行的操作一样。
webget.cc

void get_URL(const string &host, const string &path) {
    TCPSocket sock1;
    sock1.connect(Address(host, "80"));
    std::string recv, send;
    send = "GET " + path + " HTTP/1.1\r\nHost: " + host + "\r\n\r\n";
    sock1.write(send);
    while (sock1.closed() == false && sock1.eof() == false) {
        sock1.read(recv);
        std::cout << recv;
    }
    sock1.close();
}

调试方法论

此节参考了【计算机网络】Stanford CS144 学习笔记

  • 步骤
  1. 安装vscode以及插件Remote-SSH(以及其他插件比如:C/C++有代码补全和跳转功能)
  2. 通过远程连接虚拟机后,可以设置调试配置文件如下:(比如调试fsm_stream_reassembler_overlapping这个样例)
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++-9 - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            //"program": "${fileDirname}/../build/tests/${fileBasenameNoExtension}",
            //"program": "/home/wangqi/cs144/sponge/build/tests/fsm_stream_reassembler_single",
            "program": "/home/wangqi/cs144/sponge/build/tests/fsm_stream_reassembler_overlapping",	//对应要调试的程序
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            //"preLaunchTask": "C/C++: g++-9 build active file",	//注释掉
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}
  1. 之后就可以打断点进行调试!(我调试时候发现LAB1中断点打在下图的文件上时调试比较方便)本来打算参考那个博主打在fsm_stream_reassembler_overlapping.cc样例源文件上,但是可能编译时候进行优化了,该代码上的断点经常打不上,而且报错的位置也有问题。
    在这里插入图片描述

参考

课程网址
知乎
【计算机网络】Stanford CS144 学习笔记

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值