深入分析Java Web技术内幕学习笔记之(一)深入WEB请求过程

最近学习阿里大神著的《深入分析Java Web技术内幕》,仅仅记录一波笔记,实现部分演示的代码,在此非常感谢作者的分享!


B/S架构带来的好处:客户端(Client)使用统一的浏览器(Browser),服务端(Server)基于统一的HTTP。

1.1 B/S网络架构概述

    B/S网络架构基于统一的应用层协议HTTP来交互数据,与传统C/S互联网应用采用长连接的交互模式不同,HTTP采用无状态的短链接的通信方式,一次请求一次数据交互,然后就断开连接。一次完整的请求过程:用户输入域名(www.taobao.com)-->DNS解析找到对应的IP地址-->找到服务器-->发起请求-->服务器返回数据给用户。

  •  互联网上所有资源都要用一个URL来表示,URL统一资源定位符。
  • 必须基于HTTP与服务器交互。
  • 数据展示必须在浏览器中。

1.2 如何发起一个请求

    发起一个HTTP请求的本质就是建立一个Socket连接。HttpClient就是一个开源的HTTP请求包。


1.3 HTTP解析

常见请求头:

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

常见响应头:

响应头说明
Server
使用服务器的名称,如:
Server:
BWS/1.1
Content-Type
用来指明发给接收者的实体正文的媒体类型,如:Content-Type: text/html
Content-Encoding
与请求头Accept-Encoding对应,告诉浏览器服务端采用什么压缩编码
Content-Language
描述了资源所用的自然语言,与Accept-Language对应
Content-Length指明实体正文的长度,用以字节方式存储的十进制数字来表示
Keep-Alive保持连接的时间
实例如下:
常见状态码

状态码说明

200

客户端请求成功
302临时跳转,跳转的地址由Location指定  
400客户端请求又语法错误,不能被服务器识别
403服务器收到请求但拒绝提供服务
404请求的资源不存在
500服务器发生不可预期的错误

1.3.1查看HTTP信息的工具

浏览器调试工具 Chrome


1.3.2 浏览器缓存机制

   浏览器缓存是一个比较复杂又非常重要的机制,一般 Ctrl+F5组合重新请求,不会使用浏览器缓存的数据。

F5刷新请求头信息


Ctrl+F5刷新请求头信息


比较Ctrl+F5刷新时多了2请求项。Cache-Control: no-cache和Pragma: no-cache两个值取值说明如下:

可选值说明
Public所有内容都将被缓存,在响应头中设置
Private内容只被缓存到私有缓存中,在响应头中设置
no-cache所有内容都不会被缓存,在请求头和响应头中设置
no-store所有内容都不会被缓存到缓存或Internet临时文件中,在响应头中设置
must-revalidation/proxy-revalidation如果缓存内容失效,请求必须发送到服务器或者代理服务器重新验证,请求头中设置
max-age=xxx缓存在xxx秒中失效,HTTP1.1中可以使用

1.4 DNS域名解析

1.4.1 DNS域名解析过程

    

当用户输入 www.xxx.com时,第1步,浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果有,这个解析过程就将结束。但是,浏览器缓存域名有时间和缓存大小的限制。第2步,如果用户浏览器缓存中没有,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。Windows中可以通过C:/Windows/System32/drivers/etc/hosts文件来设置。


localhost就是在此文件设置的。如果自己设置了域名对应的IP地址,浏览器会首先使用这个IP地址。正是这种本地的DNS解析过程,黑客就有可能通过修改你的域名解析来把特定的域名解析到它指定的IP地址上,导致这些域名被劫持,因此windows7中就将hosts文件设置成了只读的,防止这个文件被轻易修改。

第3步,如何知道域名服务器呢?在我们网络配置中都会有“DNS服务器地址”这一项,操作系统会把这个域名发送给这里设置的LDNS,即本地区的域名服务器。通常windows下可以通过ipconfig查询这个地址。

第4步,如果LDNS没有命中,就直接到RootServer域名服务器请求解析。

第5步,根据域名服务器返回给本地域名服务器一个查询域名服务器(gTLD Server)地址,gTLD时国际低级域名服务器,如.com,.cn,.org等,全球只有13台左右。

第6步,本地域名服务器(Local DNS Server)再向上一步返回的gTLD服务器发送请求

第7步,接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是注册域名的服务器。

第8步,Name Server 域名服务器会查询存储的域名和IP映射关系表,连同一个TTL值返回给DNS Server服务器。

第9步,返回该域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存时间由这个TTL值控制。

第10步,把解析结果返回给用,用户根据TTL值缓存再本体系统缓存中,域名解析过程结束。

1.4.2 跟踪域名解析过程

Linux和Windows下都可以使用nslookup命令来查询域名解析结果,也可以使用dig命令来查询DNS解析过程,如下图:


1.4.3 清除缓存的域名

    DNS域名解析结果都会缓存解析结果。其中最主要的两个缓存地方时LDNS,另外一个时用户本地机器。由TTL决定,LDNS无法人工介入,但是本地,Windows下可以在命令模式下执行ipconfig/flushdns命令来刷新缓存。


在Linu下可以通过/etc/init.d/nscd restart 来清除缓存。

1.5 CDN 机制

    CDN就是内容分布网络(Content Delivery Network),是构筑在现有Internet上的一种先进的流量分配网络。目前CDN都以缓存网站中的静态数据为主,如CSS,JS,图片等数据。

1.5.1 CDN架构


1.5.2负载均衡

负载均衡(Load Balance)就是对工作任务进行平衡、分摊到多个操作单元上执行,如图片服务器,应用服务器等,共同完成工作任务。通常负载均衡有三种架构,分别是链路负载均衡、集群负载均衡、操作系统负载均衡。

    A、链路负载均衡即通过DNS解析成不同的IP,然后用户根据这个IP来访问不同的目标服务器。如下图所示:


负载均衡是由DNS的解析来完成的,用户最终访问哪个Web Server是由DNS Server控制的,在这里就是有Global DNS Server来动态解析域名服务。优点:用户直接访问目标服务器,而不需要代理服务器,访问速度快。缺点:由于DNS在用户本地和LDNS都有缓存,一旦某台Web Server挂掉,就很难及时更新用户的域名解析结构,如没有更新,用户则不能访问这个域名。

B、集群负载均衡,一般分为硬件负载均衡和软件负载均衡,硬件负载均衡一般使用一台专门的硬件来转发请求,如下图所示:


软件负载均衡是使用最普遍的一种负载方式,特点是成本低,直接使用廉价的PC机就可以搭建,缺点就是一般一次访问请求要经过多次代理服务器,会增加网络延时,如图所示:


如图,上面的两台LVS,四层负载均衡,即在网络层利用IP地址进行地址转发。下面的三台使用HAProxy进行七层负载,即根据访问用户的http请求头来进行负载均衡,可以根据不同的url或者用户的Cookie信息来指定访问的机器。

C、操作系统负载均衡,利用操作系统级别的软中断或者硬件中断来达到负载均衡

1.5.3 CDN动态加速

    CND的动态加速技术也是当前比较流行的一种优化技术,原理就是在CDN的DNS解析中通过动态的链路探测来寻找回源最好的一条路劲,然后通过DNS的调度将所有请求调度到选定的这条路径上回源,从而加速用户访问的效率。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值