写点什么

(无聊预警)来啊一起冲浪啊 - 网络协议 01

发布于: 2021 年 01 月 01 日
(无聊预警)来啊一起冲浪啊 - 网络协议01

作为一个非科班出身的程序员,工作时间一长越来越感觉到基础的重要性,平常的时间比较琐碎,工作也不需要太多底层知识,年终假期总算有完整的一段时间可以没有压力地来学习一些底层知识。浮光掠影地过了一遍《计算机组成原理》《操作系统》和《网络协议》,很多细节依然没法深刻理解,不过还是希望能够做一点总结。这也是我生平(除工作外)第一次写技术相关的内容,望指点,求轻喷。


关于“网络协议”,主要的学习内容是极客时间刘超老师的《趣谈网络协议》。说来惭愧,从大学考计算机证书时候就背过 OSI 七层协议以及每一层相关的协议名称,但是从来没有细想过为什么要分七层以及每一层具体起什么作用。经过一番初步的学习对于每一层发生的事情有了大致的了解,也大体能够理解一个简单的冲浪行为背后发生的事情。


OSI 模型把网络通信的功能分为了七个层次:

  • 应用层 - “七层”

  • 表示层、会话层 - 酱油层

  • 传输层 - “四层”

  • 网络层 - “三层”

  • 数据链路层 - “二层”,MAC 层

  • 物理层 - “一层”


并且每一层会基于下方所有层级,也就是说,在传输数据块时,高层的数据块要放在底层的数据块里面,否则无效。

每层怎么工作

一层 - 物理层

物理层即网线层,所有的设备通过物理连接连到一起。两台电脑之间可以通过一根网线,多台电脑可以通过集线器(Hub),小区域网络(家用)通过双绞线网线,远距离网络连接使用光缆等等。


底层的物理连接是网络世界的基础,有了物理连接就可以传递一串又一串的 0101,而不同的比特位可以组成一段一段有意义的数据报,供上面的层级使用。


从另一方面讲,想摧毁一片网络,再厉害的黑客也抵不过一只老鼠或一台挖掘机。


(图片来自于知乎summer课堂)

原文链接

二层 - MAC 层

在物理层的连接基础上,MAC 层(数据链路)帮助解决了最初级的路由问题,也就是说在多台机器组成的网络之间,能够明确发送方和具体接收方,而不是什么信息一发出去就广播给所有人,并且还有一些算法/协议(比如上学时常背的 CSMA/CD)来控制发送的先后顺序实现多路访问。


既然是要决定物理机器的收发情况,那就需要准确的身份信息确定每一台不同的物理机器,这就要用到每个网卡不同的 MAC 地址。MAC 地址就像身份证一样,每张网卡都有(原则上)全球唯一的 MAC 地址。由此可以明确每一个数据包是从哪里发来,并发到哪里去。


(图片来自draveness.me | OUI表示制造商,NIC表示网卡主机)

原文链接


为了使得各台机器都能够收发数据包,大家要遵循相同的协议,遵循数据包传输的标准和规范格式。MAC 层的协议如下图。


(图片来自极客时间《趣谈网络协议》)


其中最开始就要表明目标 MAC 地址(发给谁)和源 MAC 地址(谁发的),然后表明类型,常见的有 IP 数据(三层协议)和 ARP 协议标识(用于已知 IP 求 MAC),接着就是数据。如果该 MAC 数据报包裹的是 IP 数据报类型,那么这里面的数据就是整个三层的 IP 数据块(类似地会包含源 IP 目标 IP 等等)。


在二层,有个必须拥有姓名的设备就是交换机,当发送方设备不确定接受方在哪一个接口时,它可以帮忙记录下来这些接口信息(转发表)并且以备后用。

三层 - 网络层

基于二层的实体机器网络,三层实现了虚拟的 IP 网络


当全世界那么多机器都可以互联的时候,即便每个 MAC 地址都可以做到全球唯一,但如果仅仅通过 MAC 地址来找机器不现实,因为不可能维护一个特别庞大的、拥有全球所有机器的 MAC 表格。但是 IP 的网络可以实现在有限空间和时间内达成全球互联。


就好像 MAC 地址是每台机器的身份证,但是你想给这台机器送快递的时候,你还是需要知道街道的位置(IP 地址),而街道是可以跨分区域的(IP 网段),继而可以通过不同的层级跨网段一步一步定位到最终的机器地址。


