8

确实,从浏览器输入一个地址之后,当你按下Enter键之后,一系列奇怪的魔法就在发生,这是一个老生长谈的问题了,但能真的仔细知道全部却是一个艰难的事情。

网络架构之五层架构

在开始之前,还是必须知道网络的架构基础的。目前网络架构分为两种,七层架构和五层架构,本人更喜欢五层架构(主要是容易记,😄)。这个分层如图:

左侧对应的七层架构图,中间的是五层架构图,右侧对应的是每个层上具有的协议。

705728-20160424234827195-1493107425.png

我们使用的应用大多都是构建于应用层之上,必然,浏览器也不例外。

现在开始,地址栏键入地址,按下Enter键,就从这里开始吧(这里我就以键入百度https://www.baidu.com作为事例

先简单的认为数据传递是从发送方ip到接收方(百度)ip的一个行为,那双方ip是如何产生的。

发送方ip的产生 --- DHCP协议

关于本本机的ip从何而来,主要有两种方式,1. 手动配置 2. 自动配置

而自动配置,简单一些进行介绍,这个要从DHCP协议说起,先看以下两张图

image.png

手动配置方式:通过手动配置ip地址,子网掩码。但是这种方式并不适用普通用户,普通用户不可能知道当前网络的网络号,主机号,以及子网掩码应该是多少。而且这种配置方式非常的不灵活,在同一个子网下的ip被固定,其他人无法使用。另一点则是这台设备跟换了一个网络环境,就没有办法上网了。

image.png

动态配置:动态配置依托于DHCP协议,在每个子网下,会有一台DHCP服务器,存放着改子网的所有可配置ip,当我们打开电脑后,电脑会自动发发出一个请求ip的地址的广播到DHCP服务器,服务器会检查是否还存有可分配的ip,如有则响应给请求的电脑,并标记该ip已经被使用。(至于这些ip以后如何被释放,重新称为可分配的ip则是另一个话题)。

来看一下请求的ip的报文,通过5层网络框架的结构后是如何的?

image.png

接收方(百度)ip的产生 --- DNS解析

在浏览器地址栏中输入的是一个网址(百度),这个网址易于人的记忆,但是对于电脑而已就是头痛的事情。所有这个时候就需要DNS了,将它解析成一个电脑能够理解的ip地址。

它是如何工作的:

每个子网下都会有一台DNS服务器,在这台服务器中存放着域名和ip地址的映射表,从这里可以获取到百度的ip地址。这里只是说了这个DNS资源服务器的存在。那我是通过何种途径获取到DNS服务器中的ip地址呢?

这里就要说到以太网的信息传递方式——广播,首先在互联网发送任何一个消息,都会经过网络五层架构的封装,形成一条可以被广播的信息。如下图这种方式:

protocol.png

DNS解析的请求报文最终被封装如下:其中的Http报文部分,则包括了发送端的网址域名等信息。DNS服务器会获取到域名,到服务器中的域名ip映射表比较,如果有则响应报文,回到发送方,发送发送方也就知道了目标地址的ip信息。如果没有则会对消息转发到公共DNS服务器,比如google的DNS服务器,获取之后也会在本子网的DNS服务进行缓存,以便以下次请求。这便是DNS解析的过程

image.png

到这里你已经这道了双方通信的基础ip的产生了,那开始下一步的研究吧

是否在同一个子网下

在知道发送方和接收方的ip之后,第一件是则是判断双方是否在一个子网络下,如果在同一个子网下则不需要跨过网关,直接在子网内进行数据传输。

如何判断是否在一个子网下,其实很简单,只需要用你的子网掩码和双方的ip按位与,得到的结果如果是一样的,则在同一个网络内,不一样则不再同一个网络中。这里的区别是,不在同一个子网下,发送的报文数据包中的以太网首部中的MAC地址是接收方网卡的MAC地址,不是接收方主机的地址。

路由表

判断出发送方和接收方不再同一个子网下,就必然需要来到穿越茫茫负责的网络,来到对方的身边,那是根据什么才能到接收方的身边?—— 路由器

image.png

上图是一张基本的网络架构图,每个云代表这一个子网,箭头代表着数据的流向。从中可以看出数据是由路由进行转发的。其实每个路由中会维护一个路由表,会存放着这子网的ip,以及通过一些列复杂的路由探测,找到一条通往接收方网络的路径,从而发送给目标子网。

子网下获取接收方的MAC地址 —— ARP协议

经过路由等操作,报文信息已经来到了接收方的子网中了,那如何知道具体那一台主机呢。其实通过ip地址的主机号已经可以确定是那一台主机了,那此时是否就可以进行通信了呢?—— 不能

以前我同样有这样的疑问,都找到你了,为什么不能通信呢。用一个比方,千里迢迢到美国找到一个叫做“特朗普”的总统,他是唯一的,根据他的ip(美国(相当于网络号)-特朗普(相当于主机号))。虽然找到了他,但是语言通,无法沟通😢。此时就需要一个双方都能够接受的东西进行交流,这个就是MAC地址的作用。

根据ip地址找到MAC地址的协议,称为ARP协议(地址解析协议)

在每个子网下,会有一台服务器保存这子网下所有ip和MAC地址的映射。这个时候需要获取MAC地址,就会向子网内发送一个广播,获取ip对应主机MAC地址,基本结构如下

image.png

此时,跨过千山万水,发送方已经到接收方面前,能窃窃私语了。

数据响应

数据进行交互逻辑处理后,则会将数据返回给接收方,这个过程称为响应。我们来看下浏览器的inpect下response header中的信息。其中每个字段都代表了某种信息。

如:
Expires:表示缓存的过期时间
Remote Address: 则是DNS解析后的远程地址

image.png
image.png

当拿到了响应的信息后,剩下的事情则是浏览器要做的。加载资源,解析html,构建抽象语法树,渲染页面,以及解析JS等。

总结

本文旨在熟悉消息在网络中的传输过程中会经历什么样的过程。对其中每一种协议并没有进行深入的研究,如果展开,每一种协议都值得用一篇文章来介绍。当然也可以根据提到的再去深入挖掘,必然让你更加熟悉网络的每一个环节。

相信,事物的发展都是有其规律的。知道为什么会更驾轻就熟。


mdiep
249 声望6 粉丝

软件开发工程师-往大前端开发方向靠拢