提示:以下是本篇文章正文内容,下面案例可供参考
随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成
业务,就有了网络互连。
网络互连:将多台计算机连接在一起,完成数据共享。
数据共享本质是网络数据传输,即计算机之间通过网络来传输数据,也称为网络通信。
根据网络互连的规模不同,可以划分为局域网和广域网。
局域网就是把两台或两台以上主机连到一起
1)基于网线直连
上图就是两根线,把3个主机给连起来,这三个主机就构成了一个局域网
但是这种组网方式非常少见(非常费网线和网口),一般组建局域网都会使用一些转发设备:交换机、路由器
2)基于集线器组建
集线器这种是比较坑的,实际基本没有使用集线器的:它是相当于把一个网线给分叉了(但是分出来的两个叉只能用一个),示意图如下:
3)基于交换机组建
交换机上有很多网口,网口都是对等的,你插哪个孔都一样。把几个电脑往这交换机上一插。借助交换机就组成了局域网。这个局域网的内部主机之间就可以互相进行访问。
4)基于路由器组建
路由器上有两类端口:WAN口和LAN口
其中插在LAN口上的设备,在一个局域网里,通过WAN口连接到另外一个局域网。
路由器相当于是连接了两个局域网,LAN口是一个,WAN口又是一个,示意图如下:
可以视A为B的局域网中的一个设备
ps:上述讨论的区别都只是传统的交换机和路由器,实际上,真正的交换机和路由器之间的界限已经越来越模糊了——路由器的很多功能,交换机也有;交换机的很多功能,路由器也有。但是如果是笔试或面试中还是以传统的讨论。
通过路由器/交换机 组建起来的这些就叫作局域网(你两台设备插到交换机上是局域网,你把一个城市的设备插到交换机上也还是局域网)
广域网和局域网之间没有明显界限,认为比较大的局域网,就可以称为“广域网”
全世界最大的广域网——Internet(因特网)
概念: IP地址就是描述了网络上的一个主机的位置
(相当于快递的收货地址)
格式:IP地址本质上是一个32位的整数,但是由于32位整数不方便记忆,所以我们是把32位整数分成4个部分,用“.”进行分割。每个部分是一个字节,也就是每个部分范围是0~255,我们把这种表示方式叫“点分十进制”
比如我这里的ip
当然了,这个ip主要是方便我们人去看的,计算机存储这个IP地址还是32位的整数
有一个特殊的IP地址:127.0.0.1 它是环回IP,表示自己这个主机(有点类似java中的this)
概念:描述了一个主机上的某个应用程序
(相当于快递的收货人的电话)
格式:端口号本质上是一个2字节(16位)的无符号整数
范围0~65535
比如3306就是mysql默认的端口号
服务器程序在启动的时候就需要绑定一个端口号,以便客户端程序来访问
协议是我们学习网络非常重要的东西,我们如果想进行有效通信,前提就是能够明确通信协议。本质上就是约定,发出来的数据是什么样的格式,接收方按照相应的格式进行解析。
举个不恰当的例子:张三是一个间谍特务,他和人接头必须要有一个暗号,能对上这个暗号的才能进行交易(有内鬼,终止交易/doge)
网络通信的时候,本质上传输的是光信号、电信号
通过光信号的频率(高频率/低频率)电信号的电平(高电平/低电平)来表示0和1
通过这样的光、电信号这样的方式,你就可以发送1串的0和1,那么这一串0和1是什么意思呢?你得明确出来是按什么规则发的,接收方才能进行接收和处理
协议,网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从
的一组约定、规则。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互
通信交流。
网络通信这个过程,其实非常复杂,里面有很多很多细节。如果只通过一个协议来约定所有的细节,这个协议就会非常庞大复杂。
更好的方法就是把一个大的、复杂的协议拆除多个小的、简单协议。然后每个协议负责一部分工作。
1.每层协议不需要理解其他协议的细节了,更好的做到了封装,降低使用成本。
如上图,打电话的人,不需要理解电话的工作原理就可以完成打电话的操作。
制作电话的人,你也不用什么语言都会,你把电话制作出来可以对话就可以了
2.把对应层的协议替换成了其他协议,更好的解耦合
打电话的人,可以不使用有线电话,而去使用无线电话
打电话的人,可以不用中文对话,而去使用英文对话
这个模型一般只存在与教科书中,真实的情况往往是这个七层的简化版本(也就是下面要说的五层/四层模型)
TCP/IP的五层模型下面四层和OSI是一样,最上面原本OSI的三层被TCP/IP合并成了一层应用层
下面这四层,和我们程序员的关系不是很大,这里的代码逻辑都是由操作系统和驱动以及硬件已经实现好的
我们程序员打交道最多的,还是这个应用层的协议
物理层:网络通信中的硬件设备,比如网卡/网线,针对硬件设备的约定,就是物理层协议所负责的范畴。需要保证所有的主机和网络设备之间,都是相互匹配的。
数据链路层:负责相邻(一根网线连的两个设备叫相邻)的两个设备之间通信
示意图如下:
网络层:负责点到点之间的通信
网络中的任意节点,到任意其他节点之间的通信(不一定是相邻的了)
网络层就负责在这两点之间,规划处一条合适的路线,实际的网络环境非常复杂,两个点之间的路径不止一条,就需要规划最合适的一条(类似你去一个地方,手机上某地图APP给你导航)
示意图如下:
传输层:负责端到端之间(起点到终点)的通信
它只关注结果(数据到没到),不关注过程(不关注数据走哪条路径)
比如我网上买个东西,我只需填写收件人地址,然后商家发货给我。商家和我都只关心在哪里发,发送到哪里,至于这途中是经过了哪些地方是不关心的。
传输层的核心协议有两种:TCP,UDP,socket API也有对应的两组,由于TCP和UDP协议差别很大,因此这两组API差别也挺大的。
应用层:和应用程序密切相关,你传输的这个数据是干啥用的,不同的应用程序就有不同的用途
比如我在网上买个电脑,商家发货给我——传输层(只关心起点终点)
快递公司——网络层(规划路线)
快递小哥——数据链路层(同一个城市,负责相邻的)
电动车/集装箱卡车——物理层(提供传输的基础)
上面所说传输层、网络层、数据链路层、物理层的只考虑包裹如何传输,不考虑这个包裹里面是什么,更不关心包裹里的东西是什么。
那我买电脑的用途是来查资料、玩游戏、上网课——这就是应用层
封装和分用是网络分层中的一组重要概念。它描述了不同的分层协议之间,是如何相互配合的。
ps:此处的“封装”和java面向对象里的封装没有关系。
例如:A用QQ给B发消息
应用层(QQ应用程序):根据用户输入的内容,把数据构造成一个应用层的协议报文(遵守了这个协议的一组数据)。
ps:协议是开发QQ的程序员约定的,类比开来,LOL使用的应用层协议,是开发LOL的程序员约定的…
接下来,应用层协议就调用操作系统提供的API(socket API),把应用层的数据,交给传输层(就已经进入操作系统的内核了)
传输层(操作系统内核):根据刚才传输过来的数据,基于当前使用的 传输层协议,来构造一个传输层的协议报文
ps:传输层最典型的协议有UDP、TCP,我们这里以TCP为例
我们现在有一个应用层的数据报
在这个数据报的基础上,我们再给它多加一个TCP的协议报头,就构成了TCP数据报(你可以简单的认为是字符串拼接,只不过这里是拼接的是二进制数据)
TCP的报头有很多信息,其中最重要的是“源端口”和“目的端口”(类似现实中的发件人电话和收件人电话)
类似于你买东西,商家得用一下盒子或蛇皮袋把东西打包好——目的是保护东西不受损害,另外就是可以向上面贴标签
我们网络中的封装不需要考虑数据被弄坏、弄脏的问题,这里主要的目的是为了贴标签:贴上辅助转发的信息(类似收发人的电话),有了这个信息才能发给正确的人。
接下来就会把这个传输层的数据报,交给网络层
网络层(操作系统内核):拿到了完整的传输层数据,就会根据当前使用的网络层协议(例如IP),再次进行封装,把TCP数据报构造成IP协议数据报,示意图如下:
IP协议报头也有很多重要的信息,其中最重要的就是源IP和目的IP(相当于发件人地址和收件人地址)
紧接着,当前的网络层协议,就会把这个IP数据报交给数据链路层
数据链路层(驱动程序):在刚才的IP数据报基础上,根据当前使用的数据链路层协议,构造成一个数据链路层的数据报,典型的数据链路层协议——以太网,就会构造成一个“以太网数据帧”
IP协议里面写的地址是始终是起点X和终点Y(比如苏州和扬州)
ps:苏州到扬州路线:苏州-无锡-常州-镇江-扬州
以太网数据帧,帧头里写的地址是接下来一个相邻节点的地址(苏州和无锡)
随着数据往下一个设备的转发,帧头中的地址一直在发生变化
现在在苏州,这里的地址,写的就是 苏州/无锡
到了无锡,这里的地址,写的就是 无锡/常州
到了常州,这里的地址,写的就是 常州/镇江
到了镇江,这里的地址,写的就是 镇江/扬州
注:帧尾里面的信息主要是校验和(后面讲解)
再接下来,数据链路层就会把数据交给物理层
物理层(硬件设备):
根据刚才的以太网数据帧(其实就是一组0和1),把这里0和1变成高低电平,通过网线传输出去;
或者把这里的0和1变成高低频的电磁波,通过光纤/网线的方式传播出去
我们上面说的:应用层到物理层都是封装——从上往下,数据从高层协议交给下层协议,由下层协议进行封装(构造成该层协议的报文)
到了这一步,此时的数据就已经离开了A的主机,前往了下一个设备,下一个设备可能是路由器/交换机/其他设备(中间可能有若干路由器或交换机负责数据转发)
我们中间的过程先不论,先来开数据到底B之后干了什么
物理层(硬件设备、网卡):
主机B的网卡感知到了一组高低电平,然后就会把这些电平翻译成0或1的一串数据,然后这一串0 1就是一个完整的以太网数据帧。
物理层就把这个数据交给了数据链路层
数据链路层(驱动):
数据链路层负责对这个数据进行解析,去掉帧头和帧尾,取出里面的IP数据报,然后交给网络层协议
网络层(操作系统):
网络层协议(IP协议)又会对这个数据进行解析,去掉IP协议报头,取出里面的TCP数据报,再交给传输层
传输层协议(TCP协议),又会对这个数据进行解析,去掉TCP报头,取出里面的TCP数据报,交给应用层。
应用层(应用程序QQ)
调用soket API 从内核中读取到这个应用层数据报,再按照应用层协议进行解析。根据解析结构再显示到消息窗口中。
分用:就是封装的逆过程,封装是从上往下,数据依次被加上了协议报投(类似层层打包),分用就是从下往上,数据依次被去掉协议(类似层层拆包)
我们之前说过,A和B之间还有一些路由器或者交换机,那中间的那些过程是怎样的呢?
如上图,我们的A把数据分装好后,会经历若干个交换机/路由器,交换机(一般只有数据链路层和物理层)会先分用数据,解析到数据链路层,更新以太网数据帧的帧头里的地址,然后再重新分装,并进行转发(可能会经历多个交换机,直到下一站是B)。