浏览器统一通过应用层协议HTTP来交互数据,所谓HTTP请求和建立socket连接基本上是一个概念。浏览器上网其实就是通过给定的ip地址和默认的80端口和远程服务器建立远程连接。当你在浏览器输入www.baidu.com按下回车的时候,主机首先去找DNS服务器将域名转化为ip地址,得到地址后再向目标地址发送get请求。服务器收到请求后返回请求的相关数据。这个过程看似三言两语就描述完了,其实其中有各种信息交互、性能优化等问题,十分值得展开来仔细研究。
首先,关于DNS域名解析,当你按下回车的那一刻,域名解析经过了如下流程:
主机先是在浏览器缓存中寻找域名的ip。
如果没找到,再在操作系统中找,如windows中C:\Windows\System32\drivers\etc\hosts文件中就存有部分域名转化信息。但是这个文件容易被黑客利用将特定域名指定到其他ip上,导致域名被劫持。所以在Windows7之后改文件被设置为了只读。
如果在本机没找到,主机会向当地DNS服务器发送请求,一般来说80%的请求在DNS服务器中就可以得到解决。
如果当地DNS服务器也没找到,服务器会向根域名服务器发送请求,根域名会返回国际顶级域名服务器(.com、.cn等)的地址,服务器再向顶级域名服务器发送请求,顶级域名服务器返回相关域名所注册的域名服务器地址,最后DNS服务器询问域名注册的服务器并得到域名的ip并 返回给主机。
关于性能优化,CDN(内容分布网络)用于存放网站静态资源(CSS、图片等)。
当用户发送网页请求时,动态数据时通过访问源站服务器得到,而这些静态资源则是通过域名解析,从较近的CDN节点得到。
关于负载均衡。主要有链路负载均衡、硬件负载均衡、软件负载均衡以及操作系统负载均衡。
链路负载均衡是利用域名服务器将一个域名解析成多个ip来实现分流。方便实现,但是由于域名服务器或用户都会进行缓存,一旦某个ip对应的服务器挂了,会有很多用户无法访问。
硬件负载均衡就是通过专门的设备直接将大量的用户请求分流到多个服务器,性能强,缺点是贵而且无法扩展。
软件负载均衡则是利用相关算法对请求或按照ip或按照http请求头进行分流。
操作系统负载均衡就是利用操作系统软中断或硬件中断,比如多队列网卡。
以上内容算是对《深入分析java web技术内幕》的读书笔记或者总结,主要用于帮助我理解web请求过程和原理。