深入Web请求过程
总阅读次
URL请求过程
当用户在browser里面输入url时,将会发生很多操作,首先查找本地的host文件有没有对应的url配置,如果有则请求该ip,否则请求DNS服务器解析该域名获取对应的ip地址,然后根据该IP地址找到服务器,向这个服务器发送一个get请求,由这个服务器返回数据给用户。在服务器端还有很复杂的业务逻辑:服务器可能有多台,到底指定那台服务器来处理请求,这需要一个负载均衡设备来平均分配所有用户的请求;还有请求的数据是存储在分布式缓存还是静态文件中,或者在数据库里;当数据返回浏览器时,浏览器解析数据发现还有一些静态资源(如CSS、JS或者图片)时又会发起另外的http请求,而这些请求很可能会在CDN上,那么CDN服务器又会处理这个用户的请求。
DNS域名解析过程
第一步,浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果有,这个解析过程就结束。
第二步,如果用户的浏览器缓存中没有,浏览器会查找操作系统中是否有这个域名对应的DNS解析结果。在Windows中可以通过C:\Windows\System32\drivers\etc\hosts
文件来设置,Linux在/etc/hosts
文件中配置。
前面这两个步骤都是在本机完成,如果本机无法完成域名的解析,就会真正请求域名服务器来解析这个域名。
第三步,通过查找网络配置的DNS服务器,解析域名对应的IP,这里的DNS服务器称为LDNS。
第四步,如果LDNS没有命中,就直接到Root Server域名服务器请求解析。
跟踪域名解析过程
在Linux系统可以使用dig
命令来查询DNS的解析过程,如下:
第一行输出了当前Linux的版本号,第二行可以增加可选参数 cmd
,加上 cmd
打印的结果如下:
|
|
QUESTION SECTION
部分表示当前查询的域名是一个A记录,ANSWER SECTION
部分返回了这个域名由CNAME到www.taobao.com.danuoyi.tbcache.com
,返回了这个域名对应的IP
还可以通过增加+trace参数跟踪域名的解析过程,如下
上面清除的展现了域名是如何发起和解析的
清除缓存的域名
DNS域名解析会缓存解析结果,其中主要在两个地方缓存结果,一个Local DNS Server,另一个是用户的本地机器。这两个缓存都是TTL值和本机缓存大小控制的。Local DNS Server的缓存我们控制不了,但是我们本机的缓存可以通过如下方式清除
在Windows下可以在命令行模式下执行 ipconfig /flushdns
命令来刷新缓存。
在Linux下通过 /etc/init.d/nscd restart
来清理缓存。
CDN工作机制
CDN也就是内容分别网络(Content Delivery Network),它是构筑在Internet上的一种先进的流量分配网络,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需要的内容,提高用户访问网站的响应速度。有别于镜像,比镜像更加智能,可以做这样的比喻:CDN=镜像+缓存+整体负载均衡
负载均衡
负载均衡(Load Balance)就是对工作任务进行平衡、分摊到多个操作单元执行,如图片服务器、应用服务器等,共同完成工作任务。通常有三种负载均衡架构,分别是:
链路负载均衡
链路负载均衡就是通过NDS解析成不同的IP,然后用户根据这个IP来访问不同的目标服务器;负载均衡是由DNS的解析来完成。这种DNS解析的优点是用户直接访问目标服务器,而不需要经过其他的代理服务器,通常速度比较快。但是也有缺点,由于DNS在用户本地和Local DNS Server 都有缓存,一旦某台Web Server挂掉,就很难及时更新用户的域名解析结构。导致用户无法访问该域名
集群负载均衡
集群负载均衡,分为硬件负载均衡和软件负载均衡。硬件负载均衡一般使用专门的硬件设备来转发请求,这台硬件设备是关键一般都比较昂贵,如F5,它的优点就是性能非常好,缺点就是非常贵。
软件负载均衡是使用最普遍的一种负载方式,它的特点是使用成本非常低,直接使用廉价的PC就可以搭建,缺点就是一般一次访问请求需经过多次代理服务器,会增加网络的延时。
操作系统负载均衡
操作系统负载均衡,就是利用操作系统级别的软中断和硬件中断达到负载均衡,如可以设置多队列网卡实现
CDN动态加速
CDN动态加速是在CDN的DNS解析中通过动态的链路探测来寻找回源最好的一条路径。