深入Web请求过程
B/S网络架构
带来的好处:
1.客户端使用同一的浏览器。 --浏览器的交互特性使其使用起来非常简便
2.服务器基于统一的http。 --简化、规范开发模式,大大节省开发成本.如tomcat nginx这些服务器可以直接拿来使用
1.1 B/S网络架构概述
从前端到后端都得到了简化,都基于统一的应用层协议HTTP来交互数据,HTTP采用无状态的短连接的通信方式(一次请求就完成一次数据交互、对应一个业务逻辑,然后此次通信断开)。这种方式是为了能够服务更多的用户,因为当前互联网应用每天都会处理上亿的用户请求。
固定不变的原则
a.互联网上所有的资源都要用一个URL来表示。
b.必须基于HTTP与服务端教书。
c.数据展示必须在浏览器中进行。
1.2 如何发起一个请求
步骤:1)浏览器在建立Socket连接之前,先将URL的域名DNS解析出IP地址
2)根据IP和默认80端口与远程服务器建立Socket连接
3)浏览器根据URL组装成一个get类型的HTTP请求头,通过outputstream.write发送到目标服务器,服务器等待inputstream.read返回数据
4)最后断开连接
1.3 HTTP解析
B/S网络架构的核心是HTTP,要理解HTTP,最重要的就是要熟悉HTTP中的HTTP Header,HTTP Header控制着互联网成千上万用户的数据传输。最关键的是,它控制着用户浏览器的渲染行为和服务器的执行逻辑。
请求头 | 说明 |
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 |
响应头 | 说明 |
Server | 使用的服务器名称,如Server:Apache/1.3.6 |
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 |
a.浏览器缓存
在浏览(测试)网页的时候发现有异常的情况下,通常考虑的是不是浏览器做了缓存,所以一般的做法是按Ctrl+F5组合件重新请求一次这个页面(组合刷新)。
当使用Ctrl+F5刷新一个页面的时候,在HTTP的请求头中会增加一些请求头(Pragma no-cache,Cache-Control no-cache),它告诉服务端我们要获取最新的数据而不是缓存。
1.4 DNS域名解析
DNS 是域名系统 (Domain Name System) 的缩写,它是由解析器和域名服务器组成的。
域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。
其中域名必须对应一个IP地址,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。
域名服务器为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为“域名解析”。
在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。 DNS 命名用于 Internet 等 TCP/IP 网络中,通过用户友好的名称查找计算机和服务。当用户在应用程序中输入 DNS 名称时,DNS 服务可以将此名称解析为与之相关的其他信息,如 IP 地址。因为,你在上网时输入的网址,是通过域名解析系统解析找到了相对应的IP地址,这样才能上网。其实,域名的最终指向是IP。
a. DNS域名解析过程
当用户在浏览器中输入域名并按下回车键后,
1.浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。(有缓存大小,缓存时间的限制,域名缓存时间由TTL属性设置)
2.如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。
3.操作系统会把这个域名发送到LDNS,也就是本地区的域名服务器(联通、电信、学校)。它们性能都会很好,一般会缓存域名解析结果。
4.如果LDNS任然没有命中,那么就直接到Root Server 根域名服务器请求解析。
5.根域名服务器返回给本地域名服务器一个所查询的主域名服务器(gTLD Server)地址。gTLD是国际顶级域名服务器,如.com,.cn,.org等
6.本地域名服务器再向上一步返回的gTLD服务器发送请求
7.接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址。(比如 你在阿里云上买的域名服务器地址)
8.NameServer域名服务器会查新存储的域名和IP的映射关系表,在正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给DNS Server域名服务器
9.返回该域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存的时间由TTL控制。 TTL Time to live
10.把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。
b.清除缓存的域名
DNS域名解析后会缓存解析结果,其中主要在两个地方缓存结果,一个是Local DNS Server,另外一个是用户的本地机器。
第一个很难人工介入清除,第二个可以使用如下方式清除:
Windows下 在cmd命令行模式中执行 ipconfig/flushdns命令来刷新缓存
Linux下可以通过/etc/init.d/nscd restart来清除缓存
重启依然是解决很多问题的第一选择
JAVA应用中JVM也会缓存DNS的解析结果,我不理解这个,请大神补充。。
C.几种域名解析方式
A记录,A代表的是Address,用来指定域名对应的IP地址。A记录可以将多个域名解析到一个IP地址,但不能将一个域名解析到多个IP地址。
MX记录,表示的是Mail Exchange,就是将某个域名下的邮件服务器指向自己的Mail Server。
CNAME记录,全称是Canonical Name 别名解析。可以为一个域名设置一个或多个别名。
NS记录,为某个域名指定DNS解析服务器,也就是这个域名由指定的IP地址的DNS服务器去解析。
TXT记录,为某个主机名或域名设置说明。
1.5 CDN工作机制
CDN(内容分布网络)=镜像+缓存+整体负载均衡
相当于1.4步骤7)后增加一步:Name Server域名服务器把它重新解析到另一个域名,而这个域名最终被指向CDN全局中的DNS负载均衡服务器,再由这个GTM判断是哪个地方的访问用户,返回给离这个访问用户最近的CDN节点。
1.5.2 负载均衡
负载均衡就是对工作任务进行平衡、分摊到多个操作单元上执行,如图片服务器、应用服务器等。
---------参考自《深入分析Jav Web技术内幕》