java—输入URL到展示页面

  • Post author:
  • Post category:java



目录


1.执行DNS域名解析


2.建立TCP连接(三次握手)


3.客户端发送HTTP请求


4.服务器返回资源


5.浏览器渲染页面


6.浏览器在渲染页面时获取HTML中的资源


总结


1.执行DNS域名解析

在网络中定位是依靠 IP 进行身份定位的,所以 URL 访问的第一步便是先要得到服务器端的 IP 地址。而得到服务器的 IP 地址需要使用 DNS(Domain Name System,域名系统)域名解析,DNS 域名解析就是通过 URL 找到与之相对应的 IP 地址。

DNS协议是应用层协议。


DNS域名解析流程

1

.

先检

查浏览器中的 DNS 缓存

,如果浏览器中有对应的记录会直接使用,并完成解析。

2.如果浏览器没有缓存,那就去

查询操作系统的缓存

,如果查询到记录就可以直接返回 IP 地址,完成解析。

3.如果操作系统没有 DNS 缓存,就会去

查看本地 host 文件

,Windows 操作系统下,host 文件一般位于 “C:\Windows\System32\drivers\etc\hosts”,如果 host 文件有记录则直接使用。

4.如果本地 host 文件没有相应的记录,会

请求本地 DNS 服务器。

5.如果本地 DNS 服务器没有相应的记录,最后就会

去根域名服务器查询

了,目前全球一共有 13 组根域名服务器(这里并不是指 13 台服务器,是指 13 个 ip 地址,按字母 a-m 编号),为了能更高效完成全球所有域名的解析请求,根域名服务器本身并不会直接去解析域名,而是会把不同的解析请求分配给下面的其他服务器去完成,下面是 DNS 域名系统的树状结构图:

2.建立TCP连接(三次握手)

浏览器会以一个随机端口(1024-65535)向服务端的 web 程序

80

端口发起 tcp 的连接。

(1)第一次握手:

客户端主动向服务端发送请求建立连接的报文,并进入同步已发送状态;SYN = 1 表示连接请求,SN = x 表示起始序列号,x表示一个随机生成序列号。

(2)第二次握手:

服务端收到客户端的报文之后,返回一段确认接收到请求报文并同意创建新连接的报文,并进入同步收到状态。(SYN=1, ACK=1, SN(序列号)=y,  ASN(确认序列号)=x+1)

(3)第三次握手:

客户端接收到服务端的确认报文之后,也返回一段确认报文给服务端表示自己已收到确认报文并进入建立连接状态,服务端收到确认报文后也进入建立连接状态,此时双方成功建立TCP连接。(ACK=1, SN=x+1, ASN=y+1)。

3.客户端发送HTTP请求

浏览器将用户输入的地址封装成HTTP Request请求报文,发送到服务器。


HTTP请求格式:


GET / HTTP/1.1                                        //请求行:请求方法+资源路径+HTTP版本

Accept:image/gif.image/jpeg                   //从这里开始直到空行都是请求头

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost

User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)

Accept-Encoding:gzip,deflate


//空行,用于区分请求头和请求体


username=jinqiao&password=1234         //请求体

4.服务器返回资源

服务器收到请求后,会返回响应报文,在响应体中返回相关资源

HTTP/1.1 200 OK                                 //响应行:HTTP版本+状态码+提示信息

Server:Apache/r/n                                 //从这里开始直到空行都是响应头

Content-Type:application/json

Content-Encoding:gzip/r/nxi

//空行

{“password”: “1234”,”userName”:”Tom”} //响应体

5.浏览器渲染页面


渲染过程

浏览器在解析html文件时,会”自上而下“加载,并在加载过程中进行解析渲染。在解析过程中,如果遇到请求外部资源时,如图片、外链的CSS、iconfont等,请求过程是异步的,并不会影响html文档进行加载。

解析过程中,浏览器首先会解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。这个过程比较复杂,涉及到两个概念: reflow(回流)和repain(重绘)。

DOM节点中的各个元素都是以盒模型的形式存在,这些都需要浏览器去计算其位置和大小等,这个过程称为relow;当盒模型的位置,大小以及其他属性,如颜色,字体,等确定下来之后,浏览器便开始绘制内容,这个过程称为repain。

页面在首次加载时必然会经历reflow和repain。reflow和repain过程是非常消耗性能的,尤其是在移动设备上,它会破坏用户体验,有时会造成页面卡顿。所以我们应该尽可能少的减少reflow和repain。



文档加载过程中遇到js文件

,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,才可以恢复html文档的渲染线程。因为JS有可能会修改DOM,最为经典的document.write,这意味着,在JS执行完成前,后续所有资源的下载可能是没有必要的,这是js阻塞后续资源下载的根本原因。所以我明平时的代码中,js是放在html文档末尾的。

JS的解析是由浏览器中的JS解析引擎完成的,比如谷歌的是V8。JS是单线程运行,也就是说,在同一个时间内只能做一件事,所有的任务都需要排队,前一个任务结束,后一个任务才能开始。但是又存在某些任务比较耗时,如IO读写等,所以需要一种机制可以先执行排在后面的任务,这就是:同步任务(synchronous)和异步任务(asynchronous)。

JS的执行机制就可以看做是一个主线程加上一个任务队列(task queue)。同步任务就是放在主线程上执行的任务,异步任务是放在任务队列中的任务。所有的同步任务在主线程上执行,形成一个执行栈;异步任务有了运行结果就会在任务队列中放置一个事件;脚本运行时先依次运行执行栈,然后会从任务队列里提取事件,运行任务队列中的任务,这个过程是不断重复的。

6.浏览器在渲染页面时获取HTML中的资源

在解析html时,可能会有图片、css、js等,此时浏览器会发送一个GET请求来获取这些资源。这一步骤其实是和上一步并列的。




总结

这里只是简单的说了一下流程,因为每一具体的流程牵扯到的内容很多,下面列出比较重要的点:

1.关于DNS域名解析的流程。

2.TCP三次握手的原理,以及握手时的状态变化、异常、还是一些提高可靠性的措施等

3.关于http请求格式,以及提交的方法的区别 。

4.当请求到达服务器时,tomcat时怎么一步步解析得到请求参数的。

5.关于响应码。

6.对于js中的ajax的请求的流程等。



版权声明:本文为m0_58196614原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。