独立模式: 计算机之间相互独立;
在早期的时候,计算机之间是相互独立的,此时如果多个计算机要协同完成某种业务,那么就只能等一台计算机处理完后再将数据传递给下一台计算机,然后下一台计算机再进行相应的业务处理,效率非常低下。
网络互联: 多台计算机连接在一起, 完成数据共享
有人设法将这些计算机连接在一起,当某个业务需要多台计算机协同完成时,就可以将共享的数据放到服务器中进行集中管理,此时各个计算机就都能获取到这些共享的数据,所以各个业务在处理就能随时进行切换了
局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起;
后来这样的网络雏形逐渐发展,连入这个网络中的机器变得越来越多,于是就出现了局域网的概念。
在局域网中有一种设备叫做交换机,交换机主要完成局域网内数据的转发工作,也就是在局域网内将数据从一台主机转发给另一台主机。各个局域网之间通过路由器连接起来,路由器主要完成数据的路由转发工作。
广域网WAN: 将远隔千里的计算机都连在一起
各个局域网之间通过路由器相互连接在一起,便组成了一个更大的网络结构,我们将其称之为广域网。实际局域网和广域网是一种相对的概念,我们也可以将广域网看作一个比较大的局域网。
“协议” 是一种约定.
比如通信计算机双方曾经做过如下约定:
就是一个位段结构,我们是可以通过位段来表示某种协议规定的,而实际上计算机网络里面的协议报头也就是通过位段来实现的。
我们有了这样的约定后,当甲计算机向乙计算机发送类似于{1, 0x1234}的数据时,乙计算机识别到code的值是1,于是就知道了甲计算机是让自己将data的值存储进数据库,这是一种纯软件的约定方案。
思考: 只要通信的两台主机, 约定好协议就可以了么?
不可以
操作系统除了进程管理、文件管理、内存管理、驱动管理之外,还有一个内嵌的软件协议栈
我们通常在手机或者电脑上使用的APP,比如抖音、快手、淘宝等,这些APP都是在应用层的。用户在应用层的各种请求最终会下达给操作系统,操作系统内除了进程管理、文件管理、内存管理、驱动管理之外,还有一个内嵌的软件协议栈,协议栈将用户的数据进行各种封包后,通过网卡将数据传递到网络当中,数据在网络内部经过各种路由转发,最终将数据传送到了目标服务器。
目标服务器和对端服务器都有自己的协议栈
目标服务器本身也是一台计算机,该计算机的操作系统就是Linux,而我们在访问目标服务器时使用的可能是Windows、安卓或者IOS等操作系统。此外,对端服务器也有自己的协议栈,对端服务器将拿到数据通过协议栈进行各种解包操作后上交给应用层,在对端服务器的应用层就有一个对应的软件服务器,比如抖音服务器、快手服务器、淘宝服务器等,软件服务器内部对收到的用户请求进行各种分析处理后,再将对应的数据以相同的方式返回给用户。
协议栈是网络标准组织定义的,是具有全球性质的,所有的操作系统都必须支持
也就是说,虽然客户端和服务端可能使用的是不同种类的操作系统,但每个操作系统实现网络协议栈的方法包括各种细节都是一样的,因此双方对数据进行的封包和解包操作都是一样的。
操作系统除了有四大管理模块,还与网络协议栈有密切的关系。
网络协议栈主要负责数据的通信,其自顶向下可分为四层,分别是应用层、传输层、网络层、数据链路层。
网络协议栈各部分所处位置:
网络协议栈分层的目的
层状结构的本质是软件工程上面的解耦,此时层与层之间只有接口的相互调用关系,此时我们就可以让研究不同领域的开发人员编写不同层的代码,最后再将各层的代码联调起来,由于每一层的代码都是对应领域的专业人员编写的,因此代码联调后整体的性能也是很高的。
并且这样的层状结构可以增加代码的可维护性和可扩展性。比如有一天你觉得数据链路层的代码已经无法承担起通信的能力了,那么此时我们就可以用一个新的协议对它进行替换,而其他各层对应的协议都不用换,这就叫做可扩展性。而如果协议栈的某一层出现了问题,我们只要确定了是哪一层出了问题,就可以直接去对应层去找问题,这就叫做代码的可维护性。
协议分层的好处
网络协议栈设计成层状结构,其目的就是为了将层与层之间进行解耦,保证代码的可维护性和可扩展性。
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.
同一个网段内的两台主机进行文件传输.
首先需要明确的是,同一个局域网内的主机是能够直接进行通信的,因为最初局域网设计的目的,就是为了让局域网内的主机能够进行通信。
当用户要将文件传输给另一台主机前,该文件数据需要先通过网络协议栈进行封装:
数据封装完毕后就可以通过局域网将其发送给对端主机了,而当对端主机收到数据后,对应也需要通过网络协议栈对该数据进行解包与分用:
总结一下:任何一台主机在发送数据之前,该数据都要先自顶向下贯穿协议栈来完成数据的封装,在这个过程中,每一层协议都会添加上对应的报头信息;而任何一台主机收到数据后,都要先自底向上贯穿协议栈来完成数据的解包和分用,在这个过程中,每一层协议都会将对应的报头信息提取出来。
数据包封装和分用
封装过程
数据分用过程
什么是报头?
报头本质也是一种数据,报头一般是通过位段实现的,因此协议栈的每一层都有一个对应的位段来表示当前层的报头。
数据的封装与解包:
有效载荷
因为每一层的协议实际上只关心数据中与当前层对应的报头信息,而剩下信息的具体内容根本不必关心,我们将数据中除当前层的报头以外的数据叫做“有效载荷”。
需要注意的是,上层协议在数据封装时添加的报头信息,在下层协议进行数据解包时看来就是有效载荷。比如数据封装时应用层添加的报头信息,在对端主机进行数据解包时,在对端主机的传输层、网络层以及链路层看来,该应用层曾经添加的报头信息就是有效载荷。
如何将报头与有效载荷进行分离?
协议栈的每一层都要从数据中提取对应的报头信息,而要将数据中的报头提取出来,首先就需要明确报头与有效载荷之间的界限,这样才能将它们进行分离。而每一层添加报头时都是将报头添加到数据的首部的,因此我们只要知道了报头的大小,就能够讲报头和有效载荷进行分离。
获取报头大小的方法通常有两种:
实际上每个协议都要提供一种方法,让我们获取到报头的大小,这样我们才能在解包时将报头与有效载荷进行分离。
当前层如何知道应该将有效载荷交付给上层的哪个协议?
实际在每种协议的报头当中,几乎都会包含一个字段,表明我们应该把分离出来的有效载荷交付给上层的哪个协议,这就是分用的过程。
局域网之间都是通过路由器连接起来的,因此一个路由器至少能够横跨两个局域网。而这些被路由器级联局域网都认为,该路由器就是本局域网内的一台主机,因此路由器可以和这些局域网内的任意一台主机进行直接通信。
比如局域网1当中的主机A想要和局域网2当中的主机H进行通信,那么主机A可以先将数据发送给路由器,然后路由器再将数据转发给局域网2当中的主机H。
采用不同通信标准的两个局域网内的主机通信
如果路由器级联的两个局域网采用的是相同的通信标准,那么通信过程大致就是上述那样。但被路由器级联的局域网可能采用的是不同的通信标准,比如局域网1采用的是以太网,而局域网2采用的却是令牌环网。
由于以太网和令牌环网是不同的通信标准,它们给数据添加的报头也是不一样的,因此令牌环网当中的主机无法对以太网当中的数据帧进行解包。
这种情况实际是由路由器来处理的,路由器是工作在网络层的一个设备,我们可以认为路由器当中的协议栈是下面这样的。
此时当数据要从局域网1发送到局域网2时,路由器收到局域网1的数据后,会先将以太网对应的报头进行解包,然后将剩下的数据向上交付给网络层,在网络层进行一系列数据分析后,再将数据向下交付给链路层,此时在链路层当中就会给该数据添加上令牌环对应的报头信息,然后再将该数据发送到局域网2当中,此时该数据就能够在令牌环网当中传输了。
需要注意的是,IP协议有两个版本,分别是IPv4和IPv6。IPv4用32个比特位来标识IP地址,而IPv6用128个比特位来标识IP地址。