Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475
在Stanford CS144的课程实验Lab0~Lab4中,我们动手实现了一个自己的TCP协议,并且能够真的与互联网通信!此外,感谢Stanford开源本实验并提供了大量的优质测试用例,使得我们仅仅通过互联网就能获取到这么好的学习资源。

本篇博客将从我自己的角度出发简单介绍TCP协议,阐述实现的难点以及在实验过程中的收获。

什么是TCP?

正式的定义以及计网相关的基础知识请读者自行stfw,在此我只简单地从自己角度阐述。

  • 从网络协议抽象层来看,TCP是一个传输层协议,用于实现不同主机上进程与进程之间的通信。
  • 从TCP提供的服务来看,TCP是可靠数据传输协议,保证将输入的数据保序、保真、不丢失地输出到指定位置。
  • 从TCP的核心思想来看,TCP依托于底层不可靠的网络层协议来实现可靠传输,其中的很多设计具有深刻内涵。

TCP的设计有哪些思想?

作为对本课程实验设计者的尊重,本篇博客不会涉及具体的思路,更不会展示代码。我只想聊一聊主要方向。

在深入TCP细节之前,让我们来做一个简单的思维实验:双军问题

在一场攻城战中,己方的两位将军只能派遣信使穿越敌方领土来相互交流。信使可能被逮捕,但他们想要确定一个一起进攻的时间。请问两位将军采取什么策略才能确定一个100%两人都会进攻的时间呢?

将军AAA派遣信使传递消息M1M1M_1,将军BBB收到后传递M2M2M_2回复。为了使得BBB确信M2M2M_2被收到,AAA又需要发送M3M3M_3…

可以证明,这个问题是无解的。

其实,TCP要解决的就是这样的难题。网络层协议是不可靠的,TCP为了确认数据可靠到达,不得不采取回复机制,即发送方只有正确收到接收方的回复才能确认该数据送达。但回复机制最终还是要面临上述难题————TCP的两端必须确保自己、对方都希望终止连接才能退出。

为了解决这一难题,TCP采用了工程化的办法将误判的概率降到极低。如下图所示,最后一个报文的发送方会等待一段时间(linger time). 如果这段时间里对方没有发送要求重传的报文则默认对方已收到报文。

思考:如上图所示,先接收到结束信号的主机可以不在最后等一段时间,为什么?

除了结束时的确认机制外,TCP还有很多机制确保数据可靠传输同时保证性能:

  • 如上文所说的,为了确认单个报文正确送达引入应答机制
  • 为了确保报文之间有序引入计数器机制
  • 为了提高效率而不是“一问一答”,引入流水线机制,并通过滑动窗口、回退等技巧保证正确性
  • 为了辨别报文丢失和网络拥堵,引入计时机制,同时为了不断逼近当前网络拥堵情况采用指数上升、线性下降法动态调整计时。

TCP是一个经典且有效的协议,其设计者早在如今的因特网普及之前就提出了相关思想并因此获得图灵奖。我们在学习网络协议的时候,更重要的是学习这个系统的抽象机制以及各抽象层的设计思想,TCP正是一个巨大的思想宝库。但由于其过于经典,关于它的文章、教材数不胜数,我就不在此一一赘述上述机制的细节了,感兴趣的读者可以自行学习。

CS144如何组织实验?

国内高校的一些课程最不合理的一点就是学习与实践分离实践与现实疏远。下面我很主观地做一些对比:

课程主要目标:学习C语言程序是怎样最终运行起来的?

  • A课程:动手写一个计算机系统模拟器,设计指令集、运行环境、简易操作系统,并最终能运行真实的程序甚至仙剑奇侠传;动手能力强的同学甚至可以用不同方式实现同一抽象层。实践占评分大部分。
  • B课程:只有理论课没有实验作业,教材提供的现成模拟器运行的是自创的及其简易的指令集,只能完成一些算术运算操作。期末考背书题占比极高。

课程主要目标:学习计算机硬件组成及设计

  • A课程:动手写一个芯片!如果顺利还能成功流片拿到实物。
  • B课程:不依托具体指令集讲一些计算机组成中抽象的概念,作业考试大部分都是计算读写速率,平时实验虽然很贴合课程内容,但写成之后唯一的作用就是通过测试用例。

