在浏览器地址栏输入URL,按下回车之后发生了什么?

一道经典的面试题~ 这篇文章不会用来讲知识点,如果按一个问题去讲里面的知识点完全形成不了体系,这篇文章只是做一个知识点的串联、回顾,帮助缕清知识点之间的关系,形成知识脉络。

下面的回答仅针对HTTP/HTTPS协议:(毕竟浏览器还可以ftp、websocket什么的,如果各种协议都谈真没完了)
1. 浏览器检查缓存,缓存未过期一般会使用强缓存,缓存过期一般会使用协商缓存,如果协商缓存未命中或没有缓存,继续下一步。
+ 具体请参考HTTP浏览器缓存策略和服务器的缓存控制
2. 对域名进行DNS解析,如果客户机有DNS缓存,直接获得对应的IP,否则向DNS服务器发出请求解析域名,如果网站配置了CDN,会返回一个cname,指向CDN的全局负载均衡器,由智能算法为用户分配为其服务的服务器ip。如果没有配置CDN,根据网站的DNS配置返回一个IP。
+ DNS相关请参考计网复习06-应用层之域名系统DNS,CDN相关的东西我目前倒是没有写博客讲过,这里可以提一下,其实CDN的核心技术就是全局负载均衡和缓存管理,通常用于静态资源的分发(缓存代理),客户从边缘节点上取数据。和CDN性能相关的名词有命中率回源率。最近还流行一种边缘计算的技术,把计算动态资源的代码和数据也放在cdn的节点上,就可以实现在cdn里获取动态资源而不用回源站。

  1. 客户机使用IP与服务器建立TCP连接,通过TCP三次握手,建立连接之后如果是HTTPS协议还需要TLS握手,交换密码套件,通过椭圆曲线算法实现密钥交换。
    • TCP建立连接三次握手相关内容见计网复习05-传输层
    • TLS握手的详细过程我也没有写过博客,因为比较理论,我也没有那么权威,自己写不敢保证正确,复制粘贴也没有意思,不过HTTPS原理可以参考HTTPS的原理——混合加密、数字签名、CA。我这里简单提一下TLS的握手:TLS握手主要目的就是获取CA证书验证服务端身份和密钥交换,即获取后面用于对称加密的密钥。(也成为会话密钥)客户端和服务器会先协商使用同一个密码套件。密码套件的命名是密钥交换算法-签名算法-对称加密算法-分组模式-摘要算法,如ECDHE-RSA-AES256-GCM-SHA384。TLS1.2还有用RSA进行密钥交换,但由于前向安全的问题(RSA使用的公私钥是固定的,如果黑客坚持不懈的收集所有监听到的HTTPS报文,一旦有一天私钥泄露,所有之前收集的报文都能被破解),TLS1.3就完全废弃了使用RSA密钥交换,并推荐使用ECDHE密钥交换(即ECC+DH,基于椭圆曲线的离散对数问题,每次握手时都会生成一对临时的公钥和私钥,保证了前向安全)。
    • 传输层再往下的协议我觉得就没必要讲了吧?网络层找IP,数据链路层找MAC,物理层传输。
  2. 握手完成之后可以发送HTTP/HTTPS报文(对于一个复用的TCP连接我们会遇到队头阻塞等待,不过这里既然是在地址栏输入URL然后回车,肯定是第一次请求,没有这个问题),服务器收到后进行处理。(处理过程不定,如果是动态资源可能会调用后端程序),处理完成之后组成HTTP响应报文发送给客户端。
    • 网上有的博客说这里会服务器就会断开连接了??未免知识点太久远了一点了吧,HTTPS1.1就默认长连接了。关于HTTP的版本相关可以参考HTTP版本发展与Google的暗中助力
  3. 浏览器下载对应的响应数据,并对HTML(如果是)进行渲染。渲染相关的知识我也不是很清楚,应该是前端比较需要掌握的部分。

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/%e5%9c%a8%e6%b5%8f%e8%a7%88%e5%99%a8%e5%9c%b0%e5%9d%80%e6%a0%8f%e8%be%93%e5%85%a5url%ef%bc%8c%e6%8c%89%e4%b8%8b%e5%9b%9e%e8%bd%a6%e4%b9%8b%e5%90%8e%e5%8f%91%e7%94%9f%e4%ba%86%e4%bb%80%e4%b9%88/

发表评论

电子邮件地址不会被公开。