计算机五层模型通熟易懂的概述

前言

计算机是我们最熟悉的工具，地球上有很多计算机，那我们的两台计算机是如何实现相互传递信息的呢？
很多人肯定说，这是这是因为计算机的五层模型，但你知道他们的作用吗？
下面就是这五层模型

说实话，这五层模型是十分复杂的，但是今天我要用最简洁的语言，来讲解一下两台计算机是如何通信的，就算你没有学过计算机网络也能听懂

1. 物理层

一台计算机和另一台计算机要通信要通信，肯定要将两台计算机连起来呀

graph LR A[计算机A] -- 连接 --> B[计算机B]

也就是，物理层将两台计算机连接起来，然后通过高低电频来传输 0，1 这样的电信号

2. 数据链路层

前面说了，物理层只是单纯的连接两个计算机，并且在其之间传输传输电信号，那如果这电信号没有规范，那谁看的懂呢？

graph LR A[000010000100111100011110001010110100]

所以，就有了一套规则可以让计算机读懂，于是就有了以太网协议

2.1. 以太网协议

以太网协议规定，一组电信号就是一个数据包，我们把这个数据包成为‘帧’。每一个帧由 标头 (Head) 和 数据 (Data) 两部分组成

标头 (Head) | 数据 (Data)

标头存放着发送者和接受者的信息，而数据就是存放着要发送的数据了
把一台计算的的数据通过物理层和链路层发送给另一台计算机，究竟是谁发给谁的，计算机与计算机之间如何区分，你总得给他们一个唯一的标识吧？
于是，MAC 地址出现了。

2.2.MAC 地址

连入网络的每一个计算机都会有网卡接口，每一个网卡都会有一个唯一的地址，这个地址就叫做 MAC 地址。计算机之间的数据传送，就是通过 MAC 地址来唯一寻找、传送的。

2.3. 广播与 ARP 协议

2.3.1 广播

再想一个问题，计算机 A 不仅连着计算机 B，而且计算机 A 也还连着其他的计算机。 虽然计算机 A 知道计算机 B 的 MAC 地址，可是计算机 A 却不知道知道计算机 B 是分布在哪边路线上，为了解决这个问题，于是，有了广播的出现。

graph LR A[计算机A] ---> B[计算机B] A ---> C[计算机C] A ---> D[计算机D]

在同一个子网中，A 会向 B 发送数据包，这个数据包会包含 B 的 MAC 地址，当发送是，A 是通过广播的形式发送的，此时 B、C、D 都会接收到这个数据包，然后收到这个数据包的计算机，会把数据包的 MAC 地址取出来，与自身的 MAC 地址对比，如果两者相同，则接受这个数据包，否则就丢弃这个数据包。
这种方式就像你玩的晚，妈妈们通过广播的形式叫孩子回家吃饭，如果这个名字是你，你就理会一下，如果不是你，你就当作听不见。

2.3.2ARP 协议

那我们来思考一个问题，A 是怎么知道 B 的 MAC 地址的呢？这个时候就得由 ARP 协议这个家伙来解决了，不过 ARP 协议会涉及到 IP 地址，我们下面才会扯到 IP 地址。因此我们先放着，就当作是有这么一个 ARP 协议，通过它我们可以知道子网中其他计算机的 MAC 地址。

3. 网络层

上面我们说了子网这个词，我们身处的网络由无数个子网构成，在广播的时候，也只能在同一个子网内进行。
假如没有子网这种划分的话，计算机 A 通过广播的方式发一个数据包给计算机 B , 其他所有计算机也都能收到这个数据包，然后进行对比再舍弃。世界上有那么多它计算机，每一台计算机都能收到其他所有计算机的数据包，那就不得了了。那还不得奔溃。 因此产生了子网这么一个东西。
那么问题来了，我们是如何区分 MAC 地址属于哪一个子网呢？假如是同一个子网，那我们就用广播的形式把数据传送给对方，如果不是同一个子网的，我们就会把数据发给网关，让网关进行转发。
为了解决这个问题，于是，有了 IP 协议。

