web请求过程,DNS, CDN

看深刻分析javaweb技术内幕,作个摘抄总结html

B/S(Browser/Server)网络架构,基于统一的应用层协议HTTP来交互数据,HTTP采用无状态的短链接的通讯方式,一般状况下,一次请求就完成了一次数据交互,也对应一个业务逻辑。而后链接就断开了。这种状况下,相比长连接,服务器可以同时服务更多的用户。java

B/S架构大多要求知足海量用户的访问请求,同时保持用户请求的快速响应。linux

请求流程以下:

1,用户浏览器输入URL,www.xx.com。
2,浏览器请求DNS把这个URL的域名部分(www.xx.com)解析成对应的IP。
3,浏览器经过ip去寻找对应的服务器地址,向服务器发起一个get请求。
4,这时的服务器地址,多是一个负载均衡设备,负责平均分配全部用户的请求,指定真实处理请求的服务器,好比Tomcat/Jetty/JBoos服务器
5,Tomcat/Jetty/JBoos服务器收到请求后,会对请求须要的数据类型进行判断,是存储在分布式缓存(好比redis)里,仍是静态文件(文件系统)中,仍是数据库中,去获取对应的数据后,把处理好的数据返回给浏览器。
6,浏览器接收到数据,而且解析,解析数据的时候可能会发现,还须要一些静态资源,(如CSS,JS或者图片),因而又再次发起HTTP请求,重复3-4的过程。
7,服务器这时候把请求经过反向代理,交由CDN去完成静态资源的请求。
8,浏览器接收并缓存静态资源。web

HTTP解析

常见的HTTP请求头redis

请求头 说明
Accept-Charset 用于指定客户端接受的字符集
Accept-Encoding 用于指定可接受的内容编码,如Accept-Encoding:gzip.deflate
Accept-Language 用于指定一种天然语言,如 Accept-Language:zh-cn
Host 用于指定被请求资源的Internet主机和端口号,如Host:www.taobao.com
User-Agent 客户端将它的操做系统,浏览器和其余属性告诉服务器
Connection 当前链接是否保持,如Connection:Keep-Alive

常见的HTTP响应头数据库

响应头 说明
Server 使用的服务器名称,如Server:Apache/1.3.6(Unix)
Content-Type 用来指明发送给接受者的实体正文的媒体类型,如Content-Type:text/html;charset=GBK
Content-Encoding 与请求头Accept-Encoding相对应,告诉浏览器服务器采用的是什么压缩编码
Content-Language 描述了资源所用的天然语言,与Accept-Language相对应
Content-Length 指明实体正文的长度,用以字节方式存储的十进制数字来表示
Keep-Alive 保持链接的时间,如Keep-Alive:timeout=5,max=120

常见的HTTP状态码windows

状态码 说明
200 客户端请求成功
302 临时跳转,跳转的地址经过Location指定
400 客户端请求有语法错误,不能被服务器识别
403 服务器收到请求,可是拒绝提供服务
404 请求的资源不存在
500 服务器发生不可预期的错误

浏览器缓存机制

CTRL+F5刷新的页面必定是最新的,由于是直接向目标URL发送请求,而不是用浏览器的缓存数据;而且会在HTTP请求头中增长额外的请求头
来告诉服务端咱们要获取的是最新的数据而不是缓存,好比请求头Pragam:no-cache 和 Cache-Control:no-cache。后端

1,Pragam 和 Cache-Control的可选字段列表:浏览器

可选值 说明
Public 全部的内容都将被缓存,在响应头中设置
Private 内容只缓存到私有缓存中,在响应头中设置
no-cache 全部内容都不会被缓存,在请求头和响应头中设置
no-store 全部内容都不会被缓存到缓存或Internet临时文件中,在响应头中设置
must-revalidation/proxy-revalidation 若是缓存内容失效,请求必须发送到服务器/代理以进行从新验证,在请求头中设置
max-age=xxx 缓存的内容将在xxx秒后失效,这个选项只在Http1.1中可用,和Last-Modified一块儿使用时优先级较高,在响应头中设置

