目录

打开浏览器从输入网址到网页呈现在大家面前,背后到底发生了什么?经历怎么样的一个过程?先给大家来张总体流程图,具体步骤请看下文分解!

总体来说分为以下几个过程:
URL(Uniform Resource Locator),统一资源定位符,用于定位互联网上资源,俗称网址。
比如, http://www.w3school.com.cn,遵守以下的语法规则:
scheme://host.domain:port/path/filename
各部分解释如下:👇
在浏览器输入网址后,首先要经过域名解析,因为浏览器并不能直接通过域名找到对应的服务器,而是要通过 IP 地址。大家这里或许会有个疑问----计算机既可以被赋予 IP 地址,也可以被赋予主机名和域名。比如 www.hackr.jp。那怎么不一开始就赋予个 IP 地址?这样就可以省去解析麻烦。我们先来了解下什么是 IP 地址
1. IP 地址
IP 地址是指互联网协议地址,是 IP Address 的缩写。IP 地址是 IP 协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP 地址是一个 32 位的二进制数,比如 127.0.0.1 为本机 IP。
域名就相当于 IP 地址乔装打扮的伪装者,带着一副面具。它的作用就是便于记忆和沟通的一组服务器的地址。用户通常使用主机名或域名来访问对方的计算机,而不是直接通过 IP 地址访问。因为与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。但要让计算机去理解名称,相对而言就变得困难了。因为计算机更擅长处理一长串数字。为了解决上述的问题,DNS 服务应运而生。
2. 什么是域名解析
DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。DNS 是一个网络服务器,我们的域名解析简单来说就是在 DNS 上记录一条信息记录。
例如 baidu.com 220.114.23.56(服务器外网IP地址)80(服务器端口号)
3. 浏览器如何通过域名去查询 URL 对应的 IP 呢
注:从客户端到本地DNS服务器是属于递归查询(浏览器缓存、host文件、系统缓存、路由器缓存、ISP DNS缓存),而DNS服务器(根域名服务器、顶级域名服务器、主域名服务器)之间就是的交互查询就是迭代查询
注:DNS缓存主要存在于这几个地方:浏览器缓存,本机host文件,系统缓存,路由器缓存,ISP服务器缓存,根域名服务器(根DNS服务器,也称根域)缓存,顶级域名服务器(顶级DNS服务器,也称顶级域)缓存,主(权威)域名服务器(也称主域、权威域)缓存。
另,浏览器缓存,本机host文件,系统缓存,路由器缓存,这几步均为客服端的DNS缓存
❓ 关于DNS解析次序 ❓
网上有如下2种说法:主要集中在浏览器访问系统DNS缓存时,是否包含host
经过本人了解以及向其他朋友询问的情况,第一种认知是较为正确的
1、多数人认为系统DNS缓存跟系统的host文件DNS缓存,是2个含义、不同的DNS缓存。
当访问一个网站时系统将从浏览器DNS缓存中读取该域名所对应的IP地址,当查找不到时就会到系统中查找hosts文件,如果没有会去系统DNS缓存中查找对应关系,如果还没有那么才会向本地DNS服务器请求一个DNS查询。注:DNS缓存是内存里的东西,每次关机就没的。介绍Hosts文件和DNS及DNS的解析过程 | 码农家园注:本地hosts文件优先级高于本地内存中的dns缓存。这也是windows系统的默认域名解析顺序,所以会优先检查host。(资料来源于网络)
所以,多数人认知的DNS解析次序:浏览器缓存 -> host文件 -> 操作系统dns cache -> 路由器缓存 -> ISP DNS缓存 -> 非权威域名服务器 -> 根域名服务器 -> 顶级域名服务器 -> 二级域名服务器 -> 权威域名服务器。
2、部分人认为系统DNS缓存跟系统host文件的DNS缓存,是一个含义,是同一个DNS缓存。
如果浏览器自身的缓存里面没有找到对应的DNS条目,那么会尝试直接读取操作系统的DNS缓存(因为操作系统会监视hosts文件的变化并能动态更新到操作系统dns缓存)看是否存在对应的映射关系,如果存在,则域名解析到此完成。
所以,DNS的实际解析次序:浏览器缓存 -> 操作系统 dns cache【包含hosts】 -> 路由器缓存 -> ISP DNS缓存 -> 非权威域名服务器 -> 根域名服务器 -> 顶级域名服务器 -> 二级域名服务器 -> 权威域名服务器。
其实,焦点主要是区分:操作系统自身的DNS缓存和本地host文件有啥区别?
第二种说法,一般有以下2个依据:
(1) win10系统监视host文件变化,会更新到系统dns缓存
有人做过测试,Win10会在启动时加载hosts中的条目到操作系统dns缓存,win10还会监视hosts文件的变化,并动态更新,如新加或删除条目,都会更新操作系统dns缓存。如果尝试解析一个未知的域名,win10并不会访问hosts,观察依据就是hosts的访问时间不会更新。
(2) 修改 hosts 后不生效,原因就是访问网站,优先加载系统DNS缓存
无论是手工修改 hosts 还是使用软件来修改,很多人都会遇到修改 hosts 后不生效的情况。其实,这一般是由于 DNS 缓存的原因导致的。因为系统为了加快用户打开网站的速度,在首次访问网站成功之后,会把 DNS 解析的结果暂时性地保存在本地缓存 (称为 DNS 缓存) 里一小段时间,如果浏览器在“这段时间里”再次打开同一个网址,则会自动从 DNS 缓存里取出结果,而不会请求远程的 DNS 服务器,也不会查询 hosts 文件,从而节省时间提高打开速度。因此用户会遇到有时修改了 hosts 文件但并不生效的情况,一般这时候我们想办法清空 (刷新) 一下系统的 DNS 缓存即可。
如何清空 DNS 缓存?
- 在 Windows 下命令行执行:ipconfig /flushdns
- 在 macOS 下执行命令:sudo killall -HUP mDNSResponder
- 如果你使用 Chrome 浏览器,那么可以访问:chrome://net-internals/#dns,然后点击「Clear host cache」按钮来清空浏览器里的 DNS 缓存。
👉 参考:缓存详解 | 介绍Hosts文件和DNS及DNS的解析过程 | 终于明白了DNS - 知乎
👉 参考:DNS解析过程 - 查找DNS缓存 - 博客园 | DNS解析过程 - DNS缓存有哪些 - 简书
4. 小结
浏览器通过向 DNS 服务器发送域名,DNS 服务器查询到与域名相对应的 IP 地址,然后返回给浏览器,浏览器再将 IP 地址打在协议上,同时请求参数也会在协议搭载,然后一并发送给对应的服务器。接下来介绍向服务器发送 HTTP 请求阶段,HTTP 请求分为三个部分:TCP 三次握手、http 请求响应信息、关闭 TCP 连接。
在客户端发送数据之前会发起 TCP 三次握手用以同步客户端和服务端的序列号和确认号,并交换 TCP 窗口大小信息。
1. TCP 三次握手的过程如下:
2. 为啥需要三次握手
TCP 三次握手的目的是:为了防止已经失效的连接请求报文发送到服务端,服务端因而产生不必要的响应开销。
在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。在另一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题。
TCP 三次握手结束后,开始发送 HTTP 请求报文。
请求报文由请求行(request line)、请求头(header)、空行、请求体四个部分组成,如下图所示:
1. 请求行包含请求方法、URL、协议版本
POST /chapter17/user.html HTTP/1.1
以上代码中“POST”代表请求方法,“/chapter17/user.html”表示 URL,“HTTP/1.1”代表协议和协议的版本。现在比较流行的是 Http1.1 版本
2. 请求头包含请求的附加信息,由关键字 / 值对组成,每行一对,关键字和值用英文冒号“:”分隔。
请求头部通知服务器有关于客户端请求的信息。它包含许多有关的客户端环境和请求正文的有用信息。其中,比如:Host,表示主机名,虚拟主机;Connection,是HTTP/1.1 增加的,使用 keepalive,即持久连接,一个连接可以发多个请求;User-Agent,请求发出者,兼容性以及定制化需求。
3. 请求体,可以承载多个请求参数的数据,包含回车符、换行符和请求数据,并不是所有请求都具有请求数据。
name=tom&password=1234&realName=tomson
上面代码,承载着 name、password、realName 三个请求参数。
1. 服务器
服务器是网络环境中的高性能计算机,它侦听网络上的其他计算机(客户机)提交的服务请求,并提供相应的服务,比如网页服务、文件下载服务、邮件服务、视频服务。而客户端主要的功能是浏览网页、看视频、听音乐等等,两者截然不同。 每台服务器上都会安装处理请求的应用——web server。常见的 web server 产品有 apache、nginx、IIS 或 Lighttpd 等。
web server 担任管控的角色,对于不同用户发送的请求,会结合配置文件,把不同请求委托给服务器上处理相应请求的程序进行处理(例如 CGI 脚本,JSP 脚本,servlets,ASP 脚本,服务器端 JavaScript,或者一些其它的服务器端技术等),然后返回后台程序处理产生的结果作为响应。
2. MVC 后台处理阶段
后台开发现在有很多框架,但大部分都还是按照 MVC 设计模式进行搭建的。
MVC 是一个设计模式,将应用程序分成三个核心部件:模型(model)-- 视图(view)--控制器(controller),它们各自处理自己的任务,实现输入、处理和输出的分离。
1、视图(view)
它是提供给用户的操作界面,是程序的外壳。
2、模型(model)
模型主要负责数据交互。在 MVC 的三个部件中,模型拥有最多的处理任务。一个模型能为多个视图提供数据。
3、控制器(controller)
它负责根据用户从"视图层"输入的指令,选取"模型层"中的数据,然后对其进行相应的操作,产生最终结果。控制器属于管理者角色,从视图接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示模型处理返回的数据。
这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。
至于这一阶段发生什么?简而言之,首先浏览器发送过来的请求先经过控制器,控制器进行逻辑处理和请求分发,接着会调用模型,这一阶段模型会获取 redis db 以及 MySQL 的数据,获取数据后将渲染好的页面,响应信息会以响应报文的形式返回给客户端,最后浏览器通过渲染引擎将网页呈现在用户面前。
3. http 响应报文
响应报文由响应行(request line)、响应头部(header)、响应主体三个部分组成。如下图所示:
(1) 响应行包含:协议版本,状态码,状态码描述
状态码规则如下:
(2) 响应头部包含响应报文的附加信息,由 名/值 对组成
(3) 响应主体包含回车符、换行符和响应返回数据,并不是所有响应报文都有响应数据
浏览器拿到响应文本 HTML 后,接下来介绍下浏览器渲染机制
浏览器解析渲染页面分为一下五个步骤:
当数据传送完毕,需要断开 tcp 连接,此时发起 tcp 四次挥手。
TCP 四次挥手的目的是:为确保收发双方数据传输的完整性。
那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。💌 资料来源:https://www.bilibili.com/read/cv9734879/
给大家推荐一个好用的BUG监控工具Fundebug,欢迎免费试用!