几天前,看到了这样一本书,《深入分析JavaWeb技术内幕》,作者是许令波,非常全面的对整个web进行了分析和讲解,但是其中可能会有很多地方和名词对于一个我来说,不能理解,所以根据原文,总结整理了这个笔记。
1.B/S架构带来的好处
a.统一使用浏览器,操作起来相对简单,且浏览器具有统一性,屏蔽了用户使用服务的差异性。
b.服务端(S端)统一使用http协议,简化开发模式,并且使开发模式规范化,降低开发人员的开发成本和学习成本。
2.B/S架构的概述
a. B/S架构基于统一的应用层协议http来进行数据交互,C/S架构通常使用长连接(始终保持连接状态),http协议使用无状态短连接的通信方式,一次请求对应一次数据交互,也就是对应一个业务逻辑(比如进行一次搜索),请求之后断开通信连接,这样做的好处就是保证同时服务更多的用户,保证高并发的访问。目前B/S架构都采用类似于下图所示架构设计,既满足海量用户的访问请求,又要保证用户请求的快速响应,所以网络结构也变得越来越复杂。
一个用户在浏览器中输入一个URL(如www.baidu.com)时,会发生这样的一些操作,首先他会请求DNS把这个域名解析成对应的IP地址,然后浏览器根据这个IP地址去查找对应的服务器,再向这个服务器发送一个请求,然后在服务器上进行一些操作,然后由服务器决定返回默认的数据资源给访问的用户。(由上图可以看出,服务器端还有很多复杂的逻辑,比如服务器可能有多台,到底是那一台服务器来响应这个请求,这里需要一个负载均衡设备来平均所有的请求,当数据返回浏览器时,浏览器再解析是发现还有一些静态的数据比如JS和CSS或者图片时,会发起另外的http请求,而这个请求,而这些请求很可能在CDN上,然后CDN服务器又会处理这个请求)。不管网络架构如何变化,始终有些固定不变的原则需要遵守
a.互联网上所有的资源都需要一个URL来表示
b.必须基于HTTP协议与服务端来进行交互
c.数据展示必须在浏览器中
3.如何发起一个请求
浏览器在地址栏输入URL,然后根据URL的域名DNS解析出对应的IP地址和端口号,在根据这个IP地址和端口号与远程服务器建立SOCKET连接
,然后浏览器根据这个URL,构建一个get类型的HTTP请求头,使用outputStream.write发送到目标服务器,服务器根据inputStream.read返回数据,然后断开连接。
4.常见的http请求头,响应头,状态码
5.浏览器的缓存机制:浏览器缓存是一个比较复杂并且重要的机制,在浏览器端如果进行同一个请求,就有可能拿到浏览器中缓存 的数据,一个非常有效的解决办法就是按ctrl+f5组合键,ctrl+F5浏览器会直接想目标URL发送请求,不会取
浏览器的缓存数据,其次 在服务端也可能会有缓存的数据(服务器的前端可能有一个缓存服务器,如 Varnish代理,Varnish也肯能直接拿取缓存的数据),所以为了保证拿到最新的数据,必须通过HTTP协议来
进行控制,使用ctrl+F5组合键的时候,在HTTP的情求头中会增加一些请求头,他会告诉服务器我们要的是最 新的数据。
这里的请求头是:
a.Cache-Control(多种浏览器支持)/Pragma(服务器遵守):这个HTTP head字段用于指定所有缓存机制在 整个请求/响应链中必须服从的指令,不仅可以控制 浏览器端,还可以控制缓存或代理服务器
b.Expires:后面通常跟着的是时间格式,超过这个时间之后,缓存内容就将失效,浏览器再发送请求之前来检 查这个字段 查看这个页面是否过期,若是过期则重新请求。
c.Last-Modified/Etag:Last-Modified用于表示资源的最后一次修改时间,浏览器发送请求时,请求头中会 带这个字段,来询问这个资源修改时间是否是最新,如果是最新的,就返回304状态码,服务器不会返回数据
给浏览器。Etag与 Last-Modified很像,只不过它是为每一个页面分配唯一的编号,然后通过编号来判断是否 是最新的。
6.DNS域名解析过程 :DNS的工作就是将域名解析成IP地址。(如图)
DNS的解析过程:
第一步:浏览器检测缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,结束解析(浏览器中缓存 与域名是 有限制的,时间和大小上都有限制,时间限制由TTL属性设置,这个时间太长太短都不好,
太长,有可能服务器 地址发生变化,太短,会导致每次请求都需要解析)
第二步:如果浏览器中没有这个域名的缓存,浏览器会查找操作系统缓存中是否有这个域名对应的解析结果.
第三步:如果在本机中无法完成域名的解析,就会来到这一步。我们的网络配置中DNS服务器地址这一项, 操作系统会把域名发送给这里设置的LDNS(本地区的域名服务器),大约80%域名的解析到这一步
就结束了。
第四步:如果LDNS没有解析成功,就会到Root Server域名服务器进行解析。
第五步:根域名服务器会返回给LDNS一个所查询域的主域名(gTLD Server)服务器地址,gTLD是世界上顶 级域名服务 器,如com cn 全世界只有13台左右
第六步:本地服务器再向主域名服务器发送请求
第七步:接受请求的主域名服务器查找并返回此域名对应的NameServer域名服务器地址(这个域名服务器通 常就是你要访问的那个域名的域名提供商)
第八步:NameServer域名服务器会查询储存的域名服务器和IP的映射关系表,然后将查询的IP以及TTL传回 LDNS
第九步:LDNS会缓存这个域名和IP的对应关系,缓存时间由TTL控制。
第十步:把解析结果返回给用户,用户根据TTL值,将结果保存至本地缓存中。
7.清除缓存的域名:域名一般会缓存在两个位置,一个是LDNS,一个是用户的本地机器,这两个的缓存时间都是由TTL和本地缓存 大小控制的,基本上来说LDNS上面的缓存时间就是TTL,控制,很难人工介入,但是本地缓存可以通过
ipconfig/flushdns来清除,在java应用中JVM也会缓存DNS解析结果,这个缓存是在InetAddress中完成的, 而且缓存比较特殊,它有两种缓存策略,一种是正确解析结果缓存,另一个是失败的解析结果缓存,这两个的
缓存时间由一个配置项控制,是在java的lib下面的security/java.swecurity中配置的,他们两个的配置项分别是 networkaddress.cache.ttl和networkaddress.cache.negative.ttl,他们的默认值分别为-1(永不失效)和
10(10秒后失效),可以直接修改
注意:使用InetAddress来进行域名解析是,一定要使用单例,否则会有严重性能问题(因为每次创建都是一次 完整解析)
8.CDN
a:CDN的定义:CDN(content Delivery Network)也就是内容分布网络,它是构筑在现有Internet上的一种 先进 的流量分配网络。
b:CDN的工作机制:其目的是通过现有Internet增加一种新的网络架构,将网站内容发送到最接近用户的网 络“边缘”使用户就近取得信息,提高响应效率,目前CDN主要已缓存静态数据为主,如CSS,JS等,用户从主
网站请求动态内容再从CDN上下载静态数据。
c.CDN要达到的目标:可扩展行(性能可扩展:应对新增大量数据,用户,事物的拓展能力。成本可扩展:用低 廉的运营成本提供动态的服务能力和高质量内容的分发);安全性;可靠性;
9.负载均衡:负载均衡就是对任务进行平衡,分摊到多个操作单元上执行,如应用服务器,图片服务器,通常有三种负载均衡架构
链路负载均衡,集群负载均衡以及操作系统负载均衡。
通过DNS解析出不同的IP,用户根据不同的IP访问不同的服务器,这就是一种链路负载均衡。
集群负载均衡分为硬件负载均衡和软件负载均衡,硬件负载均衡成本高,性能好,但是不能进行动态扩容,软件负载均 衡 成本低,但是要经过多个代理服务器会增加网络延时。
操作系统负载均衡,就是利用操作系统级别的软中断或者是硬件中断来达到负载均衡,比如多队列网卡。
注解:
应用层协议http:TCP/IP是个协议组,大致可以分为五个层次:应用层,传输层,网络层,数据链路层,物理层
每个层下面都有很多的协议:
应用层:http----超文本传输协议,用于网页浏览
smtp----简单邮件传输协议,用于邮件发送
pop3----邮局协议版本3,用于邮件接收
telnet---- 用于远程登陆
snmp----简单网络管理协议,用于网络管理
ftp----文件传输协议,用于远程文件传输
dhcp----动态主机配置协议,自动分配IP
tftp----简单文件传输协议,短小文件远程传输
传输层:tcp----传输控制协议,在传输层保证数据可靠传输的一种协议
udp----用户数据包协议,在传输层是数据具有较高传输效率的协议
spx----序列分组交换协议,在Novell网络传输层中的一种协议
网络层:IP----网际协议,实现异网互联通信机制和逻辑编址的协议
ipx 在Novell网络中网络层的一种协议 apple talk苹果公司计算机专业的网络层通信协议
数据链路层: 802.3、802.4、802.5、802.11、FDDI、ATM
物理层 :v.24 v.35 RS232 RS485
那么这几个层次之间都是做什么的?有这么一个例子
把整个过程比喻成邮局寄信,应用层就是写信,然后放入信箱。传输层就是你把信件投到邮局。网络层就是邮 局把你的信件投放到对方所属的中心邮局,链路层就是对方中心邮局把信件发送到小邮政点,物理层就是就是把
信件送到对方手上。
无状态 : 协议的状态是指下一次传输可以记住这次传输信息的能力,http是不会为下一次链接而维护这一次链接的信息的。
无状态就是指 当浏览器发送请求给服务器的时候,服务器响应,但是同一个浏览器再次发生请求时,服务器还会响 应,但是他不知道你就是刚才的浏览器,简单的说,就是服务器不会去记得你,所以是无状态协议。在客户端与服务 端进行动态交互的web程序出现之后,http无状态的特性严重阻碍了这些应用程序的实现,毕竟交互需要呈上起下,
比如购物车程序需要知道用户买了什么,于是两种用于保持HTTP连接状态的技术应运而生,一个是cookie,一个 是session,session和cookie是有区别的,一个是客户端保持连接状态,一个是服务端保存连接状态。
短连接: 短连接就是指SOCKET连接,发送,接收数据后马上断开连接。
长连接就是指建立SOCKET连接之后,不管是否使用都保持连接,但是安全性比较差
HTTP也是可以支持长连接的,使用Connection:keep-alive,HTTP1.1默认进行持久连接,但还是无状态的,也就 是不可信任的。