用户在浏览器输入www.baidu.com这个URL到页面显示这个过程中,发生了一系统的操作:
首先,浏览器会请求DNS把这个域名解析成IP地址,然后根据这个IP地址在互联网上寻找对应的服务器,经过TCP三次握手后与服务器建立TCP连接,并根据HTTP协议向这个服务器的默认80端口发起get请求,这个服务器处理完请求后以HTTP报文格式返回默认的数据资源给访问的用户,用户接受到响应报文后浏览器根据HTML解析DOM树,加载CSS,JS图片并渲染页面,数据传输完毕后发起TCP四次挥手,断开TCP连接
实际上,在服务端还有一系列复杂的业务逻辑:服务器可能有多台,到底指定哪一台服务器到处理请求,这就需要一个负载均衡设备来平均分配所有的用户请求,如软件负载均衡常用的nginx,或硬件实现的负载均衡如F5;请求的数据可能存储在分布式缓存,还是一个静态文件,还是在数据库里;
值得注意的是,当数据返回浏览器时,浏览器解析的过程中发现一些静态资源(如CSS,JS或者图片)时,又会发起另外的HTTP请求(此时TCP连接未断开,HTTP1.1协议中默认开户持久连接,Connection: keep-alive ),而这些请求很可能会在CDN上,那么CDN服务器又会处理这个用户的请求
总体来说分为以下几个过程:
- DNS 解析:将域名解析成 IP 地址
- TCP 连接:TCP 三次握手
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面
- 断开连接:TCP 四次挥手
以上是对URL到页面显示这个过程的一个总体概括,很多可以扩展的细节文中没有提到:
如其中DNS的解析可能会经过漫长的10个步骤
TCP连接是如何建立的,三次握手四次握手工作过程
HTTP报文格式与解析过程
CDN工作机制
这样细节我会在后面专门写几篇博客介绍,敬请关注吧
参考图: