深入分析JavaWeb技术内幕—深入Web请求过程
B/S网络架构概述
B/S网络架构特点
在B/S架构中,客户端使用浏览器,服务端则基于统一的HTTP。这带来了很多优点,比如出现了许多基于HTTP的服务器,开发者可以直接拿来使用。
与大多数C/S模式的长连接交互模式不同,HTTP采用短连接通信方式,一次请求对应一次数据交互和业户逻辑,然后连接断开。这样做是为了能够同时服务更多的用户。
网络架构特点
用户输入URL(统一资源定位符),请求DNS把域名解析为IP地址,再根据IP地址找到互联网上相应的服务器。网络架构会越来越复杂,但有一些原则始终不变:
1.互联网上每个资源用URL表示
2.必须基于HTTP与服务端交互
3.数据必须再浏览器中展示
如何发起一个请求
下面介绍如何发出HTTP请求,讨论两个问题,能不能自己组装一个HTTP的数据包;还有哪些方式能简单地发起HTTP请求。
发起一个HTTP的过程就是建立一个Socket通讯的过程
发起HTTP请求与建立Socket连接很相似,只不过outputSteam.write写的二进制字节数据要符合HTTP的要求。浏览器根据URL域名DNS解析出IP地址,根据这个IP地址与默认端口号80与远程服务器建立Socket连接,然后根据URL组装成一个get类型的HTTP请求头,通过outputStream.write发送到目标服务器,服务器等待inputStream.read返回数据,然后断开链接。
Linux系统中,使用curl + URL就可以简单的发起一个HTTP请求。
HTTP解析
了解了发送HTTP请求的过程,我们直到,发送HTTP请求的本质是使用HTTP的规则建立Socket连接,B/S网络架构的核心就是HTTP。
HTTP Header是HTTP中最终要的部分,也是了解HTTP的关键,它控制着浏览器的渲染行为以及服务器的执行逻辑。常见的HTTP请求头和响应头以及状态码需要熟悉。
浏览器的缓存机制
浏览页面发生异常时,通常考虑是不是浏览器做了缓存,通过Ctrl+F5组合健刷新页面,浏览器会直接向目标发送数据,而不使用缓存,其次,即使直接向服务端发送请求,得到的也可能是缓存数据,因为服务器前端可能部署了缓存服务器。
使用Ctrl+F5打开界面时,其实是增加了一些与缓存控制有关的请求头。
DNS域名解析
域名解析过程
1.检查浏览器缓存有没有域名对应的IP地址
2.检查操系统缓存中有没有域名对应的DNS解析结果
3.请求LDNS本地域名解析服务器
4.请求Root DNS Server服务器
5.Root DNS Server返回给LDNS一个gTLD Server国际顶级域名服务器地址
6.LNDS向gTLD发起请求
7.gTLD返回给LDNS NameServer域名(提供商)服务器
8.LDNS向NameServer发送请求
9.NameServer将IP以及TTL返回给LDNS,DNS缓存域名和TTL
10.NameServer将域名与IP的对应关系及TTL返回给用户,用户将其存储到本地缓存
上述是简化的过程,NameServer可能有很多层,或者由一个GTM负载均衡来控制
清空缓存的域名
windows系统和Linux系统可以通过cmd来清除本地缓存。Java应用中JVM也会缓存DNS的解析结果,要修改JVM的缓存策略,可以子啊Java的启动参数中设置。
CDN工作机制
CDN简介
CDN是内容分布网络,通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”。用户可以就近获取所需内容,提高访问网站的相应速度。CDN以缓存静态数据为主,用户从主站服务器请求到动态内容后,从CDN下载静态数据,从而加速内容的下载速度。
CDN的目标
1.可扩展
2.安全性
3.可靠性
CDN架构
访问静态文件->迭代到的域名回到注册服务器解析->解析结果发送给GTM->GTM分配离用户最近的CDN节点,返回对应的IP->用户取CND节点访问静态文件->这个节点没有则直接去源站获取这个文件。
负载均衡
负载均衡就是对任务进行平衡、分摊到多个单元上执行。提高访问效率,避免软硬件出现单点失效,解决网络拥塞,为用户提供较为一致的访问质量。
1.链路负载均衡:通过DNS解析成不同IP,用户根据IP访问不同服务器。优点是不经过代理服务器,访问速度较快。缺点是DNS在本地用户以及LDNS都有缓存,一旦IP对应的服务器挂掉,那么将无法访问这个域名。
2.集群负载均衡——硬件负载均衡:使用一台专门的硬件设备来转发请求。优点是性能非常好,缺点是价格昂贵,不能进行动态扩容。
3.集群负载均衡——软件负载均衡:使用PC就可以搭建。优点是成本低,去缺点是需要经过多次代理服务器,增加延时。
4.操作系统负载均衡
CDN动态加速
当前比较流行的一种优化技术,在CDN的DNS解析中用过动态的链路探测寻找回源最好的一条路径,通过DNS的调度将所有请求调度到这条回源路径上,从而加速访问效率。这个路径被更新到LDNS中。
虽然速度加快,但可能成本增加很多,因此需要综合考虑时间和成本的问题。