作者 | 轩辕之风O

来源 | 编程技术宇宙(ID:xuanyuancoding)

有读者问我:轩辕,你是怎么学计算机网络的?鸽了好久,今天得空聊聊这个话题。

轩辕是通信工程专业,计算机网络通信自然是必学内容。

我猜,绝大多数同学的计算机网络知识,估计都是在学生时代,抱着谢希仁那本厚厚的《计算机网络》课本,老师念着上个世纪就传承至今的教案PPT得来的。

如果运气好,老师讲的不错,还学的进去。

如果运气不好,老师只是一个PPT播放机的话,那就···

很不幸,我就是运气不好的那种。

老师讲了一大堆协议啊,局域网、广域网、网络设备啥的,我却听着听着经常就神游太虚了。

一次偶然,发现隔壁班的计算机网络是当初教计算机二级的老师在上课,这位老师的讲课风格一直是我非常喜欢的,于是我和两个小伙伴就一起溜进去蹭课,这一蹭不要紧,一下就上了瘾。

这位老师风格独立,根本不用学校发的教材,而是自己编写了一套PPT,从最底层的原理讲起,从通信的编码校验,到局域网的802.3、802.4、802.5等技术演进,用生动有趣到生活实例告诉我们什么是CSMA/CD,听得我们如痴如醉。我现在写的很多故事性的文章,一定程度上都有这位老师的影响。

在我们几个的口口相传下,我们班在上计算机网络课时,门可罗雀,而隔壁班人却越来越多,不知道我们的计算机网络老师看到后心里有何感想。

果然,老师的力量还是很大的,一下子就开了窍似的,学起来简单多了,期末考试轻松拿下100分。

我的经历

期末考试结束后就是暑假,我进入学校的网络安全实验室了,进入之后的第一个任务,也是事关我们能否留下来的考核题目来了:编写一个HTTP流量还原的软件。

程序要求:输入一个从wireshark等抓包软件导出的pcap文件,输出这其中所有传输的HTTP内容,包括HTML、CSS、JS、JPEG、PNG、GZIP等等内容。

包括我在内,同批次进入实验室的总共有5个人,大家各自负责不同的协议流量还原,有FTP、SMTP、HTTP、IMAP、POP3,我算运气好的,因为HTTP相对来说是最熟悉的了。

那时刚刚大一暑假,才刚刚学完C语言,虽然已经提前自学了C++,但面临这个题目还是慌了。

最大的问题就是,网络数据包只在课本里学过报文格式,我也没见过真正的数据包长啥样,也不知道在pcap文件里怎么存储的,更不知道如何把HTTP传输的数据给还原出来了。

总之,就是当时对网络流量的认识还停留在类似上面这样的图上,至于数据包长啥样则完全没概念。

有一天晚上,实验室的老师安排了高一届的师兄们给我们讲解了如何抓包,怎么查看网络通信数据。

那是我第一次在抓包软件下看到了网络中数据流量的真实样子,触动特别大,平时躺在书本上的报文格式,现在活生生的出现在了眼前,每一个字节,甚至每一个比特的意义都在抓包软件下看的清清楚楚,原来,网络是可以看到的!

在抓包软件下,网络的分层不再是一个静态的分层模型图,而是看得到的一层又一层的报文头,从链路层的以太网协议,到网络层的IP协议,再到老大难的TCP头部,再到上面的应用层协议,那一串二进制比特流数据,用一棵协议树的形式对应了起来。

那几天,我们都在集中学习抓包,看着自己浏览的网页数据,最后都能在抓包软件中找到它,我对计算机网络的理解开始变得立体起来。

抓包学的差不多,就要开始编写程序完成任务了。

在C/C++语言中,为了处理报文数据,就会定义各种各有的协议结构体,这一来,又进一步强化了对每个字段的理解,因为它不再是书本上一个简单的字段名字,它变成了我代码结构体中一个实实在在存在的成员变量。