Cache-Control的优先级比较高,若是Cache-Control和其余的一些请求字段(好比Expires)同时出现,Cache-Control会覆盖其余字段。缓存

2,Expires请求字段:
一般格式是 Expires:Sat,25 Feb 2012 12:22:17 GMT, 浏览器在发送请求以前检查这个页面的字段,看该页面是否已通过期了,若是过时,就向服务端从新发起请求。

3,Last-Modified字段通常用于表示一个服务器上的资源的最后修改时间,若是是静态内容会自动加上Last-Modified字段,若是是动态内容,好比Servlet提供了getLastModified方法用来检查某个动态内容是否已经更新。经过这个最后修改时间能够判断当前请求的资源是不是最新的。
具体步骤:
服务端在响应头中返回一个Last-Modified字段 Last-Modified:Sat,25 Feb 2012 12:22:17 GMT, 浏览器在再次请求的时候,在请求头中真假一个 If-Modified-Since::Sat,25 Feb 2012 12:22:17 GMT字段,询问当前缓存的页面是不是最新的,若是是就返回304状态码,服务器就不会传输新的数据给浏览器。

4,Etag字段,与Last-Modified字段类型,这个字段做用是让服务端给每一个页面分配一个惟一的编号,而后经过编号来区分当前的页面是不是最新的,这个方式比Last-Modified灵活,可是在分布式的状况下,后端有多台web服务器,就比较难以处理了,由于须要每台服务器都记住全部资源的编号

DNS域名解析过程 #87

DNS负责把域名解析成ip

名词解释:TTL值全称是“生存时间(Time To Live)”,简单的说它表示DNS记录在DNS服务器上缓存时间。

1,浏览器检查缓存中有没有域名对应的ip地址,有,解析结束; 没有,进入下一步; 浏览器缓存域名是有缓存大小,缓存时间限制的,缓存时间一般设定在几分钟到几小时不等,时间过短请求频繁,时间太长不利于及时更新可能致使用户没法访问。能够经过TTL属性来设置

2,浏览器查找操做系统中是否有这个域名对应的DNS解析结果。有,解析结束;没有,进入下一步;系统盘中的hosts文件就是设置域名:ip映射关系的位置之一 c:\windows\system32\drivers\etc\hosts,很容易被黑客劫持。

3,操做系统把域名发送给本地域名服务器Local DNS),这个域名服务器通常是应用提供商(ISP,好比电信\联通\移动)提供的,一般服务器在用户所在城市的某个角落,或者校园网的DNS服务器就在学校范围内,总之不会太远。一般80%的域名解析到这里就能结束了。Local DNS承担了主要的域名解析工做。
Windows环境下经过命令行输入ipconfig,Linux环境下经过cat /etc/resolv.conf就能够查询配置的DNS服务器了,这个专门的域名解析服务器性能都会很好,它们通常都会缓存域名解析结果,固然缓存时间是受到域名的失效时间控制的。

4,LDNS仍然没有命中,就直接到Root Server域名服务器根域名服务器)请求解析。根域名服务器返回给本地域名服务器一个所查询的主域名服务器(gTLD Server)地址。gTLD是国际顶级域名服务器,如.com、.cn、.org等。

五、本地域名服务器(Local DNS)向gTLD服务器发送请求, 接受请求的gTLD服务器查找并返回此域名对应的域名服务器(Name Server)的地址;一般就是用户申请/注册域名时候,对应的那个域名服务器提供商的服务器。

八、LDNS查询域名服务器(Name Server),域名服务器会查询存储的域名和IP的映射关系表,在正常状况下都根据域名获得目标IP地址,连同一个TTL值返回给DNS

九、LDNS获得该域名对应的IP和TTL值,LDNS会缓存这个域名和IP的对应关系,缓存时间由TTL值控制

十、LDNS把解析的结果返回给浏览器,浏览器根据TTL值缓存在本地系统缓存中,域名解析过程结束。

在实际的DNS解析过程当中,可能还不止这10步,如Name Server可能有不少级,或者有一个GTM来负载均衡控制,这都有可能会影响域名解析过程。

