本文总结自《深入分析Java Web技术内幕》一书。全篇内容大致先从一个面试经常问及的问题说起,然后再介绍各个主要过程。
一个面试问题
输入一个网址,到看到页面,经历了哪些过程?
这个问题大致可以回答这几点:DNS域名解析、发起HTTP请求、负载均衡、缓存、CDN等。
下面是书里的一段话,我觉得能够很好地回答这个问题了:
首先会请求DNS把这个域名解析出对应的IP地址,然后根据这个IP地址在互联网上找到对应的服务器,向这个服务器发起一个get请求,由这个服务器决定返回默认的数据资源给访问的用户。在服务器端实际上还有很复杂的业务逻辑:服务器可能有很多台,到底指定哪台服务器来处理请求,这需要一个负载均衡设备来平均分配所有用户的请求;还有请求的数据是存储在分布式缓存里还是一个静态文件中,或者是在数据库里;当数据返回浏览器时,浏览器解析数据发现还有一些静态资源(如CSS、JS或者图片)时又会发起另外的HTTP请求,而这些请求很可能会在CDN上,那么CDN服务器又会处理这个用户的请求。
发起HTTP请求
发起HTTP请求就是建立一个Socket连接,浏览器在建立Socket连接之前,必须根据地址栏里输入的URL的域名DNS解析出IP地址,再根据这个IP地址和默认的80端口与远程服务器建立Socket连接,然后浏览器根据这个URL组装成一个get类型的HTTP请求头,通过outputStream.write发送到目标服务器,服务器等待inputStream.read返回数据,最后断开这个连接。
总结:发起一个HTTP请求的过程就是建立一个Socket通信的过程。
DNS域名解析
- 浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。浏览器缓存域名是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,域名被缓存的时间限制可以通过TTL属性来设置。
- 如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。
- 如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名。在这一步中,操作系统会把这个域名发送给LDNS,即本地区的域名服务器。这个域名解析服务器一般都会缓存域名解析结果,80%的域名解析都到这里就能够完成,所以LDNS主要承担了域名的解析工作。
- 如果LDNS仍然没有命中,再到Root Server域名服务器请求解析。
- 根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址。
- 本地域名服务器(Local DNS Server)再向上一步返回的gTLD服务器发送请求。
- 接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器。
- Name Server域名服务器会查询存储的域名和IP的映射关系表。
- 返回该域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存时间由TTL值控制。
- 把解析结果返回给用户,域名解析过程结束。
DNS域名解析图如下(省略第一、二步在本机完成的过程):
CDN
CDN就是内容分布网络(Content Delivery Network)。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网络的响应速度。
CDN都以缓存网站中的静态数据为主,如CSS、JS、图片和静态页面等数据,用户在从主站服务器请求到动态内容后,再从CDN上下载这些静态数据,从而加速网页数据内容的下载速度。
拿到DNS解析结果,用户就直接去这个CDN节点访问这个静态文件了,如果这个节点中所请求的文件不存在,就会再回到源站去获取这个文件,然后再返回给用户。
负载均衡
负载均衡(Load Balance)就是对工作任务进行平衡、分摊到多个操作单元上执行,如图片服务器、应用服务器等,共同完成工作任务。它可以提高服务器响应速度及利用效率,避免软件或者硬件模块出现单点失效,解决网络拥塞问题,实现地理位置无关性,为用户提供较一致的访问质量。通常有三种负载均衡架构,分别是链路负载均衡、集群负载均衡和操作系统负载均衡。