当用户输入url,操做系统会将输入事件传递到浏览器中,在这过程当中,浏览器可能会作一些预处理,好比 Chrome 会根据历史统计来预估所输入字符对应的网站,例如输入goog,根据以前的历史发现 90% 的几率会访问「www.google.com 」,所以就会在输入回车前就立刻开始创建 TCP 连接甚至渲染了。数据库
接着是输入url以后,点击回车,这时浏览器会对 URL 进行检查,首先判断协议,若是是 http 就按照 Web 来处理,另外还会对这个 URL 进行安全检查segmentfault
安全检查完成以后,在浏览器内核中会先查看缓存,而后设置 UA 等 HTTP 信息,接着调用不一样平台下网络请求的方法。浏览器
注意:
浏览器和浏览器内核是不一样的概念,浏览器指的是 Chrome、Firefox,而浏览器内核则是 Blink、Gecko,浏览器内核只负责渲染,GUI 及网络链接等跨平台工做则是浏览器实现的缓存
经过 DNS 查询 IP;
经过 Socket 发送数据安全
DNS,英文是Domain Name System,中文叫域名系统,是Internet的一项服务,他将域名和IP地址相互映射的一个分布式数据库服务器
假设用户在浏览器中输入的是www.google.com,大概过程:网络
若是输入的是域名,则须要进行dns查询,将域名解析成ip;app
进行DNS查询的主机或软件叫作DNS解析器,用户使用的工做站或电脑都属于解析器。域名解析就是利用DNS解析器获得对应IP过程,解析器会向域名服务器进行查询处理。tcp
主要过程以下:分布式
若是以上都没有找到,则继续往下向dns域名服务器查询
注意,
域名查询时有多是通过了CDN调度器的(若是有cdn存储功能的话)
并且,须要知道dns解析是很耗时的,所以若是解析域名过多,会让首屏加载变得过慢,能够考虑dns-prefetch优化
有了 IP 地址,就能够经过 Socket API 来发送数据了,这时能够选择 TCP 或 UDP 协议。
http本质是tcp协议。
TCP是一种面向有链接的传输层协议。他能够保证两端(发送端和接收端)通讯主机之间的通讯可达。他可以处理在传输过程当中丢包、传输顺序乱掉等异常状况;此外他还能有效利用宽带,缓解网络拥堵。
创建TCP链接一开始都要通过三次握手:
第一次握手,请求创建链接,发送端发送链接请求报文
第二次握手,接收端收到发送端发过来的报文,可知发送端如今要创建联机。而后接收端会向发送端发送一个报文第三次握手,发送端收到了发送过来的报文,须要检查一下返回的内容是不是正确的;若正确的话,发送端再次发送确认包
在TCP链接创建完成以后就能够发送HTTP请求了。能够将数据发送给服务器,并收到返回信息。
当请求结束,须要经厉链接终止协议(四次挥手)。
因为TCP链接是全双工的,所以每一个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的链接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP链接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另外一方执行被动关闭。
抽象为:
客户端:我已经关闭了向你那边的主动通道了,只能被动接收了
服务端:收到通道关闭的信息
服务端:那我也告诉你,我这边向你的主动通道也关闭了
客户端:最后收到数据,以后双方没法通讯
注意
浏览器对同一个域名有链接数限制,大部分是 6,http1.0中每每一个资源下载就须要对应一个tcp/ip请求,而像 HTTP 2.0 协议尽管只使用一个 TCP 链接来传输数据,但性能反而更好,并且还能实现请求优先级。
参考文章:
http://fex.baidu.com/blog/201...
https://blog.csdn.net/dojiang...
https://segmentfault.com/a/11...