目录
1.网络发展
2.初识协议
2.1协议分层
2.2OSI七层模型
2.3TCP/IP四层(五层)模型
3.网络传输的基本流程
3.1协议报头
3.2局域网通信原理
3.3广域网通信原理
3.4数据包的封装和分用
4.网络中的地址管理
1.网络发展
计算机是帮助人解决计算问题的,而人之间做工作是相互协作的,如果人与人之间没有相互协作,每个人都是割裂的,那么每个人一生中所学的知识是非常有限的,就不可能有大的创新,也就没有现在的社会。既然计算机是帮助人解决计算问题,那么计算机与计算机之间也需要相互协作,久而久之形成了网络,即多台计算机连接到一起,完成数据共享:
那么上图就构成了一个简单的局域网,最初的局域网诞生于各种高精尖的实验室当中,计算机与计算机通过网线或者其他方式连接在一起,或者干脆直接安排一台专用于数据转发的服务器,实现数据共享。
随着时间的推移,各个局域网之间想要相互通信,那么局域网与局域网之间通过特殊的网络假设实现通信,这样呢,就诞生出了广域网:
这里需要强调一点,局域网与局域网之间的网络假设不只是交换机、路由器这么简单,现实情况远远比该图复杂的多。这里不得不引出网络发展的幕后推手:运营商。实际上在现实生活当中,我们想要上网,仅需一个电话,由对应运营商(例如移动、电信、联通)的工作人员上门拉一根光纤进门(俗称光纤入户),这样我们就可以上网了。所以说,运营商已经做好了各种基站、机房、路由器等等基础网络架设,实现了远距离网络通信。所以在这里将一个笑话:学计算机搞不定的交给操作系统,学网络搞不定的交给运营商。
同时也需要注意,广域网和局域网只是一个相对的概念,就比如以国为单位的局域网、以省为单位的局域网等等,我们暂时这么理解:不需要路由器跨网络传输的网络称为局域网;反之称为广域网。
2.初识协议
其实不止计算机与计算机之间需要网络进行通信,单个计算机也是一种小型的网络结构。单个计算机中,有各种硬件设备,例如内存条、网卡、CPU、硬盘等等,它们之前通过各种总线进行通信,例如系统总线、I/O总线等等,这就是一个小型的网络结构,硬件在进行数据传输时,也需要有协议(反正我知道的就有SATA协议):
如果我们将计算机内部的硬盘、显卡、CPU等等从计算机内部拉出来,放到很远很远的地方,这些总线也无线延长,那么这个网络结构就扩大很多很多了。如果再将这些单独拉出去的硬件集群,即所有计算机都没有硬盘、CPU,而是通过网络拉取数据,那么一个超大的计算机就出来了:
很多大型企业的机房就采用这种结构,我们平时只是被微型计算机"惯坏了",主观认为计算机只有那么大点。这种计算机结在宏观上表现为一台单独的计算机,微观上表现通过网络获取数据。
人与人之间近距离交流是非常方便的,即所听即所得,但是当距离放长一些,就需要大声的喊,甚至有时候会听不到。计算机通信的时候也是这样,近距离的信息传输非常容易,成本不高,但是一旦传输距离拉长,那么信息的传输就可能不完整、不准确、甚至传输到一半就丢了,所以为了解决长距离传输带来的网络问题,就诞生出了协议,这就是为什么需要网络协议的原因。
协议实际上是一种约定,它能够节省通信之间的成本和提高通信的效率。以一个很简单的例子说明协议的重要性:假设现在是15年前,打电话是特别贵的,如果是长途电话所带来的花费开销更加恐怖,而电话拨通但未接听是不要钱的,所以小明跟他相距1000公里的父亲约定好:我给你打电话,电话铃响一声又马上挂掉代表我最近过的很好,电话铃响两声再挂掉代表没有生活费了,电话铃响三声和三声以上,代表有急事,要接电话沟通。由此,小明的父亲就在家里看着电话,通过电话的响铃次数来判断小明要自己完成什么工作:电话铃响一声,报平安呢;电话铃响两声,小明没钱啦,去银行打钱;电话铃响三声或三声以上,接电话,有急事要沟通。所以在这个例子中,电话铃的响应次数和响应次数对应的工作就是一种约定,在节省话费的同时还增加了工作效率。
那么在计算机当中也可以感性的理解成这样:假设计算机A和相隔800公里的计算机B约定好,A每次只给B发送一字节的整形数据,即char类型数据,如果值为1,计算机B就做任务1,如果值为2,计算机B就做任务2......所以在远距离通信当中,通信的双方不需要显式的发送控制信息,只需要按照协议,发送对应的"信号",接收"信号"的一方不需要纠结任何东西,直接做对应的任务。
不过协议定好了,它需要有一个表达标准。就比如说间谍行动时发送的暗号为"夜来香",那么接头的人就必须要回"红玫瑰"来确定是自己人,但是协议定好了,并没有执行标准,如果用普通话说"夜来香",再用英语回"红玫瑰",说普通话的认为对方不是自己人,而说英语的认为自己已经回答正确暗号了。所以在各大硬件、操作系统厂商当中,必须要定制协议的标准,因为不同的厂商对一件事情的定义方式不同,例如定义0和1,A厂商将高电平视为1,低电平视为0;B厂商将强电视为1,弱电视为0;C厂商以信号的集中视为1,离散视为0......所以各大厂商之间必须约定一个标准,大家都要遵守,这就叫网络协议。
2.1协议分层
在软件设计当中是要讲究分层的,那么网络协议也是需要用软件的方式来实现的,所以协议也需要分层。理解分层可以从下面三个点入手:
1.分层设计能够带来低耦合:层与层之间的耦合度是非常低的,通俗的讲就是某一层出问题或是被修改、被替换,都不会影响其他层
2.分层设计能够带来高内聚:每一层当中的功能是非常集中的,它们是耦合度非常高的模块
3.每一层都要解决特定的问题
以一个简单的例子理解分层:假设A与B正在使用电话通话,那么A认为自己在跟B直接通信,B认为自己在跟A直接通信;但实际上A说的话是给电话说的,B听到的话是从电话里来的。那么在这个例子中,人与人之间做一层,电话与电话之间做一层,人与人之间通过自己的想法来进行沟通,它们处理自己特定的任务;电话与电话之间通过某种方式进行通信,它们处理自己特定的任务。假设打电话的两个人今天说的是普通话,明天说的是英语,那么这就是在对某一层做更改,不会影响到其他层;那么假设通信的设备今天是手机,明天是无线电,这也是对某一层做更改,也不会影响到其他层。这就是一种高内聚低耦合、并且每一层都做自己特定任务的表现。
那么主机与主机之间的数据传送,其数据在传输过程中会面临四个问题:能不能去、去哪里、出错了怎么办、数据到了目标主机上应该怎么办。恰好这四个问题当中的每一个问题都有其对应的协议,每一个问题的协议又处于网络协议分层模型中的不同层。
2.2OSI七层模型
OSI七层模型简介:
1.OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范
2.OSI把网络从逻辑上分为了7层,每一层都有相关的、对应的物理设备,例如路由器、交换机
3.OSI七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输
4.最大的优点是将服务、接口和协议这三个概念明确的分离开来
5.它比较复杂并且不实用,实际上使用的都是TCP/IP四层模型
2.3TCP/IP四层(五层)模型
实际应用场景当中,将OSI的上三层(应用层、表示层、会话层)压缩成一层,即应用层,这就形成了TCP/IP四层(五层)模型。四层指的是数据链路层、网络层、传输层、应用层;五层指的是物理层、数据链路层、网络层、传输层、应用层。那么在一台计算机中,TCP/IP四层(五层)模型与OSI七层模型的对应关系如下图:
可以看到,网络层和传输层属于操作系统,也就是说这一部分是操作系统实现的,所有的操作系统实现都是一样的。那么为什么要把四层(五层)模型称为TCP/IP模型呢?因为在传输层当中,TCP是老大协议,在网络层当中,IP是老大协议,这是操作系统给它们的江湖地位,所以市面上的所有操作系统都要按照这个标准来实现,凡是能够入网、联网的设备基本都是采用TCP/IP协议。网络层、传输层作为操作系统内部实现的功能,那么在应用层进行网络编程开发的时候,操作系统必须提供有关于网络的系统调用,而这些系统调用是以文件系统的形式来使用的。
在这个模型中,任意一层都能使当前层和当前层以下的所有层的功能。例如传输层能够使用传输层、网络层、数据链路层、物理层的所有功能。
下面来感性认识一下每一层的具体功能:
1.物理层:负责光电信号的传递,最主要的功能就是解决最大传输速率、传输距离、抗干扰等问题。例如集线器就工作在物理层,它主要解决随着传输距离增长,传输的信号会随之衰减,当衰减到一定程度时,集线器开始工作并将衰减的信号放大,继续传输;例如调制解调器(光猫),能够实现数字信号和模拟信号之间等相互转换,调制解调器接收到的信号是模拟信号,转换为数字信号给路由器做解释,路由器发送给调制解调器的信号都是数字信号,不适合远距离传输,所以调制解调器需要将其转化为模拟信号,再发送到网络当中。
2.数据链路层:我们上面提到过数据在网络传输时的四个问题,那么能不能去就是数据链路层解决的问题。例如主机A要给主机B传输数据,那么传输的过程并不是直接传输,而是传输过程中一定会经过各种各样的机器,那么数据链路层解决的问题就是保证数据能够传送给与当前机器直接相连的下一台机器,如果每一台机器都具有这样的功能,那么数据从主机A到达主机B是迟早的事。交换机就工作在数据链路层。
3.网络层:数据在传输的过程当中会经过各种各样的设备和机器,那么这些机器可不是串联的,很有可能是以图状结构分布,也就是说与当前机器直接相连的机器不止有一台,而是有多台,网络层就必须具有路径选择的能力,也就是说网络层要解决数据在传输时的第二个问题,即去哪里。路由器就工作在网络层。
4.传输层:传输层解决的就是数据在传输时的第三个问题,即出错了怎么办。例如上图,可以很明显的看到数据包如果选择了发送给上面的那台机器,那么该数据包就不会到达数据B,此时就算是一种错误,那么传输层就是要解决这个错误,可以选择重发数据或者其他解决方案。也就是说,传输层需要解决数据在传输时的错误问题,也就是说要具有一定的容错能力。
5.应用层:数据从源主机发送到目标主机后,不是目的,而是手段。因为计算机、网络帮助人解决问题,那么人发送数据一定有自己的目的,而计算机、网络是发送数据的手段。那么目标主机在收到数据后,需要根据协议或者由程序员编码来解决应用的问题。
使用一个简单的例子来理解四层模型(除物理层):假设小明要从北京开车去广州,那它不可能直接嗖的一下就过去,中间一定会经过各种城市、各种地区。那么小明现具有了去往广州的基本能力,即有一辆车,小明能开着车去往任何一个城市;那么现在小明就需要选择是往北走、往东走、还是往南走,小明必须做出选择;假设小明选择了往北走,走着走着发现自己到俄罗斯了,这就说明出错了,此时需要掉头重新"发送数据";那么最后到了广州之后小明的目的就结束了吗,当然没有,小明去到广州一定有自己的目的,他可能去旅游、去出差、去工作等等,这些工作需要到广州次啊能做,那么小明从北京开车到广州就是他为了完成工作的手段。
3.网络传输的基本流程
在介绍正儿八经的网络传输时,先以一个小例子对网络传输有一个感性的认识:假设小明从淘宝购买了一块固态硬盘,那么淘宝的商家收到订单后不是直接嗖的一下将硬盘传送给小明,而是将该硬盘附上说明书、打包交给快递公司,快递公司贴上单号并邮寄给小明。那么小明家的楼底下恰好有一快递点,那么快递公司就将对应的硬盘包裹运到该快递点,然后小明取到快递。那么小明取到快递之后,需要将包裹拆开,把硬盘拿出来,然后照着说明书一步一步安装到电脑上。
在这个例子中小明认为商家把硬盘送给自己,商家认为自己把硬盘送给小明,实际上要经过下层的两个快递点,这两个快递点可以是韵达快递、顺丰速运、中通......快递公司的改变不会影响小明和商家的正常付款和发货。实际上这些都不是重点,重点是商家发货时,会将硬盘做一些包装,附上说明书,快递公司贴上快递单号开始邮寄。那么小明在收获的时候,一定会收到除硬盘以外的多出来的东西。
3.1协议报头
报头是什么:
1.不论是数据链路层、网络层、传输层......每一层都有协议,而协议的最终表现就是每个协议都要有报头
2.协议通常以报头来进行表达
3.每一份数据在不同的网络层当中,会使用不同的协议,那么不同的协议就要有不同的报头。也就是说数据在传输的过程中会被添加上多个报头
那么在上面的快递例子当中出现了两份协议报头,即硬盘的使用说明书和快递单。当商家收到订单的时候,原本只需要将硬盘给小明,但是商家进行了包装并且附上了使用说明书,这个行为就是在为数据添加报头,而这个报头就是协议的表达,其目的就是在于当小明收到硬盘之后,不需要再与商家沟通,也就是说小明看到了报头(使用说明书)就知道了他与商家的协议,小明就知道他该做什么(直接使用硬盘);那么商家在把硬盘交给快递点时候,快递点会贴上快递单,这个快递单也是一个报头,当从包裹从商家的快递点邮寄到小明楼下的快递点之后,快递点只需要看到报头就能直到它们快递公司的协议,也就是说快递点看到了这个包裹的报头之后,就知道这个包裹是给谁的,然后直接去派送即可。
那么有了报头就有报文,报文就非常简单了,暂时把它理解成报头+有效数据。就比如快递例子,在小明和商家那一层看来,硬盘就是有效数据,说明书就是报头;在快递点的那一层看来,硬盘和说明说就是有效数据,快递单就是报头。
3.2局域网通信原理
当然,这里所说的原理并不是真正的原理,而是一个感性的认识,熟悉熟悉局域网通信的大概流程。在介绍局域网通信原理之前,先介绍一个局域网通信当中的一个必要条件,MAC地址。MAC地址是网卡的一个唯一序列号,在全球内每张网卡的MAC的地址都是唯一的,虽然MAC地址在全球内唯一,但是它不应用于全球,更多的应用于局域网通信。我们可以在Linux命令行中输入[ifconfig]命令看到我们的MAC地址:
MAC地址是一个48位6字节的地址,它可以被十六进制解释。它最大的作用就是标识网卡在全球当中的唯一性,并且在局域网通信时指定一台唯一的主机。
首先要明确的是,局域网之间的通信是没有跨路由器的,也就是说局域网之间的设备是直接相连的,这就意味着处于局域网的设备可以直接通信。网络的通信方案有以太网、令牌环网、无线LAN,我们主要围绕以太网展开。"以太网"的名字由来很有意思,在上个世纪科学家们猜测光的传输是依靠一种介质,它们就把这种介质称为以太,随后科学家们为了证明存在以太这种介质,就开展了一次实验,不过两天过去,以太存不存在不知道,但是证明了不存在以太。所以随着计算机的出现,计算机的科学家们就将网络通信的传输介质命名成了以太网(就有点阴阳怪气的意思)。
我们以一个简单的例子来感性认识一下局域网:假设一间教室有一个老师和五十名学生,其中小明也是学生中的一员,某天老师上课说:小明,你站起来,你的作业为什么没做?那么这句话当然不止小明一个人听到,全班同学都听到了,但是全班同学只有小明一个人站起来。那么小明站起来随后回答道:我的作业被狗吃了。这句回给老师的话当然不止老师一个人听到,全班同学也听到了。那么在这个例子当中,老师认为自己在和小明直接通信,小明认为自己在直接和老师通信,但实际上它们通信的内容全班同学都知道了,但是为什么其他同学不站起来回答老师呢?这就是局域网的特点,局域网的一台主机向另一台主机发送数据时,通过MAC地址指定主机,数据一旦发送出去,处于局域网的所有主机都能收到这个消息,但是每个主机都会对该数据做一次检查,检查该数据是不是发送给自己的,如果不是发送给自己的,那么就将该数据再次丢到网络当中,直到该数据被真正的目的主机所接收。以一张简单的逻辑图来加深理解:
上面的例子是以以太网作为通信方案的,以太网当中的报文只能存在一份,也就是说局域网的所有机器在任何时刻只能有一台机器向以太网发送报文,否则就会发生碰撞。理论上是这么说的,实际上局域网的所有机器都在同时发送报文,这些报文会产生碰撞,而解决碰撞的方法就是重发,在宏观上达到同一时刻只能由一台机器发送报文。
那么再简单一下令牌环网。我们以操作系统的角度来看待网络,可以发现网络是一个公共资源,而令牌环网中的"令牌环"就是相当于一个互斥锁。也就是说使用令牌环网作为通信介质的局域网当中的所有机器,都会轮流占用一个令牌环,这个令牌环是一个标记,持有该令牌环的机器才可以向网络发送报文。
现在来讨论主机与主机之间在局域网当中如何通信:
首先要知道的是,主机与主机之间通信一定要遵循网络协议栈(就是上面画的那个分层模型图),每个层都有特定的协议,那么在通信时这些协议是不会全用上的,而是每一层当中选用一个特定的协议,那么这个协议的表现就是报头。那么我们以图片的形式来介绍(不要管这些协议对不对,先看大概流程):
此时用户A向用户B发送一条消息:你好。那么这条消息可以看成是一个报文,这个数据要向下交付,即从用户层向下交付给应用层。那么应用层就要为该数据做出一次封装,即添加一个报头:
应用层拿到数据之后,还是不能直接交给用户B,那么继续向下交付,即交付给传输层。同理,传输层也要添加一个协议报头:
还是一样,传输层继续向下交付:
继续向下交付给链路层:
此时软件层已经走完了,接下来链路层就要将该报文发送到局域网当中,经过兜兜转转,这个报文终于到了主机B的物理层上。注意,接收到该报文的一定是主机B的最底层,即物理层。因为主机A在向下交付的时候,每一层协议都添加了一个报头,最后的最外层报头是链路层添加的以太网协议报头,如果该报文不是被主机B的最底层接收,那么协议就对不上,就比如传输层接收到该报文,那么TCP协议怎么解释以太网协议?就好像小明买的硬盘,最后商家配了一个洗面奶的说明书,这不糊涂么?
这里穿插一个知识点:报文是由报头和有效载荷组成的,报头指的是当前层添加的报头,有效载荷指的是除当前层的协议报头以外的内容,例如主机B的链路层拿到了一串报文,那么该报文的报头就是以太网协议报头,有效载荷就是IP协议+TCP报头+FTP报头+你好。
此时主机B的链路层拿到了报文(实际上是主机B的物理层先拿到,再交给链路层,这里省略了),然后就要对该报文做解释,解释的内容有以下两个:
1.将报头和有效载荷分离
2.将有效载荷交给上层对应的协议
那么解释的过程中会遇到两个问题,报文的报头从哪里开始到哪里结束?有效载荷交给上一层的哪一个协议?这些问题我们现在暂时不深究,暂时只要知道报头当中一定存在这些信息。
那么链路层的报文继续向上交付,即交付给网络层:
此时可以明显的看到,报文的报头直接有对应的协议。继续向上交付,即交付给传输层:
继续向上交付:
此时就可以想象成,用户A把消息交给qq了,也就是把消息交给应用层,然后这个消息经过一系列的操作,最终到了主机B的应用层,也就是消息到了主机B的qq上了。此时再做一次解释,就可以将消息交付给用户了:
这就是一次局域网的通信过程。我们现在需要将名词标准化,报文向下交付的过程会添加许多协议报头,这样的过程我们称为封装;报文向上交付的时候会将报头和有效载荷分离,这样的过程我们称为解包,将有效载荷交给上一层对应的协议的过程,我们称为分用。也就是说,局域网通信当中,报文会经过封装、解包分用,最后用户层得到数据(实际上广域网也是这么个过程,只不过中间多了一个路由器)。
3.3广域网通信原理
上面介绍了局域网通信时,需要使用的是MAC地址。那么在跨网络通信当中,不仅仅需要使用MAC地址,还需要使用IP地址,并且还需要路由器的支持。IP协议是存在于网络层的,而网络层可以决定"去哪里",也就是具有路径选择的能力,同时网络层当中的IP协议还可以屏蔽底层网络差异。因为上面介绍过,网络的通信方案有以太网、令牌环网、无线LAN等等,那么两台跨网络通信的主机根本不知道对方主机使用的是哪种通信方案,所以路由器(工作在网络层)使用IP协议可以屏蔽掉底层的网络差异。我们以一张图来看一下广域网的大概样子:
路由器既然是跨网络通信的一个重要媒介,那么路由器一定属于多个局域网,所以路由器一定有多张网卡,既然有多张网卡就有多个MAC地址,所以主机和路由器在同一个局域网当中可以直接通信(通过MAC地址找到)。那么IP地址作用是什么呢?IP地址可以用来确定向哪台主机发送数据。那么在Linux当中,也可以在命令行输入[ifconfig]命令查看IP地址:
其实广域网的通信流程就是多个局域网通信的组合,我们还是以用户A向用户B发送你好的例子,只不过这次是跨网络:首先数据会在主机A上一直向下交付,到数据链路层形成最终的报文,此时能够直接的通信的机器一定是在同一个局域网当中,所以该报文将被发送到路由器的最底层;路由器接收到报文之后,进行向上交付,即解包分用,然后根据IP地址发现目标主机使用的通信方案是令牌环网,然后该报文会在路由器当中继续向下封装,只不过这次添加的协议报头不再是以太网协议报头,而是令牌环协议报头;此时报文已经离开了主机A所在的局域网,然后报文通过令牌环网被主机B所接收,然后报文在主机B上向上解包分用,最后用户B收到消息。
那么报文在路由器当中只需要一次向上解包分用,一次向下封装就可以屏蔽掉底层的网络差异,也就是说,从网络层开始向上,所有的主机都是一样的,从网络层(不包括网络层)向下,所有的主机有可能不一样,而使用IP协议便可以屏蔽底层网络差异,由此可见,为什么TCP/IP协议可以在网络当中占据老大地位。
3.4数据包的封装和分用
感性认识了局域网和广域网的通信原理之后,实际上最重要的点便是数据包(报文)在网络传输当中会经过封装和解包分用两个大过程。那么在不同的协议层当中对数据包有不同的称谓:
1.处于传输层的数据包称为数据段(segment)
2.处于网络层的数据包称为数据报(datagram)
3.处于数据链路层的数据包称为数据帧(frame)
4.处于应用层的数据包称为请求与响应(Requests and responses)
那么在数据包向下封装的过程中会经过不同的协议层,每层协议都要为数据包的首部添加一个报头,这个报头会包含一些信息,例如报头从哪里开始、到哪里结束、有效载荷在哪里、有效载荷应该交给上层的哪个协议等等:
当目标主机收到数据包后,就要开始向上进行解包分用,而解包分用的过程就类似于一颗倒着的多叉树,从根向上寻路直到交给正确的应用程序:
4.网络中的地址管理
在介绍局域网和广域网的通信原理时,认识了两种地址,即IP地址和MAC地址。其中MAC地址负责局域网通信,IP地址负责广域网通信(实际上也可以负责局域网通信)。那么IP地址有对应的IP协议,而IP协议有两套,我们常用的便是IPV4协议,所以我们看到的IP都是"xxx.xxx.xxx.xxx"这样的结构,IPV4协议的IP地址有四个字节,每个字节都是一个unsigned char类型,即可以表示0~255的值。IP地址我们通常以字符串的形式呈现,呈现的形式为点分十进制,即每个数字以"."分割,而IPV4有三个".",数字被分成了4个区域,所以称为IPV4协议。那么IPV6不在我们的讨论范围之内。
那么IP地址和MAC地址的关系是怎样的呢?首先可以明确的是,在跨网络传输中不能直接使用MAC地址,因为不在统一局域网的两台机器不能直接通信,并且跨网络的两台机器的底层网路到底有没有差异我们也不清楚。所以IP地址的作用就是确定通信的方向,我们也说过广域网的通信实际上就是多个局域网通信的组合,那么显而易见,MAC地址保证的就是通信过程中的可行性。通俗的来讲,假设主机A要与主机B跨网络通信,那它们两个很明显无法直接通信,所以它们之间的通信需要经过许多的路由器等等一些设备,而路由器这些设备是可以横跨多个局域网的,所以跨网络通信需要穿过多个局域网,而局域网的通信需要使用MAC地址。我们以一张图来理解:
那么发送数据的主机的IP地址称为源IP地址,接收数据的主机的IP地址称为目的IP地址;同理,MAC地址也分为源MAC地址和目的MAC地址。