根据我的调查,美国很多大学的课程及其注重实践。比如Stanford CS144学网络,8个Lab就是实现各种网络协议,能够真正和互联网通信;CMU 15-445学数据库设计,Lab就是实现一个完整的的数据库管理系统并管理两百多万条数据…

诚然,这样的实验需要大量的精力去设计,但其对于学生的教育和鼓舞也是极大的。幸运的是国内也有很多优秀的人才做出了这方面的贡献(南大ics、os,一生一芯等)。作为一个资质平平的学生,我可能没有能力为国内计算机教育事业贡献自己,但我希望能尽自己的努力让身边的同学知道有更好的课程,计算机教育不只是自学,不只是背书,不只是调包。

下面回到正题,CS144是怎么把这个实验组织起来使得学生既不需要关注与OS、硬件等交互的细节,又能真正写出一个work的程序的呢?

这张图是他们的实验组成。

在Lab0中,我们调用Linux的TCPSocket实现了自己的wget程序

Lab1~Lab4中,我们实现了自己的TCPConnection并最终替换了上面的Socket使得Lab0中的wget运行在自己的TCP上与互联网连接。

CS144把TCP的实现分为两大部分,Socket和Connection,其中Socket由框架代码直接给出(主要涉及与底层、OS交互,不是TCP的重点),Connection又分为Sender、Receiver两部分让同学分时完成。

这样做一方面降低了实验难度,另一方面也保证了实验成果的有用性。

除此之外,CS144开源了大量的测试用例,其测试脚本编写的也及其易懂、好用,很值得学习。

CS144提供的测试用例覆盖度及其广泛,这在一定程度上确保了自己实现的TCP的鲁棒性。每个实验都会用到之前的代码,很多之前已经通过的代码之后还会找出BUG。在完成Lab4后,大量的测试用例模拟了真实网络环境中的各种情境,如果没有真正理解TCP的每一处细节,很难通过。最后,在自己写的协议上与互联网通信,既是一种收获,也是一次测试(是的,即使通过了所有用例还可能会出现新的bug).

总而言之,CS144通过合理的抽象让学生关注于任务的重心,通过划分降低实验难度,提供大量用例提升实验质量,最终成果也让人颇感欣慰。

总结

  • 这几个实验其实代码量并不大(一共不超过500行),但花了我三四天的时间。现在想来,还是没有在一开始理解TCP的很多细节,做的时候存在大量的面向用例编程行为。
  • 这次实验再次让我明白了基础设施的重要性(看来PA还是没吃够苦头),gdb、wireshark等设施也是后面printf大法不管用才想起来。
  • 通过这次实验,我更坚定了自己学以致用的学习策略。即学到了什么通过实践检验,学得怎么样通过实践效果评判,不读死书。因此之后可能会开数据库的新坑…
  • 再次感受到自己能力的不足…还需要再努力寻找更好的学习方法呀

我的水平有限,以上各部分内容难免有疏漏、主观臆断的部分,如有错误、冒犯请指出,感激不尽