刷新域名缓存:清除,刷新缓存
在windows: “ipconfig/flushdns”
在linux下经过 /etc/init.d/nscd restart

JAVA中
Java应用中,JVM也会缓存DNS的解析结果, 这个缓存是在InetAddress类中完成的,
有两种缓存策略
1,正确解析结果缓存,配置项为 networkaddress.cache.ttl 默认值是-1(永不失效)
2,失败解析结果缓存,配置项为 networkaddress.cache.negative.ttl 默认值是10(缓存10秒)
在lib/security/java.security文件中,在java启动参数中增长-Dsum.net.inetaddr.ttl=xxx都可配置,也能够经过InetAddress类动态修改。
InetAddress必须用单例模式,由于初始化须要进行一次完整的域名解析,很是耗时。

域名解析记录
A记录:A表明的是Address,用来制定域名对应的ip地址, A记录能够将多个域名解析到一个ip地址,可是不能将一个域名解析到多个ip地址。
MX记录:Mail Exchange,能够将某个域名下的邮件服务器指向本身的Mail Server。 好比www.taobao.com可能指向115.238.25.111的A纪录地址,而xxx@taobao.com就会指向配置的MX记录地址,DNS会把xxx@taobao.com地址发送到MX记录所记录的ip.
CNAME记录:全称是Canonical Name(别名解析),就是能够为域名设置一个或多个的别名,输入别名,在浏览器输入别名,DNS帮咱们找到真正的域名。
NS记录:(Name Server)记录,用来指定该域名由哪一个DNS服务器进行解析
TXT记录:为某个主机名或者域名设置说明用的,没软用,相似注释或者说明文件

CDN工做机制

CDN:内容分布网络(Content Delivery Network),是一种构筑在现有Internet上的一种先进的流量分配网络。目的是在现有系统之上,增长一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户能够就近取得所需的内容,提升用户访问网站的响应速度。
目前CDN都以缓存网站中的静态数据为主,如CSS,JS,图片和静态页面等数据。
用户从主站服务器请求到动态内容后(相对距离远),再从CDN上下载这些静态数据(距离近),从而加速网页数据的内容下载速度。

CDN须要达到的目标:
可扩展性;安全性;可靠性,响应和执行

流程:
1,用户访问某个静态文件,首先向Local DNS服务器发起请求,通过一系列解析后,获得域名对应的注册服务器,交由Name Server去进行解析,返回域名对应的ip地址
2,Local DNS去ip地址上请求, 地址上的服务器是一个内部的域名服务器,把请求的域名解析后,会经过别名(CNAME)解析,把他解析成另一个域名,而这个新域名最终会指向CDN服务器。
3,CDN服务器中由进行负载均衡处理,并根据GTM(应该是时区地区相关)来确实是哪一个地方的访问用户,返回距离最近的CDN节点(服务器)给用户。
4,用户到这个距离最近的CDN节点上去获取数据。

负载均衡
Load Balance, 对工做任务进行平衡,分桶到多个操做单元上执行。
能够提升服务器响应速度以及利用效率,避免软件出现单点失效,解决网络拥塞问题,实现地理位置无关系,为用户提供较一致的访问质量

一般有三种负载均衡架构:
链路负载均衡:DNS解析不一样的ip,用户根据ip访问不一样的目标服务器
集群负载均衡:分为硬件负载均衡和软件负载均衡,硬件负载均衡就是一个很贵的硬件来负责全部的转发,通常是一主一备,不可扩容,价格昂贵,性能好;软件负载均衡就是普通pc大件,成本低,访问要通过屡次代理服务器,会增长网络延时;
操做系统负载均衡:利用操做系统级别的软中断或者硬件中断来达到负载均衡,如能够设置多队列网卡等来实现。(我的理解是系统级别的线程挂起设置,来切换不一样核之间的任务,保证cpu的使用率和占用率均衡。不会有哪一个任务执行特别久都不带停)

软中断是执行中断指令产生的,而硬中断是由外设引起的。