3.1IP 协议

IP 协议，它所定义的地址，我们称之为 IP 地址。IP 协议有两种版本，一种是 IPv4, 另一种是 IPv6。不过我们目前大多数用的还是 IPv4，我们现在也只讨论 IPv4 这个版本的协议
每一台联网的计算机都有一个 IP 地址，IP 地址分为两部分，前面代表网络部分，后面代表主机部分，并且网络部分和主机部分所占用的二进制位数是不固定的。
那么问题又来了，既然不固定，那怎么知道网络部分是占几位，主机部分又是占几位呢？也就是说，两个 IP 地址，我们如何判断他俩是否在同一个子网中呢？
这就引申出来一个关键字：子网掩码
网掩码和 IP 地址一样也是 32 位二进制数，不过它的网络部分规定全部为 1，主机部分规定全部为 0
例如：192.168.43.1 和 192.168.43.2，这两个 IP 地址的网络部分为 24 位，主机部分为 8 位的话，那他们的子网掩码都为 11111111.11111111.11111111.00000000，即 255.255.255.0
那我们知道了子网掩码，如何来判端 IP 地址是否处于同一个子网中呢？我们只需要把 IP 地址与它的子网掩码做与 (and) 运算，然后把各自的结果进行比较就行了，如果比较的结果相同，则代表是同一个子网，否则不是同一个子网。
例如，192.168.43.1 和 192.168.43.2 的子码掩码都为 255.255.255.0，把 IP 与子码掩码相与，可以得到他们都为 192.168.43.0，进而他们处于同一个子网中。

3.2ARP 协议

接着上面没有讲完的继续讲，计算机 A 要给计算机 B 发送数据时。我们可以通过 ARP 协议来得到计算机 B 的 MAC 地址。那 ARP 协议是如何工作的呢？
例如：计算机 A 给计算机 B 要发送数据，此时 A 还不知道 B 的 MAC 地址，这时 A 就会给子网的每一个计算机发送包含接收方IP 地址的数据包，对方收到这个数据包之后，会取出 IP 地址与自身的对比，如果相同，则把自己的 MAC 地址回复给对方，否则就丢弃这个数据包。这样，计算机 A 就能知道计算机 B 的 MAC 地址了。

3.3 DNS 服务器

那么问题又来了，我们时如何知道接收方的 IP 地址的呢？
当我们想要访问某个网站的时候，我们可以输入 IP 来进行访问，但是我相信绝大多数人是输入一个网址域名的，例如访问百度是输入 www.baidu.com 这个域名。其实当我们输入这个域名时，会有一个叫做 DNS 服务器的家伙来帮我们解析这个域名，然后返回这个域名对应的 IP 给我们的。
因此，网络层的功能就是让我们在茫茫人海中，能够找到另一台计算机在哪里，是否属于同一个子网等。

4. 传输层

通过物理层、数据链路层以及网络层的互相帮助，我们已经把数据成功从计算机 A 传送到计算机 B 了，可是，计算机 B 里面有各种各样的应用程序，计算机该如何知道这些数据是给谁的呢？这个时候，** 端口 (Port)** 这个家伙就上场了，也就是说，我们在从计算机 A 传数据给计算表 B 的时候，还得指定一个端口，以供特定的应用程序来接受处理。
传输层最常见的两大协议是 TCP 协议和 UDP 协议，其中 TCP 协议与 UDP 最大的不同就是 TCP 提供可靠的传输，而 UDP 提供的是不可靠传输。
也就是说，传输层的功能就是建立端口到端口的通信。相比网络层的功能是建立主机到主机的通信。

5. 应用层

终于到最后一层了，应用层是距离我们用户最近的一层
虽然我们收到了传输层传来的数据，可是这些传过来的数据五花八门，有 html 格式的，有 mp4 格式的，各种各样。你确定你能看的懂？
因此我们需要指定这些数据的格式规则，收到后才好解读渲染。例如我们最常见的 Http 数据包中，就会指定该数据包是 什么格式的文件了。

完