游览器是如何工作的

浏览器的主要功能

浏览器的主要功能是将用户选择得web资源呈现出来,它需要从服务器请求资源,并将其显示在浏览器窗口中,资源的格式通常是HTML,也包括PDF、image及其他格式。

浏览器的主要构成

  1. 用户界面- 包括地址栏、后退/前进按钮、书签目录等,也就是你所看到的除了用来显示你所请求页面的主窗口之外的其他部分。
  2. 浏览器引擎- 用来查询及操作渲染引擎的接口。
  3. 渲染引擎- 用来显示请求的内容,例如,如果请求内容为html,它负责解析html及css,并将解析后的结果显示出来。
  4. 网络- 用来完成网络调用,例如http请求,它具有平台无关的接口,可以在不同平台上工作。
  5. UI 后端- 用来绘制类似组合选择框及对话框等基本组件,具有不特定于某个平台的通用接口,底层使用操作系统的用户接口。
  6. JS解释器- 用来解释执行JS代码。
  7. 数据存储- 属于持久层,浏览器需要在硬盘中保存类似cookie的各种数据,HTML5定义了web database技术,这是一种轻量级完整的客户端存储技术。

一次网络请求浏览器发生了什么:

  1. 用户输入url点击回车后,浏览器查看自身的DNS缓存,如果请求的内容在缓存之中并且是在存活时限之内
  2. 浏览器会向操作系统询问该请求对应的IP地址:
    操作系统会去查找系统自身的DNS缓存,如果还没找到,那么在本地的host文件中查找是否存在对应的IP,如果有,就先调用这个IP地址映射,完成域名解析。如果还找不到就会询问DNS服务器。
  3. 首先操作系统会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询指令时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
    如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(http://qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找(http://qq.com)域服务器,重复上面的动作,进行查询,直至找到www . qq .com主机。
    如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管本地DNS服务器用的是转发,还是根提示,最后都是把结果返回给本地DNS服务器,再由DNS服务器再返回给客户机。

从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。

  1. TCP三次握手建立连接:
    拿到域名对应的IP地址之后,浏览器会以一个随机端口(1024<端口<65535)向服务器的WEB程序的80端口(处于监听状态)发起连接请求报文(SYN = 1,ACK = 0,一个初始的序号x),这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间有各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终达到WEB程序,服务器收到连接请求报文,如果同意建立连接,则向浏览器发送连接确认报文(SYN = 1,ACK = 1,确认号为x + 1,同时也选择一个初始的序号y)。浏览器收到服务器的连接确认报文后,还要向B发出确认(确认号为y + 1,序号为x + 1)。服务器收到浏览器的确认后,最终建立了TCP/IP的连接
  2. 建立TCP连接之后,发起HTTP请求
    TCP连接建立后,浏览器向服务器发送HTTP请求报文(由三部分组成:请求行,请求头和请求正文)。
  3. 服务器端响应http请求,浏览器得到html代码
    服务器向浏览器返回HTTP响应报文(由三部分组成:状态码,响应头和实体内容),
    html资源文件不是通过 HTTP响应直接返回去的,是nginx通过io操作去拿到的(Nginx在收到浏览器GET请求时,会读取http请求里面的头部信息,根据Host来匹配自己的所有的虚拟主机的配置文件的server_name,看看有没有匹配的,有匹配那么就读取该虚拟主机的配置,通过这个配置就知道所有的网页文件就在这个目录下,nginx就会自动帮我们把/index.html加到url后面, nginx把/index.php这个URL交给了后端的fastcgi进程处理,等待fastcgi处理完成后(结合数据库查询出数据,填充模板生成html文件)返回给nginx一个index.html文档,Nginx再把这个index.html返回给浏览器,于是乎浏览器就拿到了首页的html代码,同时nginx写一条访问日志到日志文件中去。更详细的描述参照:(https://blog.csdn.net/u014600626/article/details/78720763)
    浏览器接收到HTTP响应,如果选择关闭连接,会进行TCP的四次挥手。
    TCP的四次挥手:
    第一次挥手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN=1报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
    第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Ack为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
    第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
    第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那么,主机1也可以关闭连接了。
  4. 浏览器解析html代码,并请求html代码中的资源
    浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这是时候就用上 keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里面的顺序,但是由于每个资源大小不一样,而浏览器又是多线程请求请求资源,所以这里显示的顺序并不一定是代码里面的顺序。
  5. 浏览器对页面进行渲染呈现给用户
    最后,浏览器利用自己内部的工作机制,把请求的静态资源和html代码进行渲染,渲染之后呈现给用户。

如果请求使用了HTTPS那么流程会有什么不同?

HTTPS是为了保证HTTP的安全性而在HTTP的基础上加入加密处理和认证等机制。通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳HTTP。HTTPS使用了混合加密的方式。用非对称加密传输共享密钥,然后用共享密钥进行对称加密传输。
步骤 1:客户端通过发送Client Hello报文开始SSL通信。报文中包含客户端支持的SSL的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。
步骤 2: 服务器可进行SSL通信时,会以Server Hello报文作为应答。和客户端一样,在报文中包含SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
步骤 3: 之后服务器发送Certificate报文。报文中包含公开密钥证书。
步骤 4: 最后服务器发送Server Hello Done报文通知客户端,最初阶段的 SSL 握手协商部分结束。
步骤 5: SSL 第一次握手结束之后,客户端以Client Key Exchange报文作为回应。报文中包含通信加密中使用的一种被称为Pre-mastersecret的随机密码串。该报文已用步骤3中的公开密钥进行加密。
步骤 6: 接着客户端继续发送Change Cipher Spec报文。该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密钥加密。
步骤 7: 客户端发送Finished报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
步骤 8: 服务器同样发送Change Cipher Spec报文。
步骤 9: 服务器同样发送Finished报文。
步骤 10: 服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到SSL的保护。从此处开始进行应用层协议的通信,即发送HTTP请求。
步骤 11: 应用层协议通信,即发送HTTP响应。
步骤 12: 最后由客户端断开连接。断开连接时,发送close_notify报文。上图做了一些省略,这步之后再发送TCP FIN报文来关闭与TCP的通信。

总结

一次网页请求:首先在的DNS缓存(浏览器DNS缓存,本机DNS缓存,本地host文件,DNS服务器缓存)中进行查找,没有的话,就进行域名解析,获得目标主机的IP地址,浏览器与服务器三次握手建立连接,浏览器发送请求,服务器做出响应,浏览器解析html代码,将页面进行渲染呈现给用户,如不再需要数据,则四次挥手断开连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值