确实,从浏览器输入一个地址以后,当你按下Enter键以后,一系列奇怪的魔法就在发生,这是一个老生长谈的问题了,但能真的仔细知道所有倒是一个艰难的事情。html
在开始以前,仍是必须知道网络的架构基础的。目前网络架构分为两种,七层架构和五层架构,本人更喜欢五层架构(主要是容易记,😄)。这个分层如图:浏览器
左侧对应的七层架构图,中间的是五层架构图,右侧对应的是每一个层上具备的协议。缓存
咱们使用的应用大多都是构建于应用层之上,必然,浏览器也不例外。服务器
如今开始,地址栏键入地址,按下Enter键,就从这里开始吧(这里我就以键入百度https://www.baidu.com做为事例)网络
先简单的认为数据传递是从发送方ip到接收方(百度)ip的一个行为,那双方ip是如何产生的。架构
关于本本机的ip从何而来,主要有两种方式,1. 手动配置 2. 自动配置框架
而自动配置,简单一些进行介绍,这个要从DHCP协议提及,先看如下两张图google
手动配置方式:经过手动配置ip地址,子网掩码。可是这种方式并不适用普通用户,普通用户不可能知道当前网络的网络号,主机号,以及子网掩码应该是多少。并且这种配置方式很是的不灵活,在同一个子网下的ip被固定,其余人没法使用。另外一点则是这台设备跟换了一个网络环境,就没有办法上网了。spa
动态配置:动态配置依托于DHCP协议,在每一个子网下,会有一台DHCP服务器,存放着改子网的全部可配置ip,当咱们打开电脑后,电脑会自动发发出一个请求ip的地址的广播到DHCP服务器,服务器会检查是否还存有可分配的ip,若有则响应给请求的电脑,并标记该ip已经被使用。(至于这些ip之后如何被释放,从新称为可分配的ip则是另外一个话题)。htm
来看一下请求的ip的报文,经过5层网络框架的结构后是如何的?
在浏览器地址栏中输入的是一个网址(百度),这个网址易于人的记忆,可是对于电脑而已就是头痛的事情。全部这个时候就须要DNS了,将它解析成一个电脑可以理解的ip地址。
它是如何工做的:
每一个子网下都会有一台DNS服务器,在这台服务器中存放着域名和ip地址的映射表,从这里能够获取到百度的ip地址。这里只是说了这个DNS资源服务器的存在。那我是经过何种途径获取到DNS服务器中的ip地址呢?
这里就要说到以太网的信息传递方式——广播,首先在互联网发送任何一个消息,都会通过网络五层架构的封装,造成一条能够被广播的信息。以下图这种方式:
DNS解析的请求报文最终被封装以下:其中的Http报文部分,则包括了发送端的网址域名等信息。DNS服务器会获取到域名,到服务器中的域名ip映射表比较,若是有则响应报文,回到发送方,发送发送方也就知道了目标地址的ip信息。若是没有则会对消息转发到公共DNS服务器,好比google的DNS服务器,获取以后也会在本子网的DNS服务进行缓存,以便如下次请求。这即是DNS解析的过程
到这里你已经这道了双方通讯的基础ip的产生了,那开始下一步的研究吧
在知道发送方和接收方的ip以后,第一件是则是判断双方是否在一个子网络下,若是在同一个子网下则不须要跨过网关,直接在子网内进行数据传输。
如何判断是否在一个子网下,其实很简单,只须要用你的子网掩码和双方的ip按位与,获得的结果若是是同样的,则在同一个网络内,不同则再也不同一个网络中。这里的区别是,不在同一个子网下,发送的报文数据包中的以太网首部中的MAC地址是接收方网卡的MAC地址,不是接收方主机的地址。
判断出发送方和接收方再也不同一个子网下,就必然须要来到穿越茫茫负责的网络,来到对方的身边,那是根据什么才能到接收方的身边?—— 路由器
上图是一张基本的网络架构图,每一个云表明这一个子网,箭头表明着数据的流向。从中能够看出数据是由路由进行转发的。其实每一个路由中会维护一个路由表,会存放着这子网的ip,以及经过一些列复杂的路由探测,找到一条通往接收方网络的路径,从而发送给目标子网。
通过路由等操做,报文信息已经来到了接收方的子网中了,那如何知道具体那一台主机呢。其实经过ip地址的主机号已经能够肯定是那一台主机了,那此时是否就能够进行通讯了呢?—— 不能
之前我一样有这样的疑问,都找到你了,为何不能通讯呢。用一个比方,千里迢迢到美国找到一个叫作“特朗普”的总统,他是惟一的,根据他的ip(美国(至关于网络号)-特朗普(至关于主机号))。虽然找到了他,可是语言通,没法沟通😢。此时就须要一个双方都可以接受的东西进行交流,这个就是MAC地址的做用。
根据ip地址找到MAC地址的协议,称为ARP协议(地址解析协议)
在每一个子网下,会有一台服务器保存这子网下全部ip和MAC地址的映射。这个时候须要获取MAC地址,就会向子网内发送一个广播,获取ip对应主机MAC地址,基本结构以下
此时,跨过千山万水,发送方已经到接收方面前,能窃窃私语了。
数据进行交互逻辑处理后,则会将数据返回给接收方,这个过程称为响应。咱们来看下浏览器的inpect下response header中的信息。其中每一个字段都表明了某种信息。
如:
Expires:表示缓存的过时时间
Remote Address: 则是DNS解析后的远程地址
当拿到了响应的信息后,剩下的事情则是浏览器要作的。加载资源,解析html,构建抽象语法树,渲染页面,以及解析JS等。
本文旨在熟悉消息在网络中的传输过程当中会经历什么样的过程。对其中每一种协议并无进行深刻的研究,若是展开,每一种协议都值得用一篇文章来介绍。固然也能够根据提到的再去深刻挖掘,必然让你更加熟悉网络的每个环节。
相信,事物的发展都是有其规律的。知道为何会更得心应手。