上面已经提及 IP 数据报会作为一个整体放在 MAC 数据段里面,这里可以展示一下嵌套完成以后的数据格式:


(图片来自极客时间《趣谈网络协议》)


在 IP 头部,最重要的就是源 IP 地址和目标 IP 地址,此外其它位的信息也有各自的用处,比如协议 8 位就是为了明确该数据段里的数据是基于接下来四层的什么协议,是 TCP 还是 UDP 等等。类似地,整个四层的数据报也会作为 IP 协议里的数据部分被包裹起来用于传输。


在三层,鼎鼎大名的设备就是路由器。上面说到 IP 网络使得全球的设备得以互联,而路由器和其端口(网关)就是实现互联的股肱之臣。每一台路由器会保存一份不断更新的路由表,当一个数据包传过来,根据目标 IP 的信息,路由器会告知这个数据报接下来应该怎么传输,如果已经是终点的话,那就找具体是哪一台 MAC 机器。

四层 - 传输层

来到四层,离我们能够上网冲浪更近了一步,这一层负责在前面几层已有的物理网络和虚拟网络上面建立端对端链接,毕竟要是安全的连接都没建立好就把银行卡密码给别人了也挺亏的。在四层,主角就是 TCP 协议和 UDP 协议,同上,他们每一个数据报也会作为一个整体被包裹在 IP 协议的数据段里面。


TCP 协议比较成熟稳重一点,在传输数据前要和对方建立“三次握手”保证通道安全,同时在传输结束后也会通过“四次挥手”来完满结束通话,这样当我们传递重要信息的时候例如查询网页或提交用户信息,虽然有一点延时,但是我们能够得到和提交不被篡改的真实内容。


UDP 追求短平快,不建立连接直接给,也不管对方能不能收到。这样比较莽撞,但是传输效率很高,在一些追求时效的时候比如看直播,我们不在意是不是每一帧都传到了,只要有足够的帧数保证流畅就好,这时 UDP 就可以发挥作用。


从下面的 TCP、UDP 格式对比也可以看出 TCP 数据报格式更为复杂,在头部有各种为了连接安全、为了握手挥手所设立的比特位。而 UDP 则简单粗暴,给了目的地就传输。


(TCP协议数据格式,图片来自极客时间《趣谈网络协议》)


(UDP协议数据格式,图片来自极客时间《趣谈网络协议》)

七层 - 应用层

跳过了两层酱油层,终于到了最接近用户的应用层。利用四层的 TCP 协议建立好连接后,我们可以安心传输请求和应答数据了,这时候如果我们想冲浪那就让我们电脑上浏览器发送 HTTP 请求给相关的服务器。这个请求会通过上述一系列的包裹和路由最终到达服务器,接着服务器准备好以后就可以把 HTTP 应答发回给浏览器,我们就可以愉快的上网了。

(HTTP协议数据格式,图片来自极客时间《趣谈网络协议》)

最后

文章最后想回答一开始提及的为什么需要分层,其实与其说这是个计算机网络问题不如说是个哲学问题。在课程中讲师提到“是个复杂的程序都要分层”是有道理的。在大公司工作了几年我也切实感受到,当系统庞大而复杂的时候,必须要把整个工作流分成若干块,然后大块再切分成小块,有时候是像七层协议这样有依赖关系的纵向切分,也有像“不同服务器分管不同业务”这样的横向切分


最后晚节不保地歪个楼说句题外话,我觉得做切分是一个很重要的步骤和环节,比如当我们想完成一件大规模项目的时候,必须要把这个庞然大物划分成一个一个的小项目才能不断有进展;同样地,如果我们想练就一些高级的能力,比如领导力,那就必须把每一个基础的能力先锻炼好,像是理解能力、表达能力等等。


好了,网络协议 01 写完了,仅仅包含了最最基本的 OSI 七层协议概述,其中涉及的所有知识点都可以进一步展开。基于我对自己的拖延习惯的准确认知,02 应该短时间内不会出现,但我会根据工作需要和兴趣驱动继续拓展我对于网络协议的认知。


发布于: 2021 年 01 月 01 日阅读数: 40
用户头像

努力不一定成功但不努力一定很轻松 2020.03.30 加入

93年大叔... 手速慢码农... 湾区底层民工... 网球出界小王子... KTV噪音制造者... 健忘型学习者... 旅行刷屏爱好者...

评论

发布
暂无评论
(无聊预警)来啊一起冲浪啊 - 网络协议01