目录
一、网络发展
1. 独立模式
在最开始计算机被发明出来,但网络还未普及的情况下,每个计算机之间都是相互独立的:
假设现在有一份数据需要处理,然后这份数据的处理又分给三个人分别处理。假设小松处理进行第一部分的处理,当小松处理完后,就需要将数据交给小竹。但是小竹处理数据的计算机是另一台,此时又没有网络,所以小松就需要通过硬件的方式,将数据拷贝到一个硬件,例如软盘中:
通过这类硬件,将数据从一台计算机拷贝到另一台计算机。这种数据交换的方式无疑是非常麻烦耗时的。
2. 网络互联
当网络逐渐普及后,就有了多台计算机连接在一起,通过网络完成数据共享的方式了。
在网络互联中,就是将数据统一保存在服务器中,当用户需要使用数据时,就是从服务器中获取并写回数据。其他用户需要使用时同样也是从服务器中获取数据,不再需要通过用如软盘之类的硬件来拷贝数据实现交换了。上图就是一个最简单的局域网的模型。
有了局域网将某个区域内的计算机连接起来的方式,就势必面临着一种情况,那就是不同局域网通信的问题。假设在一个学校里面,它有不同实验室,每个实验室中都配备了单独的服务器存储数据,供该实验室内的计算机使用。如果这些实验室之间想实现数据的交换,就需要有一个交换数据的媒介,即“路由器”。而它们在内部的局域网交换数据,可能就是有自己的网络线路或者通过交换机实现:
注意,上面的图只是一个逻辑图,在实际上,局域网中不一定全是用实体网线连接的。比如你和你的室友打游戏的时候,假如你们一起组队玩apex,此时你们在同一个房间里面,但是你们并没有在电脑之间插上同一根网线连接起来以让你们能够进入同一个组队房间。所以,在实际中,局域网之间也并不一定是由实体网线连接的。
还有一个问题,在学校里面我们上网的时候,寝室里面都会有网络接口,我们直接买根网线插进去就可以接入校园的局域网了。但是,你在玩pvp游戏时,和你同一个房间的人,如果你们想一起玩游戏,就是在你们之间直接拉一根网线连接起来吗?全世界这么大,难道要让网络连通仅仅是拉一根网线就能解决的吗?其实在这里面,还有一个重要的角色,就是“运营商”。对于网络数据所需要的数据交换、数据存储等服务,其实都是由运营商为我们解决了的。运营商将网络连接工作处理完后,将网线拉到我们的家门口,我们所要做的仅仅就是“光纤入户”。将自己家的网络接入运营商提供的网络即可。
所以,真实的网络连接是非常复杂的,上面的网络连接图仅仅只是一个示意图,实际中并不是仅通过一个路由器就能完成网络连接的。
局域网,我们可以看成在同一个路由器内运行的主机集合。这些主机在这个路由器中可以不通过路由器直接交换数据。而广域网,则可以看成是多个不同的局域网集合,需要通过路由器来实现数据交换。
总的来讲,局域网和广域网都可以看做是一个相关概念,广域网可以看成一个比较大的局域网。
二、认识协议
1. 为什么要有协议
协议,其实就是一种约定。在我们的计算机中,存在各种各样的硬件,例如硬盘、CPU等。这些硬件之间要进行交互,就是通过“总线”来实现的。可以简单的理解为,这些硬件之间都是通过一根根的线连接起来,数据交互就是通过这些线来进行传输的。
所以,一台计算机内部的本质,也可以看做是一个小型网络结构。
既然计算机内部的硬件是通过线连接起来的,那我们就可以设想一下,假设有可以无限延展的线,我们就可以通过这些线将计算机中的如硬盘、CPU放在不同的位置。例如硬盘放在成都、CPU放在重庆。然后再在存放的位置将多个硬盘连接在一起,形成一个集群,这样就形成了一个庞大的存储数据的硬盘集群。通过这个例子,我们就应该认识到,计算机中的硬件其实并不是必须要放在一起的,只需要有可以连接的方式即可。而我们日常中所说的各类服务器,大家也可以看做一台大型的计算机。与我们自己的计算机相比,它的性能更高,占地更大,各个组件被存在在不同的区域中形成集群。
由此我们对计算机就要有一个认识。即计算机的体系结构中有网络,网络中有体系结构。
再来看一个问题。在现实中,我们与同学面对面交流的时候,我们的交流都是比较通畅的,因为我们可以实时接收对方要表达的信息,当出现错误时,我们也可以立即提出。但是,假设你和你的同学隔着100米进行交流,当你们在交流时可能就会出现很多问题,比如对方听不清你在说什么,对方错误理解了你的意思但你无法立刻纠正等等。这些问题出现的原因只有一个,那就是“信息传输距离变长”。
由此我们就可以得出一个结论,在网络中,随着信息传输距离的变长,就可能出现各种问题,增加通信成本。因此,为了尽可能的减少通信成本,便有了定制协议的方法。
2. 什么是协议
举个例子,假设你家里面有一台座机:
现在你准备外出上学,你的父母在家里都很担心你在外面的安全和生活。但是你们家又比较穷,没法随意打电话。于是你在走的时候就告诉你的父母,因为打电话的时候,如果对方不接电话,就不会扣电话费,所以在以后,我向家里打电话时,如果电话只响了一声,就代表我在学校里面过的很好。如果电话响两声,就代表我没有生活费了。如果电话响三声及以上,就代表我有其他事找你们,这个时候你们接听就可以了。你的父母听了觉得这个方法很好,便同意了。
在这个例子里面,电话响一声、两声和三声及以上就分别对应了不同的行为,其实就是一种约定,是我们和父母之间的一种共识,在出现对应的情况时,大家都心照不宣知道要采取什么行为。而这个约定,就可以看成是一种协议。通过这种约定,也就在一定程度上降低了通信成本。
在计算机中,假设一台计算机有一个需求需要传达给另一台计算机,此时就可以定下一个约定,计算机A每次只会给计算机B传1个字节的数据,计算机B要拿到这个数据后,就要去执行对应的动作。例如传1的时候,就是计算机A需要计算机B去拉取用户数据;传2的时候,就是计算机A需要计算机B执行某种计算。这种方式,也就是可以看做计算机的协议,是双方约定好的行为。
但是,协议仅仅是约定好后就可以生效了吗?举个例子,假设你是一个山寨的老大,你为了防止有外人混进你们的山寨,于是你告诉你的小弟,从今以后大家进入山寨时,都需要对暗号。守卫的人说“宫廷玉液酒”,外面进来的人就要说“一百八一杯”。如果有人答不上来或者说错了,那么这个人就是想混进来的奸细。你的小弟们一听,这个办法好啊,就都采用了。
但是你的这群小弟来自五湖四海,各自都是讲方言。于是当守卫问要进山寨的人时,虽然他们都知道暗号是什么,但回答的语言五花八门,有北京话,有上海话还有四川话。此时虽然暗号正确,但守门的人只听得懂普通话版本的暗号,听不懂这些方言。于是他就将这些人全部视为奸细给拿下了。
转到现实里面来,一台计算机中包含了各种各样的硬件和软件,而生产这些的厂商也非常多,那么如何让这些不同厂商生产的物品所组装出来的计算机能够相互之间顺利通信呢?此时就需要有一个大家都遵守的具体的标准,即网络协议。
但是大家虽然遵守了协议,但是实现协议的方式却不同。比如大家都遵循用0、1来传输数据,但是有的人是以电信号的强弱来区分0、1;有人是用电信号的有无来划分0、1;还有人用是否有磁性来划分0、1。此时就需要有一个能主事的人来制定一份协议标准,即细化这份协议中的各个内容,各个应遵守的标准。就好比你是山寨老大,你规定大家不仅要用同一个暗号,在讲暗号时都要用普通话来讲,不会的就自己去学,反正对暗号时必须使用普通话。网络协议中也是如此。
三、网络协议初识
1. 协议分层
在现实中,我们经常会与朋友或家人打电话沟通。在打电话的时候,大家都认为自己和对方是在直接沟通。但实际上并不是这样的。我们其实是通过电话这一媒介进行沟通的。在沟通时,我们将自己的声音通过语言层,即我们自己说的话,传输给通信设备层,即电话。然后双方的电话会通过对应的电话机的协议将数据进行转码、解码等工作,然后再将数据传输给对方。以此实现了双方通过电话通话。
在这一过程中,其实就存在两层协议。第一层就是双方沟通时所用的语言协议,我们在这里用汉语沟通,就可以看成是汉语协议。通过这个协议,双方就能明白对方所要表达的意思。
第二层就是电话机协议。你和你朋友的电话之间要传输数据,为了让这两个电话能正确识别传输过来的信息并进行处理,就需要有一层电话机协议以让双方能够正确解析传过来的数据。
因此,协议分层实际上就是指在不同主机之间进行传输时,会将具有很强关联性的内容放在同一层,每一层都有一份单独的协议。
2. 协议分层的优点
通过协议分层,在我们对某一层进行修改的时候,就不会影响到其他层,且能实现不同的功能,在一定程度上达到解耦。
例如在上图中,如果我们想用汉语,通过无线电沟通,就可以将通信设备层的协议修改为无线电协议;而如果我们想用英语,通过电话沟通,则只需要将语言层的协议修改为英语协议。这样不仅实现了解耦,还降低了修改成本。
所以,分层好处,一个是“解耦”,一层中出现了问题,不会影响其他层,能在不影响其他层的情况下更快速的定位错误;另一个是“封装”。在调整时,调整对应层中封装的内容即可。
在上面的例子中,仅仅分了两层。但在实际中,网络通信是非常复杂的,需要分为更多的层次。
在过去,大家可能以为在整个网络中都只使用同一个协议,这个认知其实是错误的。在网络中是进行了分层的,每一层都有一份对应的协议。
3. 理解分层
在上文中说了,协议分层带来的好处就包括两方面,一个是“解耦”,一个是“封装”。总的来讲,其实就是实现了软件层面的“低耦合”。
而设计分层的依据之一就是:功能比较集中,耦合度比较高的模块。这些模块缠绕在一起,几乎无法分开。即具有“高内聚”特性的模块集合。
另一个依据就是,每一层都需要解决特定的问题。那这些问题是什么呢?在这里举一个旅游的例子来方便大家理解。
假设我们现在在上海,想去云南旅游。要实现这个目标,我们首先要考虑的第一个问题,就是我们如何从上海到达云南,是开车去,还是跟旅游团,还是步行?要从上海到达云南,需要经过一个又一个城市,并不是说我们嘴巴动一下,就可以直接从上海瞬移到云南,这之间是需要有方法和路径的。同样的,在网络中要将一台主机的数据传给另一个主机,首先需要解决的问题就是“如何将数据从一台主机传递给另一台主机”。
当我们决定好怎么去云南后,就要面临第二个问题了。整个中国这么大,交通路线众多,但我们在前往云南的时候,怎么确定我们的路线呢?这就要求我们在旅游的过程中,要有判断和选择路线的方法,或是看导航,或是询问路人。同样的,在网络中,一台主机加入的局域网或广域网中存在大量的主机和路由器,所以当一份数据在网络中传输时,这份数据要有路径选择的能力,选择前往目标主机的路径。
尽管我们在旅游的过程中可以依靠导航和询问路人的方法来选择路线,但是也可能出现导航出问题、或者路人记错路了的情况导致我们选择的路线出现问题。此时,我们就会可能原路返回或跟着这条路线去找其他的路。这就是我们在旅游的过程中,要有对路线的容错和纠错能力。在网络中,数据传输时也可能选择错误的路线,此时就要求数据有容错纠错的能力,比如让主机重新发一份。
解决了上面的三个问题后,我们终于可以顺利到达云南了。但是,到达云南是我们此行的目的吗?并不是,我们的目的是到云南玩,而到达云南,则只是实现玩这一目标的手段。因此,当一份数据被从一台主机传达到另一台主机的时候,就要求接收数据的这台主机,有利用这份数据解决应用方面的问题的能力。
总结起来,在网络通信中,一共需要解决一下四个问题:
(1)如何将数据从一台主机传输到另一台主机
(2)如何让数据传输的过程中拥有路径选择能力
(3)当数据传输出现问题时,如何让数据有容错或纠错的能力
(4)当数据成功传输到另一台主机中时,这台主机如何利用这份数据解决应用方面的问题
在这4个问题中,前3个问题都是为了实现成功传输数据的手段;最后一个问题则是为了解决数据应用的问题
4. OSI七层模型
4.1 概念
上文中也说了,协议需要有一个可以话事的人来制定。所以,在国际中,为了有一个能让大家都遵守的规定,就有了“OSI七层模型”。
OSI(Open System Interconnection 开放系统互连)七层网络模型称为“开放式系统互连参考模型”,是一个逻辑上的定义和规范。
OSI七层模型把网络从逻辑上分为了7层,每一层都有相关、相对应的物理设备。比如路由器,交换机。OSI七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输。
它最大的优点就是将“服务”、“接口”和“协议”这三个概念明确的区分开来,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
4.2 模型形式
在OSI七层模型,它认为在网络传输中一共会遇到7个问题,所以它将这些问题划分为七层。在实际中的网络中,也确实会遇到这7个问题,但是在实际的工程中,我们并不会将这七层全部实现。
4.3 各层的作用
在OSI的七层模型中,第一层物理层是要解决硬件电路的问题,即比特流与电子信号的转换。
第二层数据链路层,其实就是解决我们上面提出的四个问题中的第一问题“如何将数据从一台主机传输到另一台主机”。
第三层网络层,主要做的就是地址管理与路由选择。在数据传输中存在大量的路由器和主机,它所要做的就是保证数据有“路径选择的能力”,即解决上面的第二个问题。
第四层传输层,就是用于判断数据在主机之间传输过程中是否丢失,当数据出现问题时如何解决。为数据提供容错纠错能力,即解决上面的第三个问题。
要理解会话、表示和应用三层,在这里举一个相亲的例子。假设你现在要去相亲,媒婆给你推荐了一个人的微信,让你加她的微信和她聊聊。当你加上对方的微信时,就是建立的一个通信渠道,如果人家看不上你,拒绝了你的好友申请,那就是建立通信失败。这就就是会话层的功能,在两个主机之间进行通信管理,负责建立和断开通信。
当你加上对方的微信后,你们便开始聊天了。在聊天的过程中,你发现你们的兴趣爱好差不多,她说的内容你能懂,你说的话题她也能接上。到后面,你们在聊天时甚至可以通过一个表情包,一个字符就判断出对方的意思。这其实就是表示层的功能,接收不同表现形式的信息并转化出来。
你们聊了几个星期后,越聊越火热,于是在某一天你们就约定好出门一起玩,一起看电影。此时就是应用层的功能,针对特定的应用场景,完成特定的应用业务。
最后的会话,表示和应用三层,就是在解决上面的第四个问题。虽然这三层在逻辑上并没有问题,但是在工程实践中发现无法针对这三层提供一个放之四海而皆准的标准。由于这个原因,在实际中,便将这最后三层拍成了一层。而如何解决这三层的问题,便交由了用户,即程序员根据特定场景来自行实现。但是在实际编写代码的过程中,其实就是要实现这三层的内容,只是从模型上,将这三层拍成了一层。
所以,虽然OSI七层模型在逻辑上没有问题,但在实际中并不会采用OSI七层模型,而是采用TCP/IP五层(或四层)模型
5. TCP/IP五层(或四层)模型
5.1 TCP/IP五层(或四层)模型形式
TCP/IP五层(或四层)模型一共分为五层,但是物理层一般比较少用,使用有时会将其看做只有物理层以上的四层。
5.2 TCP/IP五层(或四层)模型的概念
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。在某些情况下,会忽略掉TCP/IP的物理层,将其看做四层模型。
TCP/IP五层模型的前四层和OIS七层模型的前四层一模一样,而其第五层就是将OSI七层协议的后三层压缩在一起所形成的应用层。
(1)物理层
物理层主要负责通信时的光/电信号的传递。比如现在以太哇昂同国内高的网线(双绞线),早起以太网采用的同轴电缆(现在主要用于有线电视)、光纤、现在的wifi无线网使用的电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)也工作在物理层。
在这里的集线器大家可以了解一下。我们知道,光电信号在远距离传输的过程中是会出现衰减的,就好比我们发出的声音,在达到某个距离后就会逐渐开始衰减直到消失,光电信号也是一样的。集线器的作用就是对信号放大。当光电信号在传输的过程中信号衰减到了某个临界值时,集线器就会对光电信号进行放大,让它能够继续向前传输。这个过程大家可以看成游戏中的奶妈,在你的角色快要没血时,集线器的作用就是给你加血让你重新焕发生机。
在物理层中还有一个东西,叫做调试解调器,也就是我们俗称的“猫”。大家家里应该都有“猫”,在“猫”身上就插满了各种线。其中就有我们俗称的网线(双绞线)和光纤。
双绞线大家应该都见过,它的头部带有水晶头,水晶头中还带有铜片:
双绞线其实就是我们俗称的“网线”。在传输信号时就是通过上面的8根铜片将光电信号传输出去。
光纤和双绞线不同,它内部是使用玻璃丝来进行传输:
实际中的光纤的玻璃丝并没有图上那么粗,一般和我们的头发的粗细程度一样。光纤的头部也是连接了水晶头的,用于与外部设备相链接。
当我们家里需要联网的时候,一般都是要先将光纤插到“猫”,即调试解调器上。
在网络当中传输数据时并不是传输光信号,而是传输另外两种信号,分别是数字信号和模拟信号。其中,模拟信号比较实用与网络传输,而数字信号就是我们一直说的0、1这种信号,比较适合家庭内部的使用。而“猫”的作用就是用于数字信号和模拟信号的相互转化,适配网络发送和本地局域网的数据解释。
因此在实际中,一般是将光纤插到“猫”上,然后再从“猫”上拉一根线接到路由器上,这样路由器接收到的才是0、1的数字信号。
物理层中还存在网卡:
网卡就是用于将接收到的各种数字信号进行转化。网卡中也是存在寄存器的。当有信号来时,就会对网卡中的寄存器中特定的bit进行充电,进而存储特定的0、1序列。而网卡中存储的这些0、1序列就可以被OS系统读走,获取特定的信息。
(2)数据链路层
负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作,有以外网、令牌环网、无心LAN等标准。交换机(Switch)工作在数据链路层,实现从数据链路层到物理层的链接。
(3)网络层
负责地质管理和路由选择,例如在IP协议中,通过IP地质来标识一台主机。并通过路由表的方式规划出两态主机之间的数据传输的路线(路由)。路由器(Router)工作在网络层,实现从网络层到物理层的连接。
(4)传输层
负责两态主机之间的数据传输,如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机。
(5)应用层
负责应用程序间沟通,如简单电子邮件传输(WSTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对于应用层。
在这五层里面,除了物理层外的其他四层就分别对应了上文中所说的网络传输中会遇到的4个问题。
6. OSI七层模型与TCP/IP五层模型对比
TCP/IP五层模型和OSI七层模型的前四层都是一模一样的。而TCP/IP五层模型的第五层其实就是将OSI七层模型的后三层压缩成了一层。
在这里物理层代表的硬件方面的内容。从数据链路层往上都是属于软件的内容了。
其中的网络层和传输层其实是数据OS的,即这两层的内容是有OS实现的。并且世界上的所有OS的网络层和传输层的实现都是一样,通过这种方式,就可以让网络在全世界的任何一台可连接的主机上传输。
在传输层之上之上的应用层,就是用户,即程序员需要实现的内容。同时要知道,既然应用层的下一层传输层属于OS,这就代表我们在进行网络编程时,势必需要使用系统调用接口。而这些接口又和文件系统有密切关系。大家应该都了解过进程间通信。其实网络也是一种进程间通信,就是将一台主机中的数据通过进程发送给另一台主机的某个进程。只不过我们以前了解的进程间通信是单主机内的进程通信,而网络中则是跨主机通信。因此,我们其实只需要将以前单主机通信的缓冲区、通信目标等修改,就可以完成网络间的进程间通信。因此,在OS中的网络相关的系统调用接口是被整合进了文件模块的。
物理层在实际中考虑的比较少,所以TCP/IP五层模型有时也被称为四层模型。
我们一直在说TCP/IP五层模型,那么这里的TCP和IP究竟指的是什么呢?其实TCP和IP分别是传输层和网络层中使用最广泛的协议。并且由于这两层属于OS,所以全世界的OS随便拉出来一个,它的这两层也基本都是使用的TCP和IP协议。
四、网络传输基本流程
在这后面,由于物理层并不是我们需要详细了解的,所以后面也就不再谈物理层了,而是只看后四层。
1. 协议报头
要了解局域网中网络通信的基本流程,我们首选就要对局域网有一个概念。而在了解局域网之前,要先了解协议报头。
在上文中说过了,网络中是进行了分层的,每一层都有自己的协议。而每一个协议的最终表现就是,协议都要有报头。这个协议报头大家可能不是很了解,这里举一个例子。
大家应该都在网上买过东西,在网上购物时,我们所买的东西并不是直接由商家亲自上门送到我们手上的,而是商家通过快递发送,然后我们再从快递员或者快递站中取到的。
假设今天我们从网上买了一个水杯,商家通过顺丰快递给我们发货。当水杯到的时候,我们去拿快递时,拿到的不仅仅有水杯,还有一个快递盒子和一张贴在上面的快递单。但是,我们从网上买的东西仅仅是水杯,并没有买快递盒子和快递单。这也就说明,在我们网上购物时,商家发货过来的东西并不仅仅是我们买的物品,还会多一部分。而这多出来的东西,其实就叫做“报头”。更准确来讲,这里的“快递单”才是“报头”。
那为什么在发快递的时候,会有多出来的快递单呢?这个东西其实并不是给用户看的,而是给快递员看的。在这个快递单中包含了收货人和发货人的姓名、地址、联系电话等等内容,快递员可以通过这上面保存的信息来找到对应的收货人。
但是顺丰快递是如何确保他们的快递员可以看懂快递单上的内容的呢?其实就是通过“格式”来实现的。例如快递单的左边是收货人的信息,右边是发货人的信息,通过这些规定,就可以让全国各地的每一个快递员都认识这个快递单上的内容。如果没有这些规定,就可能有人发货的时候就在快递单上写个张三,然后下面带一串数字。快递员看了怎么知道这些信息到底是收货人的还是发货人的信息呢?所以,协议通常是通过协议报头来进行表达的。
假设我们这次买的不是一个水杯,而是一个无人机,在我们没有使用过无人机的情况下,我们怎么知道如何使用它呢?此时我们就会翻出这个无人机所携带的说明书,查看上面的操作说明。而这份说明书,其实就是应用层的协议。
虽然在这个例子中只有快递站这个传输层,但如果在快递站之下又进行了外包,例如顺丰把快递外包给韵达,那么在韵达这一层也会一份快递单。即在网络传输中,每一份数据最终在被发送或者在不同的协议层中时,都要有自己的报头。
注意,虽然在现实中收快递时我们会接触和看到快递单,即快递站的协议报头,但这是现实中为了图方便省事和验货而导致的。在网络中,上层是看不到下层的协议报头的。即用户层是看不到快递站的协议报头的。
所以,协议报头其实就是数据在协议分层中传输时所被赋予的协议的相关内容。总结起来,协议报头有如下三个特点:
(1)协议每一层都有,而每一个协议的最终表现就是就是“协议都要有协议报头”
(2)协议通常是通过协议报头来表达的
(3)每一份数据在被发送到在不同的协议层中,都要有自己的报头
2. mac地址
大家应该知道,每一台机器都是有自己的“名字”的,这个名字指的就是每一台主机的网卡中的地址,即mac地址,用于标识自己在局域网中的唯一性。该mac地址一般是占6个字节。
在我们的linux中就可以输入“ifconfig”命令查看mac地址:
这里的这个ether就是该主机上的mac地址。虽然说这个mac地址是唯一的,但是是可以通过虚拟化技术虚拟生成一个mac地址的,这个暂时先不做考虑。大家也可以在自己的电脑上搜索cmd打开命令提示符界面,然后输入“ipconfig /all”查看自己电脑的mac地址:
3. 数据包封装和分用
3.1 不同协议层的数据称谓
不同的协议层对数据包有不同的称谓,在传输层叫做“数据段”(segment),在网络层叫做“数据报”(datagram),在链路层叫做“数据帧”(frame)。
3.2 封装
引用层的数据通过协议栈发到网络上时,每层协议都要加上一个数据首部,即报头(header),称为封装(Encapsulation)。
首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息。
数据封装成帧后就发送到传输介质上,到达目标主机后每层协议再剥掉相应的首部,根据首部中的“上层协议字段”将数据交给对应的上层协议处理。
3.3 分用
当数据被从一台主机传输到另一台主机后,这份数据就需要被对应协议层读走报头,然后将数据向上传输。而数据向上传输的过程就是分用。虽然在上文中的协议分层中每层协议层都是一一对应的,但是在实际上,每层协议层可能有多个上次协议层。
4. 局域网通信
局域网,其实就可以看成是在同一台路由器下运行的主机组成的网络。在同一个局域网中的主机,是可以直接通信。即可以不通过路由器完成数据的传输。
那么在同一个局域网的主机是如何进行通信的呢?举个例子。假设你今天正在上课,你和张三是同桌。当你们的老师来上课时他在课堂上说:张三,这道题你上来做一下。张三听到这句话后,就站起身来走向黑板做题去了。此时,你和你的其他同学都在这个教室里面,都听到了老师的这句话,但为什么只有张三站起来走向黑板,而其他人却没有动作呢?因为老师此时明确的喊了张三的名字,指名道姓的叫他上去,而你作为他的同桌,此时听到了这句话,但是却没有动作,就是因为这句话并不是对你说的,对你而言无关紧要。这其实就是局域网的通信原理。
在同一个局域网中的主机,可以看成是用网线连接起来的。假设现在有如下一个由七台主机组成的局域网:
假设此时mac1向mac7发送一条“你好”的信息,此时在这个局域网中的所有主机其实都看到了这条信息。但是由于mac1在发送信息时指定了向mac7发送,所以虽然其它几台主机都看到了这条消息,但是它们通过对比mac地址发现并不是向自己发送的,于是什么都不做。而mac7对比mac地址后发现是向自己发送的,于是接收这条消息。
通过上面的内容就可以知道局域网的数据是如何正确传输到目标主机了。但是,这两台主机在通信时,是如何通信的呢?首要要知道,因为协议分层的缘故,所以两台主机在通信时,势必要经过多层协议。
在局域网中有多个通信标准,最常见的就是以太网、令牌环网和无线LAN三种方式。下图是一个以太网的通信标准,这里就以下图来介绍两台主机是如何通信的:
假设我们现在作为用户,向另一个人发送了一条“你好”的消息。这条消息首先会进入应用层,而应用层有自己的协议,所以此时就要添加应用层的协议报头。添加完成后,再这这份数据向下传输到传输层,传输层也有自己的协议,所以也要添加自己的协议报头,依次往下,每经过一层都要添加对应层的协议报头:
同时,在局域网中传输数据时,其他主机也会看到这份数据,但是通过对比后发现这份数据不是发给它的,这些主机就不会接收这份数据。
当数据在传输时,这份数据应该被叫做“报文”。最外层的协议报头被称为“报头”,而报头后面的内容,即后面的协议报头和要发送的信息被总称为“有效载荷”。即报文 = 报头 + 有效载荷:
当数据到达数据链路层后,这份数据就会通过以太网传输到另一台主机。当数据从一台主机被传输到另一台主机上时,并不是直接传输到应用层,而是传输到它的最底层,数据链路层。此时该主机的数据链路层会拿走最外层的协议报头,然后将剩下的数据向上传输到网络层。网络层再拿走最外层的协议报头,继续将剩下的数据向上传输,直到传输到应用层后,应用层拿走最后一个协议报头进行解析,最后将“你好”这条数据反馈给用户:
在这个传输过程中,用户A的数据向下传输添加协议报头的过程,就被叫做“封装”;而用户B中拿走协议报头进行解析过程,就被叫做“解包”。而将数据向上传输的过程,叫做“分用”::
上面的图中为了方便看到报头,用图形来代替了协议报头。同时,在实际中的数据会带着协议报头一起往下传输,不会残留在上一层。这里画出来是为了方便大家看清传输过程。
通过上面的图我们可以发现,在同一层中,它们所拿到的数据都是一样的。所以在网路协议中,我们可以认为同层协议在在直接通信,也可以理解成是向下交付的。
在有了上面的认知后,大家可能就会有如下2个问题。
(1)如何判断报头和有效载荷
(2)如何判断自己的有效载荷要交给上层的哪个协议。
大家知道,当一份数据在被传输过去后,其本质是一串0、1序列。虽然上面的图中用正方形圈出来进行了分辨,但是在实际的数据传输中可没有这个正方形来供主机区分,那么它是如何判断哪部分数据是报头,哪部分数据是有效载荷的呢?同时,虽然上面的图中每一层的上层都只有一个协议,但在实际中它的上层是存在很多协议的,就类似一棵多叉树。
这两个问题是每一层协议都需要面对的问题,都需要解决这两个问题。
其中一种解决方案就是,规定前多少字节为报头。假设规定传过来的前20个字节为报头,当上层接收到传过来的100字节数据,它就会去先读取前20个字节拿到报头,而后面的80字节就是有效载荷。而这份报头里面的前n个字节中的数据就包含了这份数据要向上层的哪一个协议传输。通过这种方式就解决了如何获取协议报头和如何知道这份数据应该向上层的哪一个协议传输。
5. 局域网的不同标准
5.1 碰撞域
在当前的局域网中,主要有三种标准,分别是以太网、令牌环网和无线LAN。在了解它们的区别之前,我们要先有一个认知,那就是在局域网中,同时只允许一个主机在任何时刻在局域网中发送消息,否则可能发生碰撞。
原因就是,在局域网中,我们可以将它们看成由一根网线连接起来的主机所组成的网络,因此传输数据时只有一条唯一的通道可以传输。
这一特性就会导致如果在同一个局域网中多台主机同时发送消息,就会出现多个数据流之间发生碰撞进而出现数据丢失、数据被覆写等问题。这一特性就有点像在进程间通信和线程中所学习的“临界资源”一样,在同一时刻只允许一个进程或线程访问。因此,如果站在系统的角度来看,网络资源其实也是一种“共享资源”。由于局域网中多台主机同时发送数据可能导致碰撞,局域网有时又会被称为“碰撞域”。
5.2 以太网
以太网的通信方式,当多台主机在同一个局域网中发送数据时,如果发生了碰撞,就重新发送;如果没有碰撞,就保留数据。但是大家不要认为以太网标准在传输数据时很容易发生碰撞导致数据传输很容易出现问题,进而需要频繁的重发。在实际上,以太网通过算法优化后发生碰撞的概率是非常小的,运行速度也是非常快的。是当今局域网使用的主流标准。
以太网这个名字大家可能有点疑惑。这个名字的来源其实是物理学中的“以太物质”,有兴趣话的大家可以去了解一下。
5.3 令牌环网
为了解决碰撞的问题,令牌环网采用的方案就是,在令牌环网的局域网中,存在一个“令牌”数据,只有持有这个令牌的主机才能向网络发送数据,没有该令牌的主机则只能等待获取令牌。这一原理其实就和多线程中使用的锁是一样的。
至于无线LAN,就不再过多讲解了,它的使用并没有以太网那么广泛。
6. 广域网通信
广域网通信和局域网通信的方式是差不多的,唯一的区别就是在广域网中使用了路由器来完成数据包的转发,换句话说,路由器中一定存在两个或以上的网络接口来实现不同局域网的数据转发。
假设现在有以上两个不同局域网的主机要通信,左边的主机向右边的主机发送了一条“你好”的消息,这条消息同样会按照协议分层逐层往下传递,并在每层协议中获取协议报头:
当到达数据链路层时,这份数据就需要通过路由器转发到另一个局域网中的主机。此时,这份数据首先会传输到路由器中的驱动程序,即数据链路层,然后再这里进行解包,解包出的数据传递到路由器内,然后路由器再将其传到另一个驱动程序内并封装一层协议报头,再传到目标主机的数据链路层。即将数据传到路由器和将数据从路由器转发到另一台主机的过程中还要经历一次解包和封装:
如果大家观察仔细点,就会发现在上面的图中,左侧主机所处的是以太网,而右侧主机所处的是令牌环网。虽然它们所处局域网的标准不同,但是却可以没有阻碍的进行通信,这其实就是协议分层带来的优势,即“屏蔽底层网络差异”。通过在路由器中进行解包和封装的过程,就在无形中将以太网的标准替换为了令牌环网的标准,实现了双方的通信。
五、认识ip地址与mac地址
1. ip地址和mac地址的概念
1.1 IPv4与IPv6
首先我们要知道,ip地址是由ip协议提供的,而ip协议是属于网络层的协议。ip协议,在目前有两个版本,分别是IPv4和IPv6。这两个协议的区别之一,就是可表示ip数据的多少。
IPv4的ip地址是用4字节的无符号整数表示的,一共可以表示出2^32,即42亿左右的ip地址。但是根据2022年的数据,当今世界的网民已经有接近50亿人了,假设人手一台网络设备,ip地址就已经不够用了,更不用说当今推行的物联网时代,越来越多的物品可以联网,这也就导致继续采用IPv4协议的话,ip地址已经严重不足了。当然,有人可能会问,既然ip地址已经严重不足了,那为什么当前的网络使用却没有什么问题呢?这其实就涉及到IPv4的公网ip、私网ip等问题。在这里,大家只用知道,IPv4所能提供的ip地址已经无法满足未来的网络发展需求即可。
IPv6的ip地址是采用16位的无符号整数来表示的,根据指数爆炸的概念我们可以知道,IPv6所能表示的ip地址数量就远远超过IPv4。但是,当今时代主要使用的ip协议是IPv4的版本。一个原因是网络发展的时间太久了,大家已经使用了数十年的IPv4了,所以现今存在的大部分网络设备都是采用的IPv4。另一个重要原因就是,IPv6无法兼容IPv4。因此如果想将I已经存在的全部网络设备从Pv4切换为IPv6,其需要付出非常巨大的代价,大家普遍无法接受。还有一个原因就是IPv6的发展时间并不长,所以稳定性还存在问题,比不上IPv4。因此现存的大部分网络设备都是采用的IPv4。
但是,IPv4提供的ip地址数量逐渐无法满足需求的现象也是客观存在的,所以现在越来越多的新出现的网络设备都开始使用IPv6了,而一些比较老的网络设备也在尝试从IPv4切换到IPv6。可以预见的是,在不远的将来,IPv6将替代IPv4成为ip协议中的主流版本。
1.2 ip地址的概念
ip地址是在ip协议中,用来标识网络中不同主机的地址。对于IPv4来说,ip地址是一个4字节,32位的无符号整数。
我们通常也使用“点分十进制”的字符串来标识ip地址,例如192.168.0.1;用点分割的每一个数字表示一个字节,范围是0~255。该字符串除了可读性好以外,与32位整数表示的ip地址相比没有任何优势
1.3 mac地址的概念
mac地址是用来识别数据链路层中相连的节点的。它的长度为6字节,即48位整数。一般是用16进制数字加上冒号的形式来表示。如08:00:27:03:fb:19
mac地址是在网卡出厂是就确定了的,无法修改,是唯一的。但是也存在一些特殊情况。例如在虚拟机中的mac地址就不是真实的mac地址,可能发发生冲突;也有一些网卡是支持用户自己配置mac地址的。
如果大家想查看自己的linux的ip地址,就可以输入“ifconfig”来查看:
在上图中,ether后面的一串数字,其实就是你的linux'的mac地址。而上面的inet其实就是这台机器的ip地址。如果你使用的是云服务器,那么你就会发现,这里显示的ip地址与你的服务器的ip地址是不一样的。其实是因为这里的inet是一个内网ip地址,即你所买的这台机器在对应的公司中的对应主机的内网ip,与你所使用的ip地址是不一样的。
2. ip地址和mac地址的作用
要理解它们的作用,在这里举个例子。假设你居住在上海,现在想到昆明去旅游。此时你的目标地点就是上海—>昆明。但是在从上海到昆明的过程中,你需要经过一个又一个的城市。假设你是自驾游,当你开车到绵阳后,你问当地人,你想去昆明,途径哪一个城市离昆明最近,于是他告诉你,你应该向南走到达成都。于是此时你继续开车从绵阳到了成都。当你到了成都后你又问当地人,要去昆明应该怎么走,于是他又告诉你你应该向南到眉山,于是你又开车从成都到了眉山。最后才从眉山到达成都。
在上面旅游的例子中,你的脑海中就保存了两个地址,一个是你的目标地址,即“上海到昆明”;另一个则是下一个地址,即“绵阳到成都”。在这两个地址中,目标地址是一直不变的,而下一个地址是会随着你的当前地址的变化而不断变化的。
这里面的起始地址在网络中就被称为“源IP”,目标地址就被称为“目的IP”。是为在网络中的数据的下一个目标提供总体方向目标,以方便路径选择的。而这个目的IP,就是使用的IP地址。
另一个不断变化的地址,就是数据当前所在的地址和下一个应到地址的组合。这个地址就是使用的mac地址。
因此,ip地址是用于为网络中数据传输提供数据传输的终极目标的;mac地址则用于数据在网络中的层层跳转。ip地址在数据传输中基本不会发生变化,而mac地址则会随着数据的传输而改变。
在广域网中传输数据时就可以看成如下图所示:
当数据传输时,就会通过mac地址来选择将数据包转发给某个路由器。而这份数据要从某台主机传输到目标主机的地址就是使用的ip地址。