今天的这一篇,算是开篇,其实这篇文章,我在之前发过,不过省略了很多内容,今天我把这篇文章给完善了,由于这篇文章涉及到非常多的知识,我觉得作为计算机网络的开篇,是非常合适的,它可以让大家先有个概念,后面将会围绕这些知识深入展开分析,大家敬请期待!
我学计网时的疑惑
其实在学习网络通信那会我就很奇怪,天各一方的两台计算机是如何通信的呢?也就是说,在成千上万的计算机中,为什么一台计算机能够准确着寻找到另外一台计算机,并且把数据发送给它呢?为什么有了 MAC 地址还需要 IP 呢?一台主机里面那么多的应用程序,是如何正确发给对应的程序呢?怎么保证数据正确交付?怎么保证数据不会被篡改?等等
对于刚学习计算机网络的同学,可能都听说过网络通信的 5 层模型,教科书里可能会告诉你为什么要分层,然而,结果是你可能看了教科书对应的解释之后仍然一脸懵逼。
当然,你可能还听说过四层模型,七层模型,不过,五层模型应该是用的比较广泛的,五层模型大概长这样
说实话,五层模型的具体内容还是极其复杂的,不过今天这篇文章,我将用最简洁的模式,通过网络通信的五层模型来讲解一台计算机是如何找到另外一台计算机并且把数据发送给另一台计算机的,通过这篇文章,相信可以让你大致了解五层模型以及网络通信的一些原理。而且,就算你还没学过计算机网络,只有听说过 ip,端口这些名词,相信你也是能够看的懂这篇文章的。
一、物理层
如果一台计算机要传输数据给另外一台计算机,第一件要做的事是什么?最容易想到的就是要把这台计算机通过某种介质与另外一台计算机连起来啊,这样,我们才能把数据传输过去。例如可以通过光纤啊,电缆啊,双绞线啊等介质把他们连接起来,然后我们就可以通过这些介质,把数据输出给目标计算机了。
也就是说,物理层负责把两台计算机连起来,然后在计算机之间通过高低电频来传送0,1这样的电信号。
二、数据链路层
前面说了,物理层它只是单纯着负责把计算机连接起来,并且在计算机之间传输0,1这样的电信号,因为计算机的大脑比较简单,只认识 0 和 1,并且还是通过高低电压来区分的。
很显然,如果这些 0,1 组合的数据毫无规则的话,计算机是解读不了的。一大堆0,1谁知道是什么鬼啊。
因此,我们需要制定一套规则来进行0,1的传送。例如多少个电信号为一组啊,每一组信号应该如何标识才能让计算机读懂啊等等。
于是,有了以太网协议。
1. 以太网协议
以太网协议规定,一组电信号构成一个数据包,我们把这个数据包称之为帧。每一个桢由标头(Head)和数据(Data)两部分组成。
帧的大小一般为 64 - 1518 个字节。假如需要传送的数据很大的话,就分成多个桢来进行传送。
对于表头和数据这两个部分,他们存放的都是一些什么数据呢?我猜你眯着眼睛都能想到他们应该放什么数据。 毫无疑问,我们至少得知道这个桢是谁发送,发送给谁的等这些信息吧?所以标头部分主要是一些说明数据,例如发送者,接收者等信息。而数据部分则是这个数据包具体的,想给接收者的内容。
大家想一个问题,一个桢的长度是 64~1518 个字节,也就是说桢的长度不是固定的,那你觉得标头部分的字节长度是固定的吗?它当然是固定的啊,假如不是固定的,每个桢都是单独发的,那计算机怎么知道标头是几个字节,数据是几个字节呢。所以标头部分的字节是固定的,并且固定为18个字节。
把一台计算的的数据通过物理层和链路层发送给另一台计算机,究竟是谁发给谁的,计算机与计算机之间如何区分,,你总得给他们一个唯一的标识吧?
于是,MAC 地址出现了。
2. MAC 地址
连入网络的每一个计算机都会有网卡接口,每一个网卡都会有一个唯一的地址,这个地址我们称之为 MAC 地址。计算机之间的数据传送,就是通过 MAC 地址来唯一确定身份的。
MAC地址 由 48 个比特所构成,在网卡生产时就被唯一标识了。
3. 广播与ARP协议
(1). 广播
如图,假如计算机 A 知道了计算机 B 的 MAC 地址,然后计算机 A 想要给计算机 B 传送数据,虽然计算机 A 知道了计算机 B 的 MAC 地址,可是它要怎么给它传送数据呢?和计算机 A 连接在一起的计算机有很多台,虽然计算机 A 知道计算机 B 的 MAC 地址,可是计算机 A 却不知道知道计算机 B 是分布在哪条路线上,为了解决这个问题,于是,有了广播的出现。
在同一个子网中,计算机 A 要向计算机 B 发送一个数据包,这个数据包会包含接收者的 MAC 地址。当发送时,计算机 A 是通过广播的方式发送的,这时同一个子网中的计算机 C, D 也会收到这个数据包的,然后收到这个数据包的计算机,会把数据包的 MAC 地址取出来,与自身的 MAC 地址对比,如果两者相同,则接受这个数据包,否则就丢弃这个数据包。这种发送方式我们称之为广播,这就如同,我们在广场上通过广播的形式呼叫某个人一样,如果这个名字是你,你就理会一下,如果不是你,你就当作听不见。
(2). ARP 协议。
那么问题来了,计算机 A 是如何知道计算机 B 的 MAC 地址的呢?这个时候就得由 ARP 协议这个家伙来解决了,不过 ARP 协议会涉及到IP地址,我们下面才会扯到IP地址。因此我们先放着,你就当作有有这么一个 ARP 协议,通过这个协议,我们可以知道子网中其他计算机的 MAC 地址。
三、网络层
1、子网
上面我们有说到子网这个关键词,实际上我们所处的网络,是由无数个子网络构成的。广播的时候,也只有同一个子网里面的计算机能够收到。
假如没有子网这种划分的话,计算机 A 通过广播的方式发一个数据包给计算机 B , 其他所有计算机也都能收到这个数据包,然后进行对比再舍弃。世界上有那么多它计算机,每一台计算机都能收到其他所有计算机的数据包,那就不得了了。那还不得奔溃,于是,就有了子网这个概念。
那么问题来了,我们如何区分哪些 MAC 地址是属于同一个子网的呢?
假如是同一个子网,那我们就用广播的形式把数据传送给对方,如果不是同一个子网的,我们就会把数据发给网关,让网关进行转发。
为了解决这个问题,于是,有了 IP 协议。
2、IP协议
IP协议,它所定义的地址,我们称之为 IP地址。IP协议有两种版本,一种是 IPv4,另一种是 IPv6。不过我们目前大多数用的还是 IPv4,我们现在也只讨论 IPv4 这个版本的协议。
这个 IP 地址由 32 位的二进制数组成,我们一般把它分成 4 段的十进制表示,地址范围为 0.0.0.0~255.255.255.255。
每一台想要联网的计算机都会有一个IP地址。这个 IP 地址被分为两部分,前面一部分代表网络部分,后面一部分代表主机部分。并且网络部分和主机部分所占用的二进制位数是不固定的。
刚才我们扯了子网,然而并没有说什么是子网,那么什么是子网呢?
假如两台计算机的网络部分是一模一样的,我们就说这两台计算机是处于同一个子网中。例如 192.168.43.1 和 192.168.43.2, 假如这两个 IP 地址的网络部分为 24 位,主机部分为 8 位。那么他们的网络部分都为 192.168.43,所以他们处于同一个子网中。
可是问题来了,你怎么知道网络部分是占几位,主机部分又是占几位呢?也就是说,单单从两台计算机的IP地址,我们是无法判断他们的是否处于同一个子网中的。
这就引申出了另一个关键词————子网掩码。子网掩码和 IP 地址一样也是 32 位的二进制数,不过它的网络部分全部被规定为 1,主机部分全部规定为 0,也就是说,假如上面那两个IP地址的网络部分为 24 位,主机部分为 8 位的话,那他们的子网掩码都为 11111111.11111111.11111111.00000000,用十进制表示的话,就是 255.255.255.0。
那有了子网掩码,如何来判断IP地址是否处于同一个子网中呢?
显然,知道了子网掩码,通过子网掩码前半部分 1 的个数和后半部分 0 点个数,,我们可以知道 IP 地址的网络部分是几位,主机部分是几位。然后我们只需要把 IP 地址与它的子网掩码做与(and)运算,再把各自的结果进行比较就行了,如果比较的结果相同,则代表是同一个子网,否则不是同一个子网。
例如,192.168.43.1 和 192.168.43.2 的子码掩码都为 255.255.255.0,把IP与子码掩码做与运算,可以得到他们都为 192.168.43.0,进而他们处于同一个子网中。
3、ARP协议
有了上面 IP 协议的知识,我们回来讲一下 ARP 协议。
有了两台计算机的 IP 地址与子网掩码,我们就可以判断出它们是否处于同一个子网之中了。
假如他们处于同一个子网之中,计算机 A 要给计算机 B 发送数据时,我们可以通过 ARP 协议来得到计算机 B 的 MAC 地址。
ARP 协议会通过广播的形式给同一个子网中的每台电脑发送一个数据包(当然,这个数据包会包含接收方的 IP 地址,例如 计算机 B 的 IP 地址)。子网中的计算机收到这个数据包之后,会取出数据包中的 IP 地址与自身的 IP 对比,如果相同,则把自己的 MAC 地址回复给对方,否则就丢弃这个数据包。这样,计算机 A 就能知道计算机 B 的 MAC 地址了。
而这种通过广播获取对方 MAC 地址的协议,我们也称之为 ARP 协议。
可能有人会问,知道了 MAC 地址之后,发送数据是通过广播的形式发送,询问对方的 MAC 地址也是通过广播的形式来发送,那其他计算机怎么知道你是要传送数据还是要询问 MAC 地址呢?
为了解决这个问题,其实我们可以做一些约定。如果是要获取地方的 MAC 地址,我们可以在发广播的时候,在对方的 MAC 地址这一栏中,填一个特殊的 MAC 地址,其他计算机看到这个特殊的 MAC 地址之后,就能知道广播是想获取 MAC 地址了。
假如两台计算机的 IP 不是处于同一个子网之中,这个时候,我们就会把数据包发送给网关,然后让网关帮我们进行转发。
4、 DNS服务器
有人可能会问,在使用 ARP 协议获取对方的 MAC 地址的时候,我们是需要知道对应的 IP 地址的,有人可能会问,我们是如何知道对方计算机的 IP 地址的呢?
这个问题可能有人会觉得很白痴,心想,当然是计算机的操作者来进行输入了。这没错,当我们想要访问某个网站的时候,我们可以输入IP来进行访问,但是我相信绝大多数人是通过输入一个网址来进行访问的,因为网址容易记,而 IP地址,太特么难记了。例如访问百度是输入 www.baidu.com 这个域名。
其实,当我们输入这个域名时,会有一个叫做 DNS 服务器的家伙来帮我们解析这个域名,通过 DNS 服务器的帮忙,我们就可以获取到对应的 IP 地址了。
因此,网络层的功能就是让我们在茫茫人海中,能够找到另一台计算机在哪里,是否属于同一个子网等。
四、传输层
通过网络层的 IP 地址,我们可以知道对方位于哪一个子网之中,通过 ARP 协议,我们知道了对方的 MAC地址,通过广播发送数据包,我们成功把数据包发给了对方。
也就是说,通过物理层、数据链路层以及网络层的互相帮助,我们已经把数据成功从计算机 A 传送到计算机 B 了。可是,计算机 B 里面有各种各样的应用程序,计算机该把这些数据发给谁的呢?
为了解决这个问题,我们需要给每个程序做一个表示,于是,端口(Port)这个家伙就上场了,每个应该程序启动时,都有产生一个进程,而每一个想要接受网络数据的进程,都会给他分配一个端口号。
和网络层相比,传输层的功能就是建立端口到端口的通信,而网络层的功能是建立主机到主机的通信。
也就是说,只要有了IP和端口,我们才能进行准确着通信。这个时候有人可能会说,我在浏览器输入 IP 地址或者网址的的时候并没有指定一个端口啊。其实呢,对于有些传输协议,已经有设定了一些默认端口了。例如 http 的传输默认端口是80,也就是说,虽然你在输入地址时没有指定端口时,会默认帮你指定 80 这个端口,而这些端口信息也会包含在数据包里的。
TCP 和 UDP
有人可能会问,在传输数据包的时候,万一有些数据包丢了怎么办?万一数据包里的数据出现了错误怎么办?
其实,在传输层,主要有两大协议,分别是 TCP 和 UDP,TCP 是一种可靠传输协议,什么是可靠?意思就是 TCP 协议可以保证数据正确传输,不用担心数据包丢了出现数据缺失,TCP 协议还拥有流量控制和拥塞控制等功能。
关于 TCP 和 UDP 协议的故事,我们后面再讲。
五、 应用层
终于说到应用层了,应用层这一层最接近我们用户了。
我们前面的四层,我们的应用程序终于收到了数据,可是,计算机只认识 0 和 1,我们收到的数据也都是 0 和 1 的组合。通过前面说的以太网协议桢,虽然我们可以把这些 0 和 1 进行组合,知道了多少个 0 和 1 为一组。
但是,单单依靠这些是不够的,对于不同格式以及不同编码的数据,我们的渲染方式和解码是不同,例如对于 html,mp3,txt 等格式,我们会采取不同的处理方式。
我们该如何知道收到的数据是什么格式的呢?
这,就是应用层需要帮我们搞定的事情了。对于应用层协议,最常见的就是 http 协议了,我们可以从 http 数据包中,看到这些数据的格式,编码方式等,有了这些格式、编码的说明,我们就可以根据对应的规则来进行解码,渲染了。
总结
这篇文章,通过讲解一台计算机是如何找到另外一台计算机并且把数据发送给另一台计算机的,向大家介绍了网络通信的五层模型。
并且为了让大家容易懂,为屏蔽了很多细节,这也导致了我的一些讲解,可能不是那么的严谨。没办法,有时候严谨,就意味着晦涩难懂,而我这篇文章,选择了先让大家有个大概的模型,后面再围绕着这些知识点来讲解,例如 https 是如何保证数据不被篡改的啊,DNS 又是如何找到 IP的啊……总之,每个协议,深入下去的话,都有非常多可以讲的知识,并且这些基础知识,对一个人的影响,是潜移默化的。
本文转载自微信公众号「帅地玩编程」,可以通过以下二维码关注。转载本文请联系帅地玩编程公众号。