typedef struct _ip_hdr  {      #if LITTLE_ENDIAN       unsigned char ihl:4;     //首部长度       unsigned char version:4, //版本        #else       unsigned char version:4, //版本       unsigned char ihl:4;     //首部长度       #endif       unsigned char tos;       //服务类型       unsigned short tot_len;  //总长度       unsigned short id;       //标志       unsigned short frag_off; //分片偏移       unsigned char ttl;       //生存时间       unsigned char protocol;  //协议       unsigned short chk_sum;  //检验和       struct in_addr srcaddr;  //源IP地址       struct in_addr dstaddr;  //目的IP地址   }ip_hdr;

这里插一句,以前学C语言,学到联合体union、位域这些东西时一直不知道怎么用以及有啥用,直到去处理解析这些协议头数据的时候才发现:哇靠!真香!

说回我的程序,我的程序分为了两个阶段,第一步,先把pcap中存储的数据包都展示出来,这一步主要是文件格式处理和数据包的分层解析。

第二步,识别HTTP会话,提取传输的内容。

这第一步倒还好,熟悉了文件格式和报文分层的格式后,循环遍历pcap文件内容,挨个分层解析协议即可。

但是这个第二步就有些困难了,最重要的就在于HTTP的传输层是TCP,TCP里面涉及到超时重传、乱序等一些复杂的情况,要完整的合并一个会话,考虑到上面这些情况,就没那么容易了。

不过,困难亦是机遇,一直对计算机网络协议中的TCP这头拦路虎有些惧怕,这一次是时候跟它好好把话说清楚,道明白。

序列号SEQ和确认号ACK是TCP传输的基石,抓住这俩家伙,就能抓住TCP会话的脉络。

经过一阵研究摸索,总算写出了一套算法来进行会话流的重组,虽然现在回过头去看还是有很多考虑不足之处,但在当时已经能解决面临的问题。

通过编程来进行流重组的过程,对TCP的超时重传、拥塞控制、滑动窗口、数据乱序等细节有了完全不一样的理解。

以前只是从概念上记住理解,而现在是自己要从代码层面处理这一个个的场景,这个掌握的深度自然是不一样的。

差不多一个月后,暑假过了一半儿,我总算把这个程序写了出来,看着自己上网的内容被自己的软件完整的还原出来,心里那种感觉,别提多有成就感了。

那时候开始,我对网络中数据的传输从里到外到底如何在工作有了全新的认识。它不再是停留在课本上那一张张静态的报文格式图。

一点通而多点通,有时候一个关键的点弄通透了以后,学习其他相关问题就会有豁然开朗的感觉了。

知道了网络中的数据如何在传输,再回过头去看那些各种各样的网络协议就轻松多了。

这时候再把视角拔高一些,为什么网络协议要分层,每层的职责是什么,集线器跟交换机组网区别是什么,这些问题不用看书,自己就能回答上来了,它确实就该是那样子的!

方法总结

计算机网络这门课,属于计算机四大基础课程之一,无论是什么技术栈,只要从事计算机行业都得学。

而学习的方法和途径呢,我推荐的方法是看书学理论+实战相结合的方式。

第一个层次,看书+看视频。

虽然看书很是头疼,但基础知识最好还是得通过看书来获得。

看的时候呢可能会遇到各种各样的疑问和困难,这时候我建议先从整体把关,不必拘泥在某个字段上。先对计算机网络先有一个初步的认识,知道这大概是个什么东西,解决了什么问题。

有了初步的概念和大体的认识,再逐层细化。

推荐书目:

  • 《TCP/IP协议详解》(卷一)

  • 《网络是怎样连接的》

  • 《图解TCP/IP》

如果实在是觉得看书学不进去,那我推荐你可以去看视频,这年头,视频学习资料到处都是,只要你肯花功夫,通过视频也能学好。

视频呢也分两种类型,一种是高校的公开课,你可以在网上找到一些计算机专业比较知名的学校,看看他们的公开课,比如清华大学、电子科技大学、上海交大等等。

这一类视频的特点是比较中规中矩,就像在大学里面上课一样,氛围感会更强一点,缺点是可能显得有些枯燥,不过毕竟是名校的资源,比较系统全面,更靠谱一些。四舍五入就相当于在这里上学了。

另外一种就是一些自媒体博主,或者一些机构推出的专栏课程。这一类相对更新一些,照顾到年轻人的口味,会用一些动画之类的方式来呈现,讲述的也更有趣一些。

按照套路,我是不是应该推荐几个放在这里?

但我没有。

我觉得吧,视频课程每个人的口味都不太一样,画面、PPT质量、老师的声音、语速、讲述风格等都有要求。

授人以鱼不如授人以渔,大家可以去B站、网易云课堂上面搜一下,这两类的视频都有许多,其中不乏高质量的视频,建议多去看几个比较比较,看看自己更喜欢哪一款。

第二个层次,抓包。

看书和视频,这些知识还只是静态的,纸上得来终觉浅,想要掌握扎实,就得学会抓包,自己亲自动手抓一抓网络中传输的数据包,看一下它们到底长什么样子,并通过抓包工具分析各个协议的各个字段的作用,把前面学来的理论知识实际用起来。

这里我列举一些可以关注的抓包场景:

  • ping一个IP地址,抓包分析IP+ICMP

  • ping一个域名,抓包分析UDP+DNS

  • ping一个局域网IP,抓包分析ARP

  • 禁用网卡重新启用,抓包分析DHCP

  • 访问一个网站域名(非HTTPS),抓包分析TCP和HTTP

  • 访问一个网站域名(HTTPS),抓包分析HTTPS

而且,学会了抓包,也会在工作中排查问题大有帮助,实在是程序员必备技能!

第三个层次,编程。

达到第二个层次,对于大多数人已经足够了。但如果你想对计算机网络了解对更深一些,或者你的工作与网络紧密相关,那么写点代码绝对是不二之选。

那写点什么类型的代码好呢?

第一类是编写我上面说的那种网络流量数据分析软件,通过分析处理真实的数据包,实际处理每一层每一类协议的每个字段,哪怕你只是把数据包内容分层展示出来,那也是有非常大的帮助。

第二类就是编程来收包和发包。我们平常使用套接字编程,一般都是封装的应用层协议,如果你是学习应用层协议,用套接字就可以,比如你可以写一个简单的静态webserver,对HTTP协议进行封包解包。

而如果你想学习更底层协议的封包,比如TCP、UDP、ICMP、ARP、IP这些协议,那就得另谋他法,比如原始套接字,比如一些开源SDK等。

第三类,更进一步,可以尝试编写一些内核驱动程序,通过操作系统提供的接口,进行数据包的监控、拦截过滤与修改、通信阻断,实现一些有趣的功能,比如自己实现一个简单防火墙,开发一个进程通信监控软件等等。

再说几句

上面只是对于开发人员的一些建议,对于专业的网络工程师、运维会有所不同,可能还需要学习组网技术、交换机/路由配置、防火墙和网络安全等相关的知识。

以上就是我的一些学习计算机网络的心得体会,希望对大家有所参考借鉴。

5月13日晚8点,欢迎来到CSDN悦读时间直播间,Spring Cloud Alibaba创始人带你深入理解Spring Cloud,扫码进群预约直播,更有好礼相送哦!

☞这届年轻人,没到 35 岁就开始准备退休了
☞“阿里日”102 对新人举办集体婚礼,张勇证婚:“又热,又爱”!
☞中国三大互联网中心:北京、上海、深圳,你 Pick 哪个?
☞CTO 两年吃回扣上百万元,将面临数十年监禁
☞从贫困的“问题少年”到计算机博士,最后成为商界泰斗,“创业之神”吉姆•克拉克是如何走向封神之路的?

干货!我的计算机网络怎么考了 100 分的?相关推荐

  1. 四川高中计算机学校图片,四川2021年100分能上计算机学校吗

    四川100分能上计算机学校吗?从计算机学校方面所进行分析地话,中专计算机学校所对其学生的各方面要求是比较容易被进行满足的,而从学生所考的100分成绩来说的话,成绩是比较地低的,如果想要报读计算机学校的 ...

  2. 用计算机写试卷反思,100分试卷反思怎么写

    当我们考得了100分或者达不到100分,就会反思这次我们到底是怎么才考得了100分或者因为因为考不到100分,下次我还能不能再继续考100分,为此学习啦小编为大家整理了几篇考了100分试卷的反思范文, ...

  3. 12门课100分直博清华!这份成绩单冲上热搜,但学霸小伙也曾考过25分

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 金磊 明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 一 ...

  4. 2019中南大学考研计算机考试,中南大学2019年全国硕士研究生入学考试《计算机网络》考.PDF...

    中南大学2019年全国硕士研究生入学考试<计算机网络>考 中南大学2019年全国硕士研究生入学考试 <计算机网络>考试大纲 本考试大纲由信息科学与工程学院教授委员会于2018年 ...

  5. 不要逼孩子考100分

    杭州市天长小学老师周武曾经提出过一个"第十名效应",大意是说小学期间前几名的"尖子"在升入初中.高中.大学乃至工作之后,有相当一部分会"淡出" ...

  6. 语言三做一年级算题_一年级数学期末考试,学生交卷说能考100分,快让你家孩子试试吧...

    时间不知不觉已到7月份了,各地小学将要迎来期末水平考试了,小学生也是十分开心,考完试又要放假了,更有小学生笑着对老师说"今年的假期有点长啊",一句话把老师逗得哭笑不得. 今天上午同 ...

  7. 电大专科《计算机网络》机考题库,电大专科计算机网络机考网考纸考题库及答案.doc...

    电大专科计算机网络机考网考纸考题库及答案.doc 最新电大专科<计算机网络>机考网考纸考题库及答案 本人针对该科目汇总了该科所有的题,形成一个完整的题库,并且每年都在更新.该题库对考生的复 ...

  8. 计算机网络考研/考博复试常见问题

    目录 第一章.计算机网络体系结构 第二章.物理层 第三章.数据链路层 第四章.网络层 第五章.传输层 第六章.应用层 第一章.计算机网络体系结构 快速唤起记忆知识框架 1.计算机网络的主要功能? 1. ...

  9. 计算机网络技术中专升大专可以报什么专业,中专计算机网络技术考大专

    中专计算机网络技术考大专 中专计算机网络技术考大专?随着社会的不断进步,想要有一个好工作,在某些时候学历也是很重要的,所以有很多的计算机网络技术专业的中专生想要考取大专学历,这样不仅对自己的职业生涯有 ...

最新文章

  1. nlp文本数据增强_如何使用Texthero为您的NLP项目准备基于文本的数据集
  2. java excel api xlsx_Java 解析Excel(xls、xlsx两种格式)
  3. K8S部署工具:KubeOperator集群导入
  4. 每日小记 2017.6.29
  5. ES8新特性_ES8中对象方法的扩展---JavaScript_ECMAScript_ES6-ES11新特性工作笔记052
  6. kml或kmz文件用什么软件打开
  7. 考PMP真的有用吗?(含pmp资料分享)
  8. 苹果企业开发账号申请三步走
  9. Linux命令:configure --prefix=/ 有什么作用
  10. 关于mac重启/home目录丢失解决方案
  11. 如何将腾讯视频下载的qlv文件导入PR中编辑
  12. “给阿姨倒杯卡布奇诺”广发卡分期积分带你免费畅饮星巴克!
  13. sklearn.svm.SVC的方法decision_function_shape:ovr 或者 ovo
  14. 巴菲特:我可以发2100万个巴菲特币|附视频
  15. 基于Sphinx的中文全文检索引擎Coreseek的安装
  16. 35岁,还学编程是不是很难
  17. php添加水印,水印平铺整个图片
  18. UnityRectTranform属性设置方法
  19. SICP读书笔记 3.5
  20. 电脑系统重装篇2:使用软碟通软件制作U盘系统安装盘(UltraISO)

热门文章

  1. 【2021】如何看待计算机视觉未来的走向?
  2. 注会用计算机,注会准备什么计算器?有型号要求吗?
  3. 五个方面入手 教你如何成为领导型CIO
  4. 未来属于人工智能工程师,但成功转型不容易
  5. 机器学习工程师正在失业,但学习依旧是唯一的出路
  6. SAP S/4HANA BP功能
  7. 最先进的目标检测器竟对大象“视而不见”
  8. Word2Vec揭秘: 这是深度学习中的一小步,却是NLP中的巨大跨越
  9. 计算机视觉迎新突破?谷歌AI模型打破现有CNNs精度
  10. 美国人到底为什么不待见人脸识别技术?