从浏览器(chrome)进程机制的分析到JavaScript 运行机制之二:输入URL发生了什么

上篇说到浏览器的多进程,有如下几个进程:

1.browser浏览器的主进程

2.GPU进程用3d绘制

3.第三方插件进程

4.浏览器内核(渲染)进程,一般情况一个tab一个进程,互不影响,控制页面渲染,脚本执行,事件处理。

从浏览器(chrome)进程机制的分析到JavaScript 运行机制之二:输入URL发生了什么

 

我们来说说这个浏览器渲染进程(内核),浏览器内核是多线程的,有如下几个线程:

1.GUI线程

2.JS引擎线程

3.事件触发线程

4.定时器线程

5.网络请求线程

 

说明:我们的JS就是在JS引擎里面跑的,这就是JavaScript是单线程的原因。

从浏览器(chrome)进程机制的分析到JavaScript 运行机制之二:输入URL发生了什么

 

网络请求线程:

每次网络请求需要单独请求开辟一个线程。URL解析到HTTP协议,就会请求下载网路资源

请求一个http协议之前会经过,dns查询,tcp/ip请求,tcp/ip协议族等等。

 输入域名的话需要DNS解析,域名解析:

1.若浏览器有缓存则解析,否则到本机解析,若还没有,则到host解析

2.若本地都没有就向dns域名服务进行查询解析IP(经过的路由也有缓存)

说明:

1.域名查询是很费时间的,域名解析加载过多,会造成首屏加载过慢

2.域名查询可能会经过CDN调度器

 

HTTP请求

http请求本质是tcp/ip请求

浏览器对同一域名下并发的tcp连接是有限制的(2-10个不等)

 

get/post的区别:

get和post本质上面都是tcp/ip,但两者不仅在http协议层有区别,在tcp/ip层也有区别。

get产生一个数据包,post产生两个数据包。

 

1.get请求,浏览器会把headers和data一起发送出去,server响应200

2.post请求,浏览器会先发送headers,server响应100 continue,浏览器在发送data,服务器响应200

 

服务器收到请求到对应后台接受:

负载均衡:

大型的项目由于并发量很大,往往会有很多服务器组装成一个集群,然后配合反向代理实现负载均衡

用户发起的请求都指向调度服务器(反向代理服务器,如nginx控制均衡负载),然后调度服务器根据实际的调度算法,分配不同的请求给对应集群中的服务器执行,然后调度器等待实际服务器的http响应,并将它反馈给用户

 

后台处理:

一般后台都是部署到相关的web容器中:

1.web容器接受到请求(tomcat等)

2.然后对应的web容器的后台程序接收到请求(C#,C/C++,java等等)

3.后台统一处理,处理完后响应结果

例如:

1.后台统一验证,如安全拦截,跨域验证

2.验证不通过,返回http报文

3.验证通过,后台程序接收请求,然后执行相关操作,如查库,计算等等

4.执行完,返回一个http响应包