根据分层模型,从下往上分析数据在互联网网络中的传输
前言
在上一篇“互联网协议(一)”中,我们简单探讨了一下互联网协议的基本历史与传输数据的模型。但实际上,数据从被用户点击要发送时起,需要经历一系列过程,这个过程是一个将数据简化的过程,也是一个寻找发送目标的过程。
层层包装的数据碾碎成电流信号,传递到地球上另外一端,又经历层层包装的剥除,直到最核心的数据被拿到。这里的层层包装,就是上一篇文章里提到的模型所对应的协议。
让我们回顾一下,上文末尾说到,为了方便原理解读,将数据传输模型分为 5 层最为合适:
图片来源网络请务必记住这 5 层模型。
一、链接层
8 个二进制位数即 1 字节,是计算机数据存储的最小单位
以太网协议
数据想要传输,最基本的一点在于,实体层就是一根一根的网线,传递 0 和 1 的电信号。虽然可以让电脑解读 0 和 1,但是也得有一定的规则来处理这些 0 和 1,否则就是一堆无意义的数字而已。
所以,如何制定这个规则就至关重要。许多公司出于商业战略目的,各自有各自的实现方式和规定,每家的规定各不相同,无法兼容,谁能胜出,就看市场的选择了。后来,一种叫“以太网”的协议胜出。
以太网规定,可以将电信号进行分组,每组构成一个数据包,叫做“帧”(Frame)。每一帧分成两个部分:标头(Head)和数据(Data)。
图片来源网络“标头”包含数据包的一些说明项,比如发送者、接受者、数据类型等等;“数据”则是数据包的具体内容。
“标头”的长度,固定为 18 字节。“数据”的长度,最短为 46 字节,最长为 1500 字节。因此,整个“帧”最短为 64 字节,最长为 1518 字节。如果数据很长,就必须分割成多个帧进行发送。
请记住这里的 Data 部分,可以先把它看作一个盒子,如果你知道“俄罗斯套娃”,可以把这层协议看作套娃的最外层壳子。后面的协议都是基于此。上层协议基于下层协议,同时数据也是如此存放。
MAC 地址
初步定义了电信号的组成方式,但还面临一个很严重的问题:数据如何一对一、一对多实现精准发送?我们在上篇文章已经指出了成熟的互联网的结构是错综复杂,彼此相连的,既然大家都连在一起,谁知道这个数据该走那条线路可以送到目标哪里?
所以,得有一个东西给每台计算机标识唯一身份,像人一样,有一张“身份证”。
如果你使用过校园网,对 MAC 地址会熟悉一点。一些高校的校园网,在你每次访问时都需要输入账号密码,十分麻烦。如果你能找到你电脑的 MAC 地址 —— win 10 系统可以如下找到:设置 - 网络和 Internet - 状态 - 属性,然后拉到最底下,就可以看到你电脑的 MAC 地址。是一串类似于下面的编码:
44-AF-28-A7-3A-50
将其输入校园网的管理后台做“无感知验证”,之后访问校园网时便不用再输入账号密码了。
所以,这个 MAC 地址到底是什么呢?
MAC: Media Access Control,硬件地址
计算机可以上网,发送数据,依靠的一个硬件,叫作“网卡”。
数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫作 MAC 地址。每块网卡出厂的时候,都有一个全世界独一无二的 MAC 地址,长度是 48 个二进制位,通常用 12 个十六进制数表示。 —— 阮一峰
上面那个 MAC 地址就是 16 进制数。
有了这个身份账号,且是独一无二的,离数据的精准发送又近了一步。
发送与接收
现在摆在面前的就是两个问题:第一,网络中的计算机那么多,如何找到那条通往目标的路径?第二,MAC 地址与 MAC 地址之间并不知道彼此身份,如何找到目标,如何证明自己的身份?
以太网协议的处理方式简单粗暴 —— 全体发送 —— 这种方式被称为广播。就好像你在车站丢了钱包,车站广播让失主去领,且要说出钱包的特征。一堆人去领,但是回答不出钱包的特征,只有你可以说出钱包的特征,成功拿回了自己的钱包。
一台计算机,将 MAC 地址放在一组数据包的 Head 里面,数据放在 Data 里面,向其他计算机广播,拿到数据包的计算机读取 Head 里的 MAC 地址是不是自己,是就接收数据,不是就不接收。
看到这里,你也许会问,世界上有那么多台计算机,每台计算机都可以接收别人发的数据做判断,岂不是累死?
其实,这种方式是有限制的,也就是这些计算机必须在一个网络里,才可以相互广播。如果你和自己的兄弟联机打过游戏,就能理解什么叫作“在一个网络”,例如校园网,就是一个网络,里面的计算机是有限的。
这在上一篇文章里也讲过,网络是分层级的,小则一台,多则几台、百台、亿台,不同的划分可以将不同数量的机器划分于特定规模的网络中。
链接层总结
到了这里,以太网协议完成了三件大事 —— 电信号分组,计算机的物理地址,数据的发送与接收。
有了这关键的三个规定,计算机之间就可以发送相当简单的数据了,并且在局部网络内可以实现数据的“精准”接收。
但是,这仍然很有限。还有很多问题,但它还是解决了上述三个关键问题。所以,一种协议解决一个问题,才会有这么多层的协议,且越到后面,问题都被解决差不多了,协议解决问题的范围就越来越小,愈加细化,也更靠近用户,解决一些用户更渴求的问题。
二、网络层
如果使用上述以太网协议传输数据,北京如何向华盛顿传输“你好,华盛顿”?
显然,北京和华盛顿的距离之远,以及所在子网不同,几乎不可能实现。
所以,崭新的问题又摆在面前,就是上面提到的,非相同子网如何传输?数量恐怖的计算机如果“人手一包”,计算机如何承受得了?每天光是处理群发的数据就可以令其直接爆炸。
所以,必须有其他的方案在以太网基础上进行改进。
这就导致了第三层(从下往上)网络模型的诞生:网络层。
网络层引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",简称"网址"。这与刚才的 MAC 地址不一样,MAC 地址称为“物理地址”,因为它依赖于硬件网卡。网址,则不依赖于任何硬件。这是一种新的区分计算机所在网络地址的方案。
IP 协议
IP: Internet Protocol,互联网协议
IP 协议有 IPv4 与 IPv6 两个版本。两个版本的区别在于长度,IPv4 由 32 位二进制数组成,IPv6 则由 128 位组成。长度越长,组合的可能性就越多,可以分配的地址就越多。
随着互联网的发展,入网设备每年以爆炸量增长,IPv4 地址容量已经触底,所以有必要使用 IPv6。现在多数手机厂商为了宣传营销,特意强调 IPv6,似户很高大上,实际上并不是什么新奇技术或创新服务。
但二进制数表示的 IP 地址冗长难记,所以,人们会把其转换位十进制的数。也就是从 0.0.0.0 一直到 255.255.255.255。
互联网上的每一台计算机,都会分配到一个 IP 地址。这个地址分成两个部分,前一部分代表网络,后一部分代表主机。但是,前后,哪部分是前,哪部分是后? 这点没有规定,都有可能。也就是说,四个数,有可能第一个数是网络,后三个数是主机;也有可能前三个数是网络,后一个数是主机,这是不确定的。
但有一点,处于同一个子网络的电脑,它们 IP 地址的网络部分必定是相同的。
换句话说,127.3.254.3 与 127.3.254.3,看起来是一样的,但是如果第一个 IP 网络部分是第一个数,第二个 IP 的网络部分是前两个数,他们并不是同一个地址。
但这里最重要的点在于,处于同一个子网络的电脑,它们 IP 地址的网络部分必定是相同的。带着这点,往下看。
子网掩码
子网掩码:subnet mask
子网掩码,就是表示 IP 地址网络部分与主机部分的组成关系的隐藏码。它在形式上与 IP 地址一致,但使用 0 和 1 的二进制数。可以简单理解 1 为 true,0 为 false。true 表示网络部分,false 表示主机部分。
比如,IP 地址 172.16.254.1,如果已知网络部分是前 24 位,主机部分是后 8 位,那么子网络掩码就是:
11111111.11111111.11111111.00000000
写成十进制就是 255.255.255.0。当然,这是子网掩码,表示 IP 地址的组成。
如果 IP 地址 172.16.254.1 的子网掩码是:
11111111.11111111.00000000.00000000
写成十进制就是 255.255.0.0。那么这二者并非同一个地址。
IP 协议数据包
前面讲到以太网发送数据包,形式是:
图片来源网络以太网的 Head 存放 MAC 地址,Data 存放数据。IP 协议也是如此,IP 协议数据包也是分为这两个部分。其中,Head 存放 IP 地址,Data 存放数据。
图片来源网络但以太网 HEAD 里已经存放 MAC 地址,且容量很小,所以 IP 数据包放在以太网数据包的 Data 里,最后,形成下面的结构:
图片来源网络IP 数据包的 Head 部分长度为 20 到 60 字节,整个数据包的总长度最大为 65,535 字节。因此,理论上,一个 IP 数据包的“数据”部分,最长为 65,515 字节。前面说过,以太网数据包的 Data 部分,最长只有 1500 字节。因此,如果 IP 数据包超过了 1500 字节,它就需要分割成几个以太网数据包,分开发送了。
ARP 协议
ARP:Address Resolution Protocol,地址解析协议
ARP 协议是对以太网协议和 IP 协议的补充,也是包含在以太网数据包中。
前面讲到,在一个局域网内,数据的传输需要知道对方的 MAC 地址。没有 IP 地址时通过广播的形式,拿到数据包的主机自己做 MAC 地址的比较。
IP 地址诞生后,可以通过 IP 地址与 MAC 地址建立一个对应关系。
主机发送信息时将包含目标 IP 地址的 ARP 请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该 IP 地址和物理地址存入本机 ARP 缓存中并保留一定时间,下次请求时直接查询 ARP 缓存以节约资源。
地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送 ARP 应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机 ARP 缓存。
总之 ARP 就是用于解析 IP 地址与 MAC 地址对应关系从而好发送数据的一种协议。
本章所讲的 IP 地址指的是静态 IP,是长期分配给主机的地址,用于确定其身份。动态 IP 是上网时网管(比如电信)给你分配的随机 IP,具有一定的安全性。防止黑客根据你的 IP 黑进你的设备。
三、传输层
一层协议只解决特有的问题
端口
MAC 地址和 IP 地址的出现,现在已经可以在局域网上和任意两台主机间建立通信。
但问题也随之而来 —— 同一台主机上有许多程序都需要用到网络。比如,一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,怎么知道,它是表示网页的内容,还是表示在线聊天的内容?
也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。
这个参数就叫做“端口”(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
“端口”是 0 到 65535 之间的一个整数,正好 16 个二进制位。0 到 1023 的端口被系统占用,用户只能选用大于 1023 的端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。
“传输层”的功能,就是建立“端口到端口”的通信。相比之下,“网络层”的功能是建立“主机到主机”的通信。只要确定主机和端口,我们就能实现程序之间的交流。
UDP 协议与 TCP 协议
UDP:User Datagram Protocol,用户数据报协议
TCP:Transmission Control Protocol,传输控制协议
UDP 协议与 IP 协议一样,构成仍然是 Head + Data:
图片来源网络存放在 IP 协议里的 Data 里。UDP 数据包非常简单,Head 部分一共只有 8 个字节,总长度不超过 65,535 字节,正好放进一个 IP 数据包的 Data 中。
但 UDP 是没有“已收到”响应的,一旦数据包发出,无法知道对方是否收到。
TCP 协议为了弥补 UDP 的缺陷,加入了确认机制,一旦接收方成功接收数据,就会响应已收到。这个过程就会比较复杂。
与 UDP 一样,TCP 的包体还是放在 IP 数据包的 Data 中。TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过 IP 数据包的长度,以确保单个 TCP 数据包不必再分割。
四、应用层
应用程序也会规定自己内部的数据以什么形式进行交换
这里拿最经典的 HTTP 协议做例子。HTTP,全称“超文本传输协议”。什么是“超文本”?—— 就是网页。浏览器里展示的就是网页,网页展示的内容就是超文本。
HTTP 就是用于传输超文本的协议,只针对于与超文本有关的应用。自然,HTTP 内部也会做出很多规定,为了实现数据的传输,需要制定许多规则。
HTTP 作为互联网发展的催化剂之一,内容十分庞大,这里不再展开讲述。
现在,移动端、PC 端等各种端设备以及各种应用程序层出不穷,各行各业都在各自的领域设计了属于自己的应用层的传输协议。例如,微信内部有自己的加密传输的协议,高耗能行业、电子阅读行业等都有自己的一些协议。
这些协议会以一些结构打包进传输层协议的 Data 中。至此,数据被打包成多层“套娃”式的数据包,每层 Head 里包含了该层应该放置的控制信息,便于目标计算机解读拿取数据。
图片来源网络后记
本篇文章基于 5 层模型,从下到上分别讲了每层模型对应的原理及基本运用。
这 5 层模型里,应用层、传输层的相关协议是前端工程师在面试中经常被问到的问题。其中,HTTP 是最重要的,毕竟网页开发 HTTP 是不可能绕开的话题。
不论应用层技术如何日新月异,底层原理是恒久的,知道得越多,思想的边界便更加开阔。
凿之愈深,其理愈明。
网友评论