哈喽大家好!我是波哥!
引言
欢迎来到网络世界,《小白也能看懂的网络基础》系列文章会从零开始帮助你构建网络的基础知识。如果你完全没有接触过网络相关的内容,那我们是一样的,在学习过程中我们肯定遇到了相同的问题!写下这些文章一方面要记录自己的学习历程,另一方面也希望帮到同样想要学习网络基础的小伙伴。
文章的部分内容与素材是我从【Youtube平台】的【Network Direction】发布的系列视频学习和搜集过来的,翻译不易,部分内容可能无法做到尽善尽美,甚至可能会有部分瑕疵,我会尽力让文章内容通俗易懂,覆盖全面。若各位小伙伴发现任何问题,希望能够留言或私信告诉我,在下不胜感激!当然,我也会在第一时间进行更正。
在往后的每一篇文章中,我都会把看到文章的小伙伴当成是完全没有网络经验的小白,我的目标是和零基础小白一起建立坚实的网络基础,网络大神请略过此系列文章。
让我们开始网络之旅吧!
历史上的对话
如果你早期在一个公司的网络部门工作过,你可能会听到这样的电话对话:
网管:「你好,这里是IT部门,你有没有尝试重启呢……」;
员工:「没有,我这边是服务器的问题,我甚至无法固定它」;
网管:「好的,听起来这应该是第3层的问题,我不负责这块,拜……」。
这就是很有历史的技术支持电话的对话内容,这个IT部门的网管提到了第几层的问题,其实他说的就是OSI模型的某一层,但这是什么意思呢?为什么有OSI模型这个东西,它的存在有什么意义?接下来,我们将围绕这个问题展开讨论。
网络世界
通过前面的内容,我们了解到了,网络上的所有设备都具有网络硬件和软件这些特征,它们需要一种通用的规则,才能实现彼此之间友好的交流。
达成协议
是谁在默默无闻的支持它们彼此之间沟通的呢?相信你已经知道了,是「协议」。它们都遵循一套相同的「协议规则」,如此一来,它们之间的沟通畅通无阻。需要注意的是,「协议」并不只有一个,在不同的位置,我们会应用到不同的「协议」,所产生的效果也不尽相同,而且一些「协议」需要协同配合才能完成工作。
ISO国际标准化组织
随着时代的发展,「协议」越来越多,我们想要了解其中某一项协议的具体内容变得越来越复杂。为了解决这个问题,一个叫做「ISO」的「国际标准化组织」将这些条例进行了整理规划,方便不同的人群了解不同的协议,这就是「OSI模型」。(例如:国与国之间可以将协议划分为贸易协议、医疗协议、军事协议、建设协议等等,从事相关工作的人只需要去了解与自己相关的协议内容即可)
在网络当中也是同理,「网络协议」的分层也是为了完成这个目的,那就是将这个庞大的网络进行不同层级的划分,以便于不同的角色按照统一的「协议」生产出能够协同办公的软件或硬件。
可能直接说这些概念大家任然无法按理解,在这里,我们拿生活中的真实案例来进行讲解:假如我们写了一封信,这封信从写完到对方看到,经历哪些步骤呢?
寄信的步骤
如此一来,我们就建立了一个「寄信的模型」,该模型描述了每个环节如何搭配工作,并最终实现信件的投递。在这个过程中,某些细节会随着实际情况而发生变化,例如:
模型存在的变化
虽然我们大可不必了解这其中的每一个细节,但这可以帮助我们更快的理解「OSI模型」的核心概念,而「OSI模型」客户已帮助我们更加深入的了解网络。
因此,通过该模型我们可以了解到那些我们不曾了解的整个过程,同时,它可以帮助我们了解到每一个过程当中的细节!而且,如果信件丢失,我们可以追溯到某个具体的环节,并只解决该环节的问题即可。
网络的模型也是同样的道理,它可以帮助我们了解整个网络的运行的流程,方便我们找到问题所在的位置,便于问题的排查;同时,也方便了那些没有接触过网络小白的学习。
OSI 模型就是网络模型,我们将它划分为七层,分别是:
OSI七层模型
大家可能注意到,这七层模型中并没有以太网层、也没有电缆或光纤层,其原因是,「OSI模型」与特定的技术无关,就好比上面的寄信模型,它只告诉我们寄信要走哪些流程,而具体使用哪个厂家的信纸、信封,以及使用什么交通工具运输与模型没有直接关系。
那可能大家又要问了,那模型到底是用来做什么的?我们可以这样解释,类似以太网、电缆或光纤可以具体到「OSI模型」的某一层,比如以太网属于数据链路层的内容,以太网如何来连接及构建的解决方案都在这一层的规则中详细写出了;
而电缆或光纤都属于物理层的内容,若这类网线想要与不同厂家生产的接口无缝对接,那线缆生产商与接口生产商都需要按物理层规定的协议来生产产品。
以太网与线缆都是根据「OSI模型」制定的规则来工作的,这样说大家应该明白了。在这里呢,我们通过一个案例来看一下,「OSI模型」各层是如何协同工作的。
数据在OSI传递的过程
在这个案例中,我们有两台用于测试的主机,分别是「主机A」和「主机B」,我们用「主机A」准备一个信息,将其传递到「主机B」,在这个传递过程中,OSI的每一层都参与了怎样的工作?
数据的出现是始于应用层的,(例如使用「主机A」通过FTP向「主机B」传输一个文件信息)应用程序都属于应用层的内容(例如:QQ、微信、Web浏览器等都属于应用层);应用程序准备好信息后,就可以向表示层传递了。
数据内容
表示层收到应用层传来的文件信息后,会把数据转换为能与接收者「主机B」的系统格式兼容并适合传输的格式(表示层可能对数据进行加密、压缩、编码等操作,无论如何,这都是为了迎合「主机B」),操作完毕,数据会传递到会话层。
数据内容
会话层接收到表示层传来的数据信息后,负责在数据传输中设置和维护两台计算机之间的通信连接,以保证这段连接不会因中断而造成不必要的麻烦。建立好会话连接后,数据继续向下传递。
数据内容
虽然看起来上三层已经把大量信息处理完毕了,但这里可能遇到一些问题,例如应用层传递的文件是一个非常大的文件,在传输过程中一旦会话层的连接中断了,这意味着我们需要重新传递这个文件,这就变得非常麻烦。
如果我们可以把这个大文件拆分成小块传输,这个问题就迎刃而解了。这就是传输层的功劳,它可以对数据传输进行流量控制,也就是大文件分成多块进行传输。就好比我们搬家,一辆车装不下,那就多装几辆车,然后让这些车同时出发,同时呢,为了避免道路阻塞,它还可以选择多条路来进行传输,这就是传输层的流量控制、避免拥塞和多路复用的体现。
同时,传输层还会给这些数据追加一个「源目端口」,一方面告知对方信息打哪来,一方面要让信息知道它们要到哪去(例如:我使用 Google 浏览器访问百度网站,这里就会添加了 Google 的端口和百度服务器的端口)。
[源目端口]
| 数据内容
数据传输的问题解决了,不知道大家还记不记得上一章」本地与异地信息打印的案例「,如果我们要传递的信息是被异地主机接收,就需要靠ip地址来确定异地的网段。所以网络层会给数据追加一个「源ip地址」,再添加一个「目的ip地址」,这就解决了数据从哪里来,要到哪里去的问题了~
[源目ip地址]
| [源目端口]
| 数据内容
网络层解决了异地网段的问题,但数据走到这里还无法确定要传递到该网段下的那一台机器,因此,数据链路层会把「主机A」和「主机B」的「MAC地址」再进行追加,这就是「源MAC地址」与「目的MAC地址」,拥有了这个唯一的烙印,「主机B」就是化成灰也逃不出「主机A」的五指山了。
同时,数据链路层在数据的尾部追加了一个「FSC帧校验」,因为我们的数据再传输层有可能已经被切片,因此,为了检测数据的完整性,就有了这个「FSC帧校验」。
[源目Mac地址]
| [源目ip地址]
| [源目端口]
| 数据内容
| [FSC帧校验]
数据通过OSI的六层磨炼,还差最后一层才能将信息传递出去,只要能满足这最后一层对数据格式的需求,物理层就会给我们准备一条路,并把数据发送出去。那物理层识别什么格式的数据呢?01代码
,无论是电信号还是光信号,都只能传递这种类型的数据,因此,物理层会将数据转换成 01代码
并实现数据传递。
100111010111010110110100001101101011
数据从主机A
传递到主机B
通过上一小节,我们已经了解,数据自应用层诞生,进行了层层封装,并最终通过物理层的线路将数据发送到了另一台设备上,那接收到数据的这台设备,也就是「主机B」该如何处理这些数据呢?
收到「主机A」发来的01代码
,并对代码进行解析,将其转换成数据链路层需要的数据格式。【此时,数据已经转换为数据链路层可识别的数据格式】
100111010111010110110100001101101011
数据链路层收到由物理层解析后的数据,并先进行「FSC帧校验」,检测数据的完整性,然后确定「目标MAC地址」是否正确,最后剥离「源目MAC地址」及「FSC帧校验」内容,随后将处理后的数据帧交给网络层。【此时,已经通过MAC地址找到目标设备】
[源目Mac地址]
| [源目ip地址]
| [源目端口]
| 数据内容
| [FSC帧校验]
网络层收到链路层发来的编译后的数据包,确认目标ip地址准确无误后,剥离「源目ip地址」,并将处理后的数据包交给传输层。【此时,已确定目标设备的ip地址】
[源目ip地址]
| [源目端口]
| 数据内容
传输层收到数据包后继续解封,查看「目标端口」是否畅通,确认无误后,剥离「源目端口信息」,并将处理后的数据交给会话层。【此时,已确定数据要传输到目标电脑上的什么应用】
[源目端口]
| 数据内容
会话层拿到数据后,需要根据端口与相对应的应用建立会话连接,并维持这个连接关系,继续将数据交给「表示层」。
数据内容
「表示层」收到数据后,需要对数据做进一步的解码处理,以确保应用能够识别这段数据内容,解码成功后,将数据交给应用层。
数据内容
「主机B」最终收到了「主机A」发过来的消息。
数据内容
数据解封装
通过对上述模型的分析,我们会了解到,OSI七层架构里面的每一层都有自己的工作,同时每一层都要与其上层保持密切的联系,以确保不会出现问题。层级之间分工明确,不会出现工作冲突的问题。因此,那些需要使用不同协议来完成的不同任务会变得更容易执行。
在本小节,我们再拿一个向Web服务器发送请求的客户端案例来演示一下,相信可以加深你对OSI模型的进一步认知。
我们平时是如何来访问网页的?回答是使用「Web浏览器」( Google 、火狐、搜狗),在浏览器上输入一个网站的地址,然后回车,这就发送了一个「HTTP请求」,这里请注意,这个请求是发给谁的?答案是「Web服务器」,大家可以理解为是一个放在异地的电脑主机,而这个主机里存放了很多网页文件。
我们输入不同的域名地址,访问到的是不同的主机,比如,我输入https://sspai.com,这就是访问到了少数派家的主机,这个主机收到了我们的请求,发现我们想看少数派首页,因此,它就把首页给我们呈现出来了。
而https://sspai.com其实并不是地址的最终形态,它是经过处理的,便于我们记忆的网站地址,其真实的地址应该是一个ip地址,例如 10.20.30.10,而域名只是解析到ip地址上的一个名字,因此,当我们访问 http://10.20.30.10/index.html 的时候, 是同样可以实现访问到少数派的首页的。
HTTP请求
HTTP就是一个简单的浏览器请求,然后得到服务器的网页响应吗?当然不是,如果我们把HTTP请求放到OSI模型中,它甚至不能简单放入一层,尽管人们常说它应该是来自应用层的请求,但事实上它跨越了OSI模型的多层,这几层分别是「应用层」、「表示层」、「会话层」,我们也称这三层是一个「上层协议」。
上层协议
当我们点击http://10.20.30.10/index.html 的时候,它会创建要发送的请求,并确保正在发送的任何特殊字符均已正确编码,这里,HTTP并没有真正意义上的管理上层会话。
在传输层,我们使用了称为「TCP」的协议来帮我们进行管理。在上一节我们已经有所了解,传输层会对要传输的数据进行大小判断,若数据很大则需要进行切片或分段,而做这些事儿的角色就是TCP,TCP要做的第一件事儿就是将数据分成几个数据段,接下来他要做什么?当然是给这些数据段添加「源目端口」。
追加源目端口
HTTP通常在服务器端使用80端口,这是我们使用客户端浏 览器要访问的目标端口,因此,在这些数据段前面,「TCP」会追加上「Dst Port:80」,同时,为了让服务器知道我们是用什么浏览器来请求的,会同时追加一个源端口,也就是「Src Port:32768」,这个32768可能是其他的值,根据我们使用的浏览器的不同而不同。
这个源端口和目标端口就是一段「请求标头」,它们紧紧的依附在请求数据上 。TCP会将此信息存储在内内存中,这也是为什么它可以跟踪并知道哪个应用程序正在等待响应。
信息到达网络层,我们需要使用IP地址协助寻址,在URL地址当中,我们可以获知该请求要发送到哪里,10.20.30.10 就是我们请求的目的地,此时的信息会追加「Dst IP:10.20.30.10」,同时,为了让服务器知道请求者的IP地址,会同时追加一个源IP地址,也就是「Src IP:172.16.0.1」,这个源IP地址并不固定,根据使用者的网络环境不同而不同。
追加源目IP
通过观察上图我们不难发现,客户端电脑和服务器并没有直接连接,它们位于不同的网络上,所以数据包时不能直接发送到服务器上的,若想要实现传输,则必须在数据链路层中将数据先发送给路由器,然后再让路由器帮我们转发数据。
追加源目MAC地址
因为我们有以太网协议,想要将数据从一个网段传递到另一个网段,就必须通过路由器,因此,我们需要在数据包上需要再追加客户端电脑网卡的MAC地址,也就是「Src MAC:AA:BB:CC:11:22:33」以及帮我们转发数据的路由器的MAC地址,也就是「Dst MAC:2A:34:D2:11:23:A1」,需要注意的是,交换机并不需要MAC地址。当然,我们还在数据包末尾追加一段用于纠错的信息,这就是「CRC(Error Checking)」。
通过物理层将数据发送至路由器
最后,我们的客户端主机在追加好这些「标头信息」后,终于将数据发送到了路由器上,当路由器,此时,我们需要借助「网络层」「数据链路层」「物理层」共同协作,将数据包中的「源目MAC地址进行置换」,也就是将「源MAC地址」由原来「客户端主机的MAC地址」替换为该「路由器自己的MAC地址」,然后将「目的MAC地址」替换为「服务器的MAC地址」,这样一来,路由器就可以实现数据转发了。
路由器实现数据转发
服务器通过链路层收到由路由器转发过来的数据信息,并检查是否有错误,若没有错误则会将「源目MAC地址」及「CRC错误校验」信息剥离,并将信息交给网络层。
剥离源目MAC地址
网络层收到后,确定源目ip地址是否正确,确保信息准确无误后,再将信息转发给传输层。
剥离源目IP地址
传输层,则确定源目端口信息是否准确,然后将数据交给上三层,让应用根据请求地址寻找指定页面,并用脚本获取URL对应参数进行后续处理。
传输层剥离源目端口