动手学TCP——CS144实验感想相关推荐

  1. 自己动手学TCP/IP--ICMP(ping报文)

    ping是ICMP的一种,是用来检查网络是否通畅或者网络连接速度的命令. 报文长度(98bytes)= 以太网头(14bytes)+ IP头(20bytes)+ICMP头(8)+ ICMP数据内容(5 ...

  2. 计算机网络云南大学实验四,云南大学软件学计算机网络原理实验四.doc

    云南大学软件学计算机网络原理实验四 实验四.web服务器套接字编程实验指导 1.实验目的: 编写一个WEB服务器程序,可以接受来自浏览器的访问,并传输页面(包含多个对象)到浏览器.掌握Socket编程 ...

  3. 送10本今年最火的《动手学深度学习》

    点击我爱计算机视觉标星,更快获取CVML新技术 52CV曾经多次介绍FlyAI机器学习竞赛平台,不少粉丝也曾在FlyAI拿到现金奖励. 本次52CV & FlyAI联合送书,CV君查找了两天, ...

  4. 伯禹公益AI《动手学深度学习PyTorch版》Task 07 学习笔记

    伯禹公益AI<动手学深度学习PyTorch版>Task 07 学习笔记 Task 07:优化算法进阶:word2vec:词嵌入进阶 微信昵称:WarmIce 优化算法进阶 emmmm,讲实 ...

  5. (d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(3)前言(介绍各种机器学习问题)以及数据操作预备知识Ⅲ(概率)

    开源项目地址:d2l-ai/d2l-zh 教材官网:https://zh.d2l.ai/ 书介绍:https://zh-v2.d2l.ai/ 笔记基于2021年7月26日发布的版本,书及代码下载地址在 ...

  6. 【动手学强化学习】DDPG+HER

    代码参考自动手学强化学习(jupyter notebook版本):https://github.com/boyu-ai/Hands-on-RL 使用pycharm打开的请查看:https://gith ...

  7. 动手学深度学习(文本预处理+语言模型+循环神经网络基础)

    文本预处理 文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤: 读入文本 分词 建立字典,将每个词映射到一个唯一的索引(index) ...

  8. 李沐d2l《动手学深度学习》第二版——风格迁移源码详解

    本文是对李沐Dive to DL<动手学深度学习>第二版13.12节风格迁移的源码详解,整体由Jupyter+VSCode完成,几乎所有重要代码均给出了注释,一看就懂.需要的同学可以在文末 ...

  9. 动手学深度学习:3.16 实战Kaggle比赛:房价预测

    3.16 实战Kaggle比赛:房价预测 作为深度学习基础篇章的总结,我们将对本章内容学以致用.下面,让我们动手实战一个Kaggle比赛:房价预测.本节将提供未经调优的数据的预处理.模型的设计和超参数 ...

  10. 第3章(3.11~3.16节)模型细节/Kaggle实战【深度学习基础】--动手学深度学习【Tensorflow2.0版本】

    项目地址:https://github.com/TrickyGo/Dive-into-DL-TensorFlow2.0 UC 伯克利李沐的<动手学深度学习>开源书一经推出便广受好评.很多开 ...

最新文章

  1. win2008怎么配置php,Win2008 PHP 配置环境搭建 教程
  2. MySql笔记之数据表
  3. DIOCP (一) DIOCP常见问题。
  4. redis 一主二从
  5. linux内核网络协议栈--数据包的网卡转发流程(二十七)
  6. 头的各个部位示意图_微观古建—古建筑的墀头(一)
  7. 直播 | EMNLP 2020:用语义分割的思路解决不完整话语重写任务
  8. uva12099 Bookcase ACM NWERC
  9. 200道物理学难题——038蚱蜢跃树
  10. 3月15日之前的FreeEIM
  11. java(5)---static修饰符
  12. 华为发布7nm制程麒麟810芯片:自研达芬奇架构 nova5首搭
  13. excel插入一列日期 pandas_在Excel目标列插入日期控件的方法
  14. 西门子dcs系统组态手册下载_和利时FM148C卡件伊春DCS系统
  15. vs登录或者添加账户时说脚本错误
  16. piece table 的C语言简单实现
  17. 启动windows的mysql_MySQL的启动方法(windows 平台)
  18. 多版本谷歌chrome浏览器并存(谷歌浏览器从C盘移植)
  19. element ui tree树节点数据平面化
  20. java cell_Cell

热门文章

  1. 集成稳压电源的分类及特性
  2. 中职计算机专业教程购买渠道,中职计算机论文精选
  3. lpush rpush 区别_php-redis中文参考手册_list容器相关_lPush_rPush_lPushx_rPu...
  4. silklabo哪个公众号有资源_公众号和头条号,做哪个赚钱?
  5. word最后一页空白页删除
  6. 【Leetcode】1214. Two Sum BSTs
  7. python如何打开npy文件_操作python如何实现npy格式文件转换为txt文件
  8. wifi 频段表_wifi频段如何设置为5ghz
  9. 领导的这些职场暗语,你一定要知道!
  10. 1 常用邮箱SMTP/POP3地址及端口