初识网络
网络的发展
在过去网络还没有出现的时候, 我们的计算机大部分都是独自运行的, 比如以前那些老游戏, 都是只能在本地上玩, 如果是有两台电脑, 那么这两个电脑是不能同时玩同一个游戏的
但是这种让计算机独立运行的模式就非常有局限性, 于是随着时代的发展和需求的增加, 网络就出现在了人们视野中, 并且根据规模的不同, 网络可以被区分为局域网和广域网
局域网
局域网, 英文简称为LAN, 全称为Local Area Net, 直接翻译过来就是本地区域网络, 也就是说这个网络是只能在本地内部访问的, 外部是无法访问的
比如我们现在家里应该都会有一台路由器, 假如我们两个电脑连接到了同一个路由器里面, 此时我们就可以说这两台电脑在同一个局域网里面, 可以进行通信. 但是假如此时来了第三台电脑, 而这个电脑没有接入这个路由器, 接的隔壁家的路由器, 此时这第三台电脑是无法和前面那两个电脑进行通信的, 因为它们不处于同一个局域网下
局域网的搭建方式有很多种, 其中一种就是我们刚刚说的通过连接路由器的方式.
另外我们还可以使用网线把电脑连起来, 但是这样很明显很难实现多机器的局域网, 因为一般一个电脑就一个网口, 只能插一条网线.
那么有没有别的方法呢? 有, 我们可以通过多级路由器来连接电脑, 一般的路由器, 可能有1个WAN口和多个LAN口, 其中WAN口用来连接上级网络, 而LAN口用来连接下级设备, 而LAN口肯定是有限的, 加入LAN口不够用, 我们就可以通过多级路由器就可以实现这个效果
另外我们也可以通过交换机来实现路由器的拓展, 交换机简单地说就是用来拓展路由器的接口的
通过这种路由器拓展 + 使用交换机的方式, 那么就可以构建更加复杂的网络结构
广域网
广域网, 英文简称为WAN, 全称为Wide Area Net, 和局域网相比, 覆盖的范围更大
假如我们将各个局域网的路由器连接起来, 组成了一个更大的网络, 可能覆盖了一个城市, 国家, 甚至是整个世界. 那么此时就可以称呼这个网络为广域网(广域网和局域网并没有明显的界限)
当公共型广域网的范围大到覆盖世界范围, 此时就可以称呼这个广域网为互联网
网络基础
接下来为了能够更加好的学习网络知识, 我们首先先要来看一些基础概念
IP地址
IP地址, 主要就是描述了一个设备在网络上的地址. 实际上网络的通信, 与邮寄快递还是很像的, 给另一个设备发送数据, 就类似于给对面寄了一个快递. 那假如我要去发快递, 我肯定就需要知道对面在哪. 那么在网络上我们就可以通过 IP 地址去描述另一个设备在哪.
目前 IP 地址一般指的是一个32位, 4字节的数字, 例如01100100000001000000010100000110
, 但是很明显这样一点都不好阅读. 因此为了方便阅读, 把四个字节进行分割为四个部分, 使用三个点进行分割, 每一部分的大小为 0~255 (点分十进制), 此时上面的二进制就会被分为01100100.00000100.00000101.00000110
, 然后将每一个区间的 8 个数字转换为十进制就变成了64.4.5.6
一般来说, 现在 IP 地址常见的有两种版本, 一种就是上面的这个 32 位的版本, 这个版本叫做 IPv4. 另一个版本则是由 128 位的版本, 这个版本叫做 IPv6. 不过我们这里主要是了解一下 IP 是什么东西, 有什么用, 因此我们这里就简单介绍一下 IPv4 的版本, IPv6 的就不做细致介绍了.
端口号
在一个电脑上面, 可能会有很多的应用程序. 那么此时假如我的 QQ 想给另外一个电脑的 QQ 发送信息, 那我虽然可以通过 IP 地址去获得对面电脑的地址, 但我又怎么去找到 QQ 的位置呢?
此时我们就需要去用到端口号, 端口号就是用来区分一个设备上不同的应用程序的, 一个进程可以有多个端口, 但是一个端口只能被一个进程使用. 就好像是一个人它可能有好几个住址, 此时别人给他寄快递寄到哪个都可以收到. 但是假如多个人在同一个住址, 此时别人给他寄快递寄到这就可能会弄混了, 因此网络上就直接禁止这种操作.
端口号一般为两个字节(0~65535), 其中 0 一般不会使用, 1~1023 一般留给系统作为特殊用途(知名端口号)一般不占用.
一般在通信过程中, 端口号和IP地址都是成对出现的, 源IP和源端口对应目的IP和目的端口.
协议
网络的传输本质上是通过光电信号来传输数据, 而光电信号又代表了一种二进制数据, 但是这种数据如何传输, 如何解析. 并且数据在传输的时候双方如何识别对方, 如何建立连接等等有关通信的问题. 这些都是通过协议来规定的
简单的说, 协议就是为了能够正常实现网络通信而设定的规定, 具体有什么样的协议, 这些协议有什么用, 我们就在后续学习协议的过程中慢慢了解即可
五元组
上面我们讲过的: 源IP, 源端口, 目的IP, 目的端口, 协议类型, 就被称为五元组
五元组是一次网络通信中必不可少的信息
协议分层
我们平常写代码的时候, 为了能够保证代码更好理解, 都会将代码拆分为各个部分, 一个部分完成一个工作
协议也是一样, 由于网络通信的情况非常多, 非常复杂. 因此如果只定义一个网络协议要支持所有场景, 那么就非常不好理解, 于是我们对协议进行拆分, 每一个协议只完成一小部分的工作. 但是此时由于网络协议过于复杂, 拆分出来的小协议也非常多, 为了便于管理, 我们就对协议进行了分层
协议的分层也是根据其作用和定位进行分类的, 并且分层还约定了协议之间的调用关系, 上层协议调用下层协议, 下层协议给上层协议提供支持, 这样这些协议就不会混乱
例如公司中, 假如人数很多, 那么就会实现分层管理, 每当要发配任务的时候, 员工给自己的上司汇报, 然后上司再给上层的领导进行汇报, 反之同理. 这样就能显著提高管理效率, 降低管理成本
并且这种协议分层的做法也类似于封装, 上层协议不必过于关心下层协议的具体实现, 只要负责调用下层协议就行, 而下层协议也不用关心上层协议的具体实现, 只要能保证上次协议的正常进行就行
例如我们打电话, 分两个层, 语言层和电话层
其中语言层不关心电话层的实现, 只负责把声音信号传给电话. 电话层也不管你语言层讲的是啥语言, 只负责进行处理, 然后传输
并且协议分层也支持根据需求灵活更换, 例如我们把上面的电话层的电话换成无线电, 只要能满足需求, 依旧可以正常运行
OSI 七层模型
OSI 将网络从物理层面到应用层面分为了 7 层, 下面我们简单的了解一下这 7 层的作用
实际情况中, 由于这个 OSI 七层模型比较复杂, 因此一般会采用 OSI 七层模型的简化版本 TCP/IP 五层模型
TCP/IP五层模型
左边是OSI七层模型, 但是这种模型由于过于复杂, 不贴合实际, 因此我们一般会用OSI七层模型的简化模型, TCP/IP五层模型
这些层都是越往下, 就约接近底层的, 反之越往上约接近软件层, 其中TCP/IP就是把OSI七层模型的其中三层给合并了(有些地方称TCP/IP四层模型, 由于物理层接近底层因此被忽略了)
TCP/IP由五层组成, 其简要功能如下所示:
- 物理层: 描述的是用于网络通信硬件设备, 例如网线应该使用什么规格
- 数据链路层: 关心两个相邻节点的数据传输情况
- 网络层: 进行路径的规划(也可以说是路由的选择, 不过路径规划更容易听懂)
- 传输层: 关注起点和终点, 确保数据传输到位
- 应用层: 如何使用数据, 主要就是应用程序层面的使用
举一个网上购物的例子来帮助理解一下
应用层就是用户, 买了东西只关注怎么用. 传输层就是接收用户快递起点和终点的, 他不关心用户怎么用, 不关心快递怎么送. 网络层就是规划用户快递路线的, 例如从北京到上海, 有各种各样的路线. 而数据链路层就是只管路线中相邻两个省市的传输情况的. 而物理层则是描述用于运送快递的交通工具是什么的, 比如是铁路还是公路还是飞机.
上面我们简单了解了一下各个层的用途, 接下来我们再来了解一下每一个层的对应情况.
- 应用层: 实际上对应的就是我们的应用程序, 换句话说就是我们写的代码
- 传输层和网络层: 对应着操作系统封装好的 API, 应用程序主要就是通过这个 API 将应用层的数据给传下去的.
- 数据链路层和物理层: 对应的就是硬件设备以及其驱动程序, 例如对应着路由器, 交换机, 网线, 还有路由器的驱动程序这样的东西
封装和分用
既然我的数据在网络中要去传输, 那么就需要封装成不同层需要的格式, 因此就会有封装和分用的过程, 下面分别描述了在 TCP/IP 五层模型中, 网络通信过程中基本的数据传输过程
封装过程
- 应用层: 规定了一定的格式来保存要发送的数据(由程序员规定格式进行字符串拼接), 这个规定就是应用层协议. 打包完后就可以通过操作系统的 API 将刚刚打包的数据发送给传输层
- 传输层: 在应用层包装后的数据基础上, 再加上一段数据进行打包, 添加一段报头. 打包一方面是为了提供辅助信息, 例如起点端口信息和终点端口信息. 其次就是为了保护要发送的数据. 如何加的规定就是传输层协议, 常见的协议有 TCP 和 UDP
- 网络层: 网络层也是在上面传输层报文的基础上再进行一次打包, 添加一层报头. 这里报头的重要信息是 IP 信息, 主要的协议就是 IP 协议
- 数据链路层: 数据链路层依旧是在上面报的基础中进行打包, 并且此时会对头和尾都进行打包, 此时头称作为以太网报头, 包含的重要信息是 MAC 信息, 主要的协议就是以太网协议
- 物理层: 将上面的数据转换为 01 的二进制数据, 通过光电信号进行传输
分用过程
- 物理层: 解析光电信号, 获取二进制数据, 得到以太网数据报
- 数据链路层: 解析以太网数据报, 解析出报头,报尾和载荷
- 网络层: 将下层载荷继续解析, 解析出IP继续向上传递载荷
- 传输层: 解析出端口, 将数据传递给应用程序
- 应用层: 接收数据, 解析数据并作出反应
"客户段-服务器"结构
“客户端-服务器”结构, 顾名思义, 由客户端和服务器两个部分组成, 那么客户端和服务器有什么区别呢? 其中, 客户端(Client)是指发出请求的一方, 此时客户端会对服务器发送一些数据, 这些数据被称作为请求(Request). 而服务器(Server)则是接收请求的那一方, 接收请求后会返回一些数据, 这些数据被称作为响应(Response). 其中两个部分的数据传输是通过网络通信来进行的
如果用更简单的话描述一下客户端和服务器: 客户端是主动发信的一方, 而服务器是被动接收的一方. 举一个很简单的例子, 服务器就是类似于餐馆这样的公共设施, 用于接待客人, 也就是接收客人人要吃饭的请求(接收请求)并且做出相应的饭菜(做出响应), 是被动接收请求的一方. 而客人就是客户端, 会发出自己要吃饭的请求(发出请求), 是主动发出请求的一方.
服务器作为接收请求的一方, 大部分情况下有两个特点:
- 一般情况下服务器是要一直开启的, 因为服务器并不知道什么时候会有客户端对其发送请求, 因此需要一直开启来随时等待着客户端的请求. 拿上例中的餐馆也是一样的意思, 餐馆在它的工作时间内是一直开启的, 因为不知道什么时候会有客人来吃饭.
- 一般的服务器都是要接收来自很多客户端的请求的, 但是也有特殊情况的存在, 也会有服务器给少数的一两个客户端提供服务.