过程:
- 解析DNS为对应IP
- 向IP所对应的服务器发送请求,服务器创建线程(服务器会有一个复杂的处理过程,若为服务器组还需要考虑负载平衡等)响应并返回默认资源给予用户
- 当数据返回给浏览器的时候,若浏览器解析数据还有一些静态资源(CSS、图片等),将再次发送HTTP请求,这些请求可能在CDN(内容分发网络)上,CDN服务器会处理用户请求
DNS解析:
用户输入域名后,系统会进行如下解析操作:
- 浏览器检查缓存有无此域名对应的解析过的IP地址(缓存于浏览器的域名存在TTL,TTL太长可能导致域名对应的IP有变化而无法正确解析,太短导致用户每次访问网站都要重新解析域名),若有,解析结束,否则,转2
- 浏览器查找OS缓存(host)中有无域名对应的DNS解析结果。以上这两步也称为本地解析,若失败,则请求域名服务器(下图不包括本地解析)
- 操作系统向LDNS(local dns server)发请求,LDNS是默认设置的
- 若LDNS仍然没有命中,LDNS会直接到Root Server域名服务器请求解析
- Root Server返回给LDNS一个所查询域的主域名服务器地址。gTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台
- LDNS向上一步返回的主域名服务器发送请求
- gTLD服务器查找并返回此域名对应的Name Server域名服务器(所注册的域名服务器)的地址
- LDNS向Name Server域名服务器发起查询,接收返回的IP和TTL,缓存并返回给客户
- 客户将TTL缓存到本地缓存中,解析结束
实际DNS解析中,可能不只这几个步骤,如Name Server可能有多级,或者有一个GTM来负载均衡控制,这些都可能影响DNS解析过程
DNS解析后主要在两个地方缓存解析结果:
- LDNS
- 本地缓存
二者都是利用TTL及本地缓存大小控制的。
Windows可以使用ipconfig /flushdns刷新缓存
JAVA的域名缓存
JVM也会有DNS的解析结果,这个缓存是在InetAddress类完成的,且其会有两种缓存策略:正确结果的缓存、错误结果的缓存。
使用InetAddress解析域名最好使用单例模式,否则每次创建InetAddress都会有一次完整的域名解析,过于耗时。
推荐参考:
《深入分析javaweb技术内幕》
网友评论