目录
前言:
计算机源起时,就注定会对我们后续的生活带来巨大的改变。现如今,计算机的迅速普及,已被应用各种各样的领域,对我们的社会和生活带来了不可估量的影响。其应用范围上到办公室、工厂、实验室等,下到个人家庭,而且随着时代迅速发展,我们的计算机和计算机间已具备联网功能,可以实现远程通讯。
一、网络互连
独立模式 -> 网络互连模式:
随着时代的发展,刚开始的计算机是以独立模式(单机模式)被广泛使用的,后来越来越需要计算机之间的互相通讯,共享数据和操控,人们已经不再局限于该模式了。于是将多个计算机连接起来,形成一个计算机网络。通过多台计算机协同可以实现信息共享和信息传输。
网络互连:将多台计算机连接在一起,来完成数据共享。(数据共享的本质是 网络数据传输,即计算机之间通过网络进行的数据传输,即网络通信)。
计算机网络根据其规模可分为 WAN(广域网 --- Wide Area Network),LAN(局域网 --- Local Area Network)。
1、局域网
局域网,即 Local Area Network,简称 LAN。Local 即标识了局域网是本地,局部组建的一种私有网络。
局域网内的主机和主机之间可以进行网络通信进行数据传输,局域网又可称为 “ 内网 ”。但 局域网和局域网在没有连接的情况下,是无法进行网路通信的。
局域网组建网络的方式有很多种:
1) 基于网线直连:
2)基于交换机组建
交换机 --- 用来把多个主机组建到同一个局域网内
交换机只有一类端口:LAN
借助交换机,可以让多个机器与交换机相连后,从而可以与其他机器进行通信。
任意两个主机可以借助交换机来进行数据交换,这些主机之间就构成了局域网,有了交换机的存在,布线的成本就大大降低了,每个主机只需一个网口即可。
为了连接更多的主机,也可以让交换机连交换机,从而让这些主机都在一个局域网内。
3)基于交换机和路由器直连
路由器 --- 可以把多个局域网连在一起
路由器相比于交换机,有两类端口 WAN口 和 LAN口。其插在路由器 LAN上的设备,表示在同一局域网内,而 WAN口连接外网(连接运营商提供的光猫/宽带网线等设备的)。
4)基于集线器直连
集线器的功能非常有限,现在组网的时候已经很少能看到集线器了。
相比于交换机,任意主机之间的相连是互不干扰的。
而A和B两个主机之间如果通过集线器进行通信的时候,A或B没法和C或其他的主机进行通信,集线器中主机之间的通信通道是独占通道。
2、广域网
广域网,即 Wide Area Network,简称WAN。通过路由器,将多个局域网连接起来,在物理上组成很大范围的网络,就形成了广域网。广域网内部的局域网都属于其子网。
在交换机和路由器反复的连接下,可以把多个设备都连接到一起,使它们之间能够直接进行通信.当机器足够多时,就可以称为“广域网”。
广域网和局域网之间没有明确的界限,不是说机器数量多到什么时候构成“广域网”,也不是说少到什么程度构成局域网。一般认为连接到一起的设备比较少构成一个“局域网”,设备比较多构成“广域网”。
如果有多个海外分公司,它们以专线方式连接起来,其构成了规模比较大的网络,即形成了 “广域网”。
如果是属于全球化的公共型广域网,则称为 互联网(又称公网、外网),其属于广域网的子集。有时在不严格的情况下说的广域网,其实指的是互联网。
有些情况下有可以把“广域网”认为是一个比较大的“局域网”。
全世界最大的广域网 是 Inernet(因特网)。
二、网络通信基础
前面说到的网络互连,就是为了实现多台设备之间的网络通信和数据共享,也就是网络数据的传输,更具体一点是,网络主机中不同进程之间,基于网络传输数据。
但,在组建网络的时候,想要数据从哪个主机传输到目标主机,没有一个具体的标识是无法进行传输的,因此就需要使用到 IP地址来标识。
1、IP地址
1)什么是 IP地址?
所谓的 IP地址,就是连接到网络中所有主机中识别出进行通信的目标地址。因此通信中的所有主机设备都有自己的一个 IP地址。
其主要用来定位主机的网络地址。
可以将IP地址,想象成我们平常在网上购物一样,需要有收件人的地址,商品才可以由快递员送到我们的地址。
2)IP地址的格式
IP地址是一个32位(4个字节)的整数(可表示的IP地址有42亿9千万),通常被分割成 4个8位2进制数。例如:01100100.00000110.00101000.00000001
而因为32位的整数比较难以查看或记忆,因此发明了一种表示方式:点分十进制 ,通过三个点 将32 位的整数分成 4个部分,每个部分8位(1个字节)取值范围为:0 ~ 255 的十进制,即为:100.6.40.1。
2、端口号
除了通过 IP地址来识别找到数据传输的目标主机外,还需要有一个可以识别主机中发送、接收数据的进程。
①端口号:用于定位 主机中的进程,也就是我们可以通过端口号来找到对应主机里的应用程序。
类似我们寄/收快递时,除了填写寄件人/收件人地址(IP地址)外,还需填写对应的收件人或寄件人(端口号)。
②端口号的格式:
端口号是一个 2个字节(16位)的无符号整数(范围是 0 ~ 65535)。
③注意事项:
- 进程需要通过绑定一个端口号,来发送和接收网络上传输的数据。服务器启动的时候,用户(客户端)对服务器进行访问的时候,才能准确的找到对应的程序进行访问。
- 两个不同的进程,不能绑定同一个端口号,但一个进程可以绑定多个端口号。可以想象成一个人可以很多张电话卡,但一张电话卡没法多个人使用。
- 一个进程启动后,系统会自动的分配一个端口号(启动端口)。一般来说1024以下的端口号都是系统保留的(为知名端口号,这些端口号是预留给服务器程序绑定使用的应用层协议)。 因此,我们在自己手动分配端口号的时候,尽量使用1024 ~ 65535范围的端口号。【当然,1024 ~65535范围内的端口号,也可能有服务器绑定的知名端口号 】
- 常见端口号:例如 MySQL的端口号为 3306
三、理解网络中的重要概念
1、认识协议(最核心的概念---协议)
”协议“这个概念非常重要,毫不夸张的说,其贯穿了整个网络通信的体系,也可以说主机之间之所以有可以通过网络进行通讯,是全靠了 “ 协议 ”。
” 协议 “可以理解成 ” 约定 “,通过约定表达一定的含义,类似 ”暗号“。协议就是通信双方通讯时进行的一个约定。
比如:面基网友的时候,网友A和网友B彼此之间协商以什么提前的约定来作为标识,网友A穿大R图案的黑色T恤,网友B穿蓝色牛仔裤,那么他们就可以根据彼此的约定来寻找对方。这一种约定,也可也称为 协议。
协议,网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。
如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。
协议通常由三要素组成:
1. 语法:即数据与控制信息的结构或格式;
类似打电话时,双方要使用同样的语言:普通话
2. 语义:即需要发出何种控制信息,完成何种动作以及做出何种响应;
语义主要用来说明通信双方应当怎么做。用于协调与差错处理的控制信息。类似打电话时,说话的内容。一方道:你瞅啥?另一方就得有对应的响应:瞅你咋的!
3. 时序,即事件实现顺序的详细说明。
时序定义了何时进行通信,先讲什么,后讲什么,讲话的速度等。比如是采用同步传输还是异步传输。
💥网络上传输的数据,本质上是 光信号(光纤/无线网络/电磁波...)【光就是电磁波,无线网络是基于电磁波来通信的。】 / 电信号,通过电信号和光信号就可以传输二进制数据了。而要想传递不同的信息,就需要约定好双方的数据格式。
🤔光信号、电信号是怎么传输二进制数据的?
光信号涉及到光的频率,通过频率进行编码,高频当成1,低频当成0,传输的时候通过传输不同频率的光信号,表示1010类似的二进制数据。
而电信号通过电平来传输,例如高电平1,低电平0,通过高低电平信号也可以传输二进制数据
不同的0和1之间的排列组合表达什么意思,就需要通过“协议”来约定。
2、协议分层
①为什么需要协议分层?
网络通信是一个非常复杂的过程,其中有许多要处理的问题和细节。如果只使用一个“协议”来解决所有的问题,那么该协议任务量会很大,协议也会变得很复杂。因此可以通过把一个 “ 协议 ” 进行拆分成多个协议来解决该问题。拆分后的协议分别处理一部分问题,从而提高效率。
拆分的时候,有些拆出来的“协议”解决的问题差不多,定位是类似的,只是解决问题的手段不太一样,因此程序猿就把这些“协议”分成很多类,该过程也称为为 “ 协议分层 ” ,每一层有很多个协议,这些“协议”干的活差不多。
我们当前看到的网络结构,是协议分层后的产物。
②什么是协议分层?
协议分层类似于打电话,以下述的打电话为例:
(1)语言层看成上层协议,通信设备层看成下层协议。语言层的人通过汉语进行交流,无需关注理解电话的工作原理或具体实现,这就导致使用电话的成本很低。相反,开发电话机的人无需关注语言层交流的语言是什么,即使开发电话机的人是外国人也无需懂得说汉语,只需懂通信原理即可。这就让这两个协议分层之间构成了一个很好的封装。
(2)把通信设备层的电话协议替换成无线电协议,对于使用人来说是没有感知的,他们之间使用什么语言进行交流,就还使用什么语言进行交流,下层协议的替换对上层协议没有影响,这就称之为透明的。 即使是语言层的汉语协议改成英语协议交流,对于下层协议来说,也是没有影响的,对于电话机来说也只是将声音进行传输,交流使用什么语言它并不关心。
③协议分层的作用
- 下层协议给上层协议进行服务,上层调用下层协议。(提供了一种 “ 封装 ” 的服务) 此处的封装与Java中面向对象的封装本质相同。-------实现上层协议的不必考虑下层协议里的细节,只需直接调用的方法即可
- 解耦合,可以把同一层的协议替换成其他协议,对于其他层次的协议来说,基本是察觉不出,无感知的,透明的(理解:底层协议变了,对于上层协议没有影响,上层协议依旧一样 。上层协议变了,对于底层协议来说也没有影响)。
像上述的打电话为例,其中的分层很好的体现了其 封装 和 解耦合 的优点。
3、OSI七层模型
OSI :即 开放系统互连(Open System Interconnection)。
该模型 是一个逻辑上的定义和规范,主要是用来帮助不同类型的主机实现数据的传输。其优点是将服务、接口、协议三个概念明确地区分开来,通过七个层次化的结构模型使不同的网络之间实现可靠的通讯。
OSI七层模型由上到下,越往下越偏向硬件方面,越往上越偏向软件方面。实际组建网路的时候,只是以 OSI七层模型设计的部分分层,也即是 TCP/IP 五层模型来实现。
4、TCP / IP 五层网络模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
其中传输层、网络层、数据链路层和物理层是一样的。
应用层、表示层和会话层统称为应用层(针对用户态)。
OSI参考模型中的有各自的叫法,但其实都是同一个东西,例如:OSI参考模型中的网络层和TCP/IP分层模型中的互联网层就是一样的。
4.1 TCP / IP 五层模型的结构:
- 🎈物理层:属于网络通信的基础设施。
- 🎈数据链路层:解决两个相邻节点之间是如何传输的
- 🎈网络层:负责两个点之间的路径规划
- 🎈传输层:考虑两个点之间的通讯,不考虑两个点之间的路径规划
- 🎈应用层:属于数据传输过去后具体怎么使用。
以在网上买东西为例:
萨日朗在淘宝买了一个西瓜,下单后,卖家就把货通过快递发给萨日朗。
卖家在发货的时候,只考虑发件人(起点)和收件人(终点)。
(1)运快递的公路 想象成网络通信的基础设施 ----- 物理层
(2)卖家发货只考虑发件人(起点)和收件人(终点),不考虑路上的快递是如何运输的----- 传输层(不考虑路径规划)
(3)把货交到物流公司,物流公司需要规划从哪条路线派送快递比较好------- 网络层
(4)货在两个仓库(集散点)之间的传输 ------ 数据链路层
(5)货拿到萨日朗手上要怎么使用,是萨日朗自己的事情 ------- 应用层
4.2 网络设备对应的分层:
- 物理层和数据链路层对应的是 驱动 和 硬件
- 传输层和网络层,由操作系统内核实现的。
- 应用层、表示层和会话层是应用程序实现的(用户态)。
而统称的应用层是由程序员来实现的。 换句话说,只有应用层是程序员自己写代码处理的,以下的四层都是由操作系统和硬件设备来处理好的。
网络编程的主要工作就是写应用层的代码,来处理应用层的协议数据。
4.3 理解网络层和数据链路层
1、路径规划
以上面的送货过程,从一个地方到另外一个地方有很多条路线。考虑走哪条路线,是网络层处理的(宏观)。
2、传输方式
确定好路线,从一个地方到另外地方是要坐高铁,坐飞机还是坐大巴。具体要怎么走是数据链路层要考虑的事情。两个相邻节点之间要怎么走是数据链路层要考虑的事情(微观)。
4.4 交换机 和 路由器
交换机:其工作在 数据链路层
路由器:其工作在 网络层
交换机和路由器工作在哪一个协议分层,是面试中也会考的。
当下 交换机 和 路由器的功能越来越强大,彼此之间有许多功能也相互重叠,也就是彼此之间存在相同的功能。
比如: 三层交换机(带有路由器的功能) 、 路由器的桥接模式(相当于交换机)。
交换机和路由器之间的定位越来越模糊,而且这些设备也有一些传输层,甚至应用层的功能。
5、数据报
数据报是通过网络传输的数据的基本单元;
其包含一个报头(header)和数据本身,其中报头描述了数据的目的地以及和其它数据之间的关系。数据报是完备的、独立的数据实体,该实体携带要从源计算机传递到目的计算机的信息,该信息不依赖以前在源计算机和目的计算机以及传输网络间交换。
6、💥封装和分用
不同协议层对数据包有不同的称谓:
- 传输层中称为 : 段(segment)
- 网络层中称为: 数据报(datagram)
- 数据链路层称为: 帧(frame)
封装 和 分用 描述了网络上是如何传输数据的。
封装:协议分层后每一层的数据 通过协议栈发到下一层协议层,每一层协议都要加 上一个数据首部(header),其首部包含一些重要信息(首部长度、载荷payload 长度、源地址、目的地址之类的)。
此处的的 封装 的和 面向对象中继承多态的封装 效果上是类似,但是所指的含义不同 ,不要与其混淆,注意进行区分。
(1) 封装
封装的过程
以使用QQ发送消息为例:
用户A 向 用户B发送一条信息,用户A通过键盘输入想要发送的信息(你好)。
1. 应用层(QQ程序)
根据用户A输入的内容数据,整理成应用层数据报(相当于类似“字符串拼接”的方式,构成更完整的,信息更多的数据,再传输) ,假设该应用层数据报结构为:
接下来应用层协议就调用操作系统中的socket API,将这个应用层数据报交给传输层(进入到操作系统内核)
2. 传输层
传输层会根据当前使用的传输层协议,给应用层数据报进行进一步的组装。
例如:此处以的UDP协议(传输层的协议)为例,将刚刚的应用层数据报装到UDP数据报内。(传输层中常见的协议有 UDP 和 TCP)
之后就将这个UDP数据报交给网络层。
3.网络层
网络层主要使用的是IP协议,其对UDP数据报再进行进一步的组装。
对其数据报 加上报头(本质上是 “ 字符串拼接 ”)
同理,IP协议报文 = IP协议报头 + IP协议载荷(完整的TCP / UDP数据报)
4. 数据链路层
数据链路层,使用的是以太网协议,对其数据报再进行进一步的组装。构成了一个以太网数据帧,之后再把这个数据交给物理层。
5. 物理层
数据到达物理层,其拿到数据之后,把这里的这些以太网数据帧的 二进制序列转换为 光信号 / 电信号。
上面的数据报本质上就是二进制序列,由0和1构成的整体格式,把这些0和1转换为光信号或电信号,变成一些高低电平或高低频率的电磁波,再通过光纤或无线的方式对光电信号进行传输。
上述的过程就是发送的时候,把当前的数据从我们的主机发送出去的过程。从上到下一次添加报头的过程,就称为 “封装”。
此处的封装操作,每一层都会进行。这一过程类似派送一个快递时,会将物品套上很多层包装(塑料袋 ->泡沫盒子 -> 纸壳 ->黑色快递袋),再进行派送。
实际上发出去的是上面那一串很长数据报的二进制序列。
以上的过程结束,代表要发送的数据已经离开主机A,发往另外的设备,当然用户A和用户B的主机很小概率是网络直连的,数据的传输过程中,还需经过多个路由器和交换机之间的转发,才最终到达用户B的主机,这中间的内容此章节暂不介绍。
(2)分用
省略中间的传输过程,当主机B收到主机A发送的上述数据时,其就是封装的 “ 逆过程 ”,称为 ” 分用 “。每一层协议把对应的报头给解析出来,并且去掉报头。
其接收过程:
1、物理层(硬件设备),主机B把收到的光电信号转换为二进制数据,得到以太网数据帧,再将其交给数据链路层。
2、数据链路层(驱动),数据链路层会对该传输过来的数据进行解析,去掉帧头和帧尾,把载荷部分取出来并交给网络层
3、网络层,IP协议解析出IP报头,之后去掉报头,将载荷部分取出来交给传输层。
4、传输层(操作系统内核),把UDP协议解析出UDP报头,然后去掉报头,把载荷部分取出来交给应用层。
5、应用层,调用操作系统内核的socket api读取数据报 并按照应用层协议进行解析(qq这个程序解析这个信息),然后再把解析后的信息显示到用户B主机的窗口。
以上就完成了数据的解析过程。说到底“分用”就是“封装”的逆过程。
上述过程也体现出了网络通信过程中,各个层次的协议是如何配合工作的。
封装和分用不仅仅会出现在主机上,也出现在传输过程中,包括交换机和路由器上。(此处对交换机和路由器上的封装和分用不做介绍)
其中 路由器是封装、分用到 网络层;
交换机是封装、分用到 数据链路层。
本节的内容到这里就结束了,该文章也为我自己的学习笔记,如果其中有哪些部分有误,还希望大佬们能指点一二,共同进步!