还在被人一句话“你知道传输协议吗”问道无语吗?html
天各一方的两台计算机是如何通讯的呢?数组
在成千上万的计算机中,为何一台计算机可以准确着寻找到另一台计算机,而且把数据发送给它呢?服务器
可能不少人都据说过网络通讯的 5 层模型,可是可能并非很清楚为何须要五层模型,五层模型负责的任务也有可能常常混淆。下面是网络通讯的五层模型网络
说实话,五层模型的具体内容仍是极其复杂的,不过今天这篇文章,我将用最简洁的模式,经过网络通讯的五层模型来说解一台计算机是如何找到另一台计算机而且把数据发送给另外一台计算机的,就算你没学过计算机网络,也可以听的懂。网站
一台计算机与另外一台计算机要进行通讯,第一件要作的事是什么?固然是要把这台计算机与另外的其余计算机连起来啊,这样,咱们才能把数据传输过去。例如能够经过光纤啊,电缆啊,双绞线啊等介质把他们链接起来,而后才能进行通讯。计算机网络
也就是说,物理层负责把两台计算机连起来,而后在计算机之间经过高低电频来传送0,1这样的电信号。htm
前面说了,物理层它只是单纯着负责把计算机链接起来,而且在计算机之间传输0,1这样的电信号。若是这些0,1组合的传送毫无规则的话,计算机是解读不了的。一大堆0,1谁知道是什么鬼啊。blog
所以,咱们须要制定一套规则来进行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 不只连着计算机 B,并且计算机 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 地址。
上面咱们有说到子网这个关键词,实际上咱们所处的网络,是由无数个子网络构成的。广播的时候,也只有同一个子网里面的计算机可以收到。
假如没有子网这种划分的话,计算机 A 经过广播的方式发一个数据包给计算机 B , 其余全部计算机也都能收到这个数据包,而后进行对比再舍弃。世界上有那么多它计算机,每一台计算机都能收到其余全部计算机的数据包,那就不得了了。那还不得奔溃。 所以产生了子网这么一个东西。
那么问题来了,咱们如何区分哪些 MAC 地址是属于同一个子网的呢?假如是同一个子网,那咱们就用广播的形式把数据传送给对方,若是不是同一个子网的,咱们就会把数据发给网关,让网关进行转发。
为了解决这个问题,因而,有了 IP 协议。
1. 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地址是否处于同一个子网中呢。显然,知道了子网掩码,至关于咱们知道了网络部分是几位,主机部分是几位。咱们只须要把 IP 地址与它的子网掩码作与(and)运算,而后把各自的结果进行比较就好了,若是比较的结果相同,则表明是同一个子网,不然不是同一个子网。
例如,192.168.43.1和192.168.43.2的子码掩码都为255.255.255.0,把IP与子码掩码相与,能够获得他们都为192.168.43.0,进而他们处于同一个子网中。
2. ARP协议
有了上面IP协议的知识,咱们回来说一下ARP协议。
有了两台计算机的IP地址与子网掩码,咱们就能够判断出它们是否处于同一个子网之中了。
假如他们处于同一个子网之中,计算机A要给计算机B发送数据时。咱们能够经过ARP协议来获得计算机B的MAC地址。
ARP协议也是经过广播的形式给同一个子网中的每台电脑发送一个数据包(固然,这个数据包会包含接收方的IP地址)。对方收到这个数据包以后,会取出IP地址与自身的对比,若是相同,则把本身的MAC地址回复给对方,不然就丢弃这个数据包。这样,计算机A就能知道计算机B的MAC地址了。
可能有人会问,知道了MAC地址以后,发送数据是经过广播的形式发送,询问对方的MAC地址也是经过广播的形式来发送,那其余计算机怎么知道你是要传送数据仍是要询问MAC地址呢?其实在询问MAC地址的数据包中,在对方的MAC地址这一栏中,填的是一个特殊的MAC地址,其余计算机看到这个特殊的MAC地址以后,就能知道广播想干吗了。
假如两台计算机的IP不是处于同一个子网之中,这个时候,咱们就会把数据包发送给网关,而后让网关让咱们进行转发传送
3. DNS服务器
这里再说一个问题,咱们是如何知道对方计算机的IP地址的呢?这个问题可能有人会以为很白痴,心想,固然是计算机的操做者来进行输入了。这没错,当咱们想要访问某个网站的时候,咱们能够输入IP来进行访问,可是我相信绝大多数人是输入一个网址域名的,例如访问百度是输入 www.baidu.com 这个域名。其实当咱们输入这个域名时,会有一个叫作DNS服务器的家伙来帮咱们解析这个域名,而后返回这个域名对应的IP给咱们的。
所以,网络层的功能就是让咱们在茫茫人海中,可以找到另外一台计算机在哪里,是否属于同一个子网等。
经过物理层、数据链路层以及网络层的互相帮助,咱们已经把数据成功从计算机A传送到计算机B了,但是,计算机B里面有各类各样的应用程序,计算机该如何知道这些数据是给谁的呢?
这个时候,端口(Port)这个家伙就上场了,也就是说,咱们在从计算机A传数据给计算表B的时候,还得指定一个端口,以供特定的应用程序来接受处理。
也就是说,传输层的功能就是创建端口到端口的通讯。相比网络层的功能是创建主机到主机的通讯。
也就是说,只有有了IP和端口,咱们才能进行准确着通讯。这个时候可能有人会说,我输入IP地址的时候并无指定一个端口啊。其实呢,对于有些传输协议,已经有设定了一些默认端口了。例如http的传输默认端口是80,这些端口信息也会包含在数据包里的。
传输层最多见的两大协议是 TCP 协议和 UDP 协议,其中 TCP 协议与 UDP 最大的不一样就是 TCP 提供可靠的传输,而 UDP 提供的是不可靠传输。
终于说到应用层了,应用层这一层最接近咱们用户了。
虽然咱们收到了传输层传来的数据,但是这些传过来的数据五花八门,有html格式的,有mp4格式的,各类各样。你肯定你能看的懂?
所以咱们须要指定这些数据的格式规则,收到后才好解读渲染。例如咱们最多见的 Http 数据包中,就会指定该数据包是 什么格式的文件了。