用户输入url当用户输入url时,操作系统会将输入事件传递给浏览器。在这个过程中,浏览器可能会做一些预处理,比如Chrome会根据历史统计来估计输入的字符对应的网站。比如你输入goog,发现之前90%的历史都会访问“www.google.com”,所以在输入回车前会立即开始构建TCP连接甚至渲染。然后,输入url后,点击回车。这时候浏览器就会检查这个URL。首先,它会判断协议。内核会先检查缓存,然后设置UA等HTTP信息,然后在不同平台下调用网络请求的方法。注意:浏览器和浏览器内核是不同的概念。浏览器是指Chrome和Firefox,浏览器内核是指Blink和Gecko。浏览器内核只负责渲染,GUI、网络连接等跨平台工作在浏览。服务器实现的http网络请求通过DNS查询IP;通过Socketdns发送数据查询ipDNS,英文是DomainNameSystem,中文叫DomainNameSystem,是互联网的一项服务。它是一个将域名和IP地址相互映射的分布式数据库。假设用户在浏览器中输入www.google.com,一般过程:如果输入的是域名,则需要进行dns查询,将域名解析为ip;进行DNS查询的主机或软件称为DNS解析器,用户使用的工作站或计算机为解析器。域名解析就是使用DNS解析器获取对应IP的过程,解析器会查询域名服务器进行处理。主要过程如下:从浏览器缓存中找到域名www.google.com的IP地址。如果在浏览器缓存中没有找到域名www.google.com的IP地址,就会去操作系统缓存中查找。这一步也会搜索本机的hosts,看有没有对应关系如果域名映射(当然已经缓存在系统DNS缓存里了)系统里没有,去你的路由器上找它,因为路由器一般也有自己的DNS缓存。如果以上都没有找到,则继续往下dns域名服务器查询用户电脑的解析器到LDNS(即LocalDNS,InternetServiceProviderISP),发起域名解析请求,查询到的IP地址www.google.com。这是一个未能命中缓存的递归搜索过程。在这种情况下,LDNS从根域名服务器查询www.google.com的IP地址。LDNS的查询过程是一个迭代的查询过程。root告诉LDNS,我不知道www.google.com对应的IP地址,但是我知道你可以去问com域的权威服务器,这个域是他的LDNS向com授权服务器要IP地址对应www.google.com告诉com,我不知道www.google.com对应的IP地址,但是我知道你可以问问google.com域的授权服务器,属于他的。LDNS向google.com的授权服务器请求www.google.com对应的IP地址。google.com查询自己的ZONE文件(也称为区域文件记录),并找到www..google.com对应的IP地址返回一条记录到LDNSLDNS本地缓存,并将结果返回给用户电脑的解析器。之后,用户电脑的解析器得到结果,缓存到自己操作系统的DNS缓存中。同时返回给浏览器,浏览器仍然会缓存一段时间。注意域名查询可能会经过CDN调度器(如果有cdn存储功能的话)。而且,要知道dns解析是比较耗时的,所以如果解析的域名太多,首屏加载会很慢,可以考虑dns-prefetch来优化tcp/ip请求。有了IP地址,就可以通过SocketAPI发送数据了。这时候,你可以选择TCP或者UDP协议。http的本质是tcp协议。TCP是面向连接的传输层协议。他可以保证通信主机之间的两端(发送端和接收端)之间的通信是可达的。能够处理传输过程中丢包、传输顺序乱序等异常情况;此外,它还可以有效地利用宽带来缓解网络拥塞。TCP连接的建立一开始需要三次握手:第一次握手,请求建立连接,发送方发送连接请求报文,第二次握手,接收方收到发送方发送的报文。可见发送方现在是建立在线。然后接收端会发送消息给发送端进行第三次握手。发送端已收到发送的消息,需要检查返回的内容是否正确;如果正确,发送端会在TCP连接中再次发送确认包,建立完成后,就可以发送HTTP请求了。可以将数据发送到服务器并返回信息。当请求结束时,需要经过连接终止协议(四次挥手)。由于TCP连接是全双工的,每个方向都必须单独关闭。原理是当一方完成自己的数据发送任务后,可以发送一个FIN来终止这个方向的连接。收到FIN只代表这个方向没有数据流,TCP连接收到FIN后仍然可以发送数据。先关闭的一方将执行主动关闭,而另一方将执行被动关闭。抽象为:Client:我已经关闭了对你的主动通道,我只能被动接收。服务器:收到通道关闭的消息。服务器:那我告诉你,我给你的主动通道客户端也关闭了:数据终于收到了,然后双方就无法通信了。注意浏览器对同一个域名的连接数有限制,大部分是6个。在http1.0中,一次资源下载往往需要对应一个tcp/ip请求,而虽然HTTP2.0等协议只使用一个TCP连接传输数据,性能更好,也可以实现请求优先级。参考文章:http://fex.baidu.com/blog/201...https://blog.csdn.net/dojiang...https://segmentfault.com/a/11...
