摘要: 经典面试题。javascript
Fundebug经受权转载,版权归原做者全部。html
打开浏览器从输入网址到网页呈如今你们面前,背后到底发生了什么?经历怎么样的一个过程?先给你们来张整体流程图,具体步骤请看下文分解!前端
本文首发地址为GitHub 博客,写文章不易,请多多支持与关注!java
整体来讲分为如下几个过程:nginx
URL(Uniform Resource Locator),统一资源定位符,用于定位互联网上资源,俗称网址。好比 www.w3school.com.cn/ht...,遵照如下的语法规则:git
scheme://host.domain:port/path/filename
复制代码
各部分解释以下:github
在浏览器输入网址后,首先要通过域名解析,由于浏览器并不能直接经过域名找到对应的服务器,而是要经过 IP 地址。你们这里或许会有个疑问----计算机既能够被赋予 IP 地址,也能够被赋予主机名和域名。好比 www.hackr.jp
。那怎么不一开始就赋予个 IP 地址?这样就能够省去解析麻烦。咱们先来了解下什么是 IP 地址web
IP 地址是指互联网协议地址,是 IP Address 的缩写。IP 地址是 IP 协议提供的一种统一的地址格式,它为互联网上的每个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差别。IP 地址是一个 32 位的二进制数,好比 127.0.0.1 为本机 IP。面试
域名就至关于 IP 地址乔装打扮的假装者,带着一副面具。它的做用就是便于记忆和沟通的一组服务器的地址。用户一般使用主机名或域名来访问对方的计算机,而不是直接经过 IP 地址访问。由于与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。但要让计算机去理解名称,相对而言就变得困难了。由于计算机更擅长处理一长串数字。为了解决上述的问题,DNS 服务应运而生。redis
DNS 协议提供经过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。DNS 是一个网络服务器,咱们的域名解析简单来讲就是在 DNS 上记录一条信息记录。
例如 baidu.com 220.114.23.56(服务器外网IP地址)80(服务器端口号)
复制代码
浏览器经过向 DNS 服务器发送域名,DNS 服务器查询到与域名相对应的 IP 地址,而后返回给浏览器,浏览器再将 IP 地址打在协议上,同时请求参数也会在协议搭载,而后一并发送给对应的服务器。接下来介绍向服务器发送 HTTP 请求阶段,HTTP 请求分为三个部分:TCP 三次握手、http 请求响应信息、关闭 TCP 链接。
在客户端发送数据以前会发起 TCP 三次握手用以同步客户端和服务端的序列号和确认号,并交换 TCP 窗口大小信息。
谢希仁著《计算机网络》中讲“三次握手”的目的是“为了防止已失效的链接请求报文段忽然又传送到了服务端,于是产生错误”。
TCP 三次握手结束后,开始发送 HTTP 请求报文。
请求报文由请求行(request line)、请求头(header)、请求体四个部分组成,以下图所示:
POST /chapter17/user.html HTTP/1.1
复制代码
以上代码中“POST”表明请求方法,“/chapter17/user.html”表示 URL,“HTTP/1.1”表明协议和协议的版本。如今比较流行的是 Http1.1 版本
请求头部通知服务器有关于客户端请求的信息。它包含许多有关的客户端环境和请求正文的有用信息。其中好比:Host,表示主机名,虚拟主机;Connection,HTTP/1.1 增长的,使用 keepalive,即持久链接,一个链接能够发多个请求;User-Agent,请求发出者,兼容性以及定制化需求。
name=tom&password=1234&realName=tomson
复制代码
上面代码,承载着 name、password、realName 三个请求参数。
给你们推荐一个好用的 BUG 监控工具Fundebug,欢迎免费试用!
服务器是网络环境中的高性能计算机,它侦听网络上的其余计算机(客户机)提交的服务请求,并提供相应的服务,好比网页服务、文件下载服务、邮件服务、视频服务。而客户端主要的功能是浏览网页、看视频、听音乐等等,二者大相径庭。 每台服务器上都会安装处理请求的应用——web server。常见的 web server 产品有 apache、nginx、IIS 或 Lighttpd 等。 web server 担任管控的角色,对于不一样用户发送的请求,会结合配置文件,把不一样请求委托给服务器上处理相应请求的程序进行处理(例如 CGI 脚本,JSP 脚本,servlets,ASP 脚本,服务器端 JavaScript,或者一些其它的服务器端技术等),而后返回后台程序处理产生的结果做为响应。
后台开发如今有不少框架,但大部分都仍是按照 MVC 设计模式进行搭建的。
MVC 是一个设计模式,将应用程序分红三个核心部件:模型(model)-- 视图(view)--控制器(controller),它们各自处理本身的任务,实现输入、处理和输出的分离。
一、视图(view)
它是提供给用户的操做界面,是程序的外壳。
二、模型(model)
**模型主要负责数据交互。**在 MVC 的三个部件中,模型拥有最多的处理任务。一个模型能为多个视图提供数据。
三、控制器(controller)
**它负责根据用户从"视图层"输入的指令,选取"模型层"中的数据,而后对其进行相应的操做,产生最终结果。**控制器属于管理者角色,从视图接收请求并决定调用哪一个模型构件去处理请求,而后再肯定用哪一个视图来显示模型处理返回的数据。
这三层是紧密联系在一块儿的,但又是互相独立的,每一层内部的变化不影响其余层。每一层都对外提供接口(Interface),供上面一层调用。
至于这一阶段发生什么?简而言之,首先浏览器发送过来的请求先通过控制器,控制器进行逻辑处理和请求分发,接着会调用模型,这一阶段模型会获取 redis db 以及 MySQL 的数据,获取数据后将渲染好的页面,响应信息会以响应报文的形式返回给客户端,最后浏览器经过渲染引擎将网页呈如今用户面前。
响应报文由响应行(request line)、响应头部(header)、响应主体三个部分组成。以下图所示:
(1) 响应行包含:协议版本,状态码,状态码描述
状态码规则以下:
(2) 响应头部包含响应报文的附加信息,由 名/值 对组成
(3) 响应主体包含回车符、换行符和响应返回数据,并非全部响应报文都有响应数据
浏览器拿到响应文本 HTML 后,接下来介绍下浏览器渲染机制
浏览器解析渲染页面分为一下五个步骤:
当数据传送完毕,须要断开 tcp 链接,此时发起 tcp 四次挥手。
Fundebug专一于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有Google、360、金山软件、百姓网等众多品牌企业。欢迎你们免费试用!