从浏览器(chrome)进程机制的分析到JavaScript 运行机制之二:输入URL发生了什么
上篇说到浏览器的多进程,有如下几个进程:
1.browser浏览器的主进程
2.GPU进程用3d绘制
3.第三方插件进程
4.浏览器内核(渲染)进程,一般情况一个tab一个进程,互不影响,控制页面渲染,脚本执行,事件处理。
我们来说说这个浏览器渲染进程(内核),浏览器内核是多线程的,有如下几个线程:
1.GUI线程
2.JS引擎线程
3.事件触发线程
4.定时器线程
5.网络请求线程
说明:我们的JS就是在JS引擎里面跑的,这就是JavaScript是单线程的原因。
网络请求线程:
每次网络请求需要单独请求开辟一个线程。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响应包