深入Web请求过程
B/S网络架构概述
B/S网络架构基于统一的应用层协议HTTP协议交互数据,与传统的C/S网络应用程序使用长连接交互模式是不同,HTTP采用无状态的短连接的通信方式,通常一次请求就完成一次数据交互,然后就断开连接。采用这种方式是为了能够同时服务更多的用户,因为当前互联网每天都会处理上亿的用户,不可能每个用户访问一次后就一直保持这个连接。
一些固定不变的原则:
- 互联网上所有的资源都用一个URL(统一资源定位符)来表示
- 必须基于HTTP与服务器交互
- 数据展示必须在浏览器中进行
如何发起一个请求
如何发起一个HTTP请求和如何建立一个Socket连接区别不大,只不过写入的二进制字节数据要符合HTTP规范。具体步骤如下:
- 浏览器在建立Socket连接之前,必须根据地址栏输入的URL的域名解析出IP地址
- 根据IP地址+默认的80端口和服务器建立Socket连接
- 浏览器根据这个URL组装一个get类型的HTTP请求,通过
outputStream.write
发送到服务器 - 服务器等待
inputStream.read
读取请求并响应数据 - 响应完毕则断开连接
在Java中可以通过HttpClient
,OkHttp
等处理的HTTP的工具包模拟浏览器请求;在Linux中可以通过curl
命令,通过curl+URL
就可以简单地发起一个HTTP请求
DNS域名解析
DNS域名解析的目的就是将域名解析出对应的IP地址,解析过程如下:
- 浏览器会先检查自身缓存中有没有域名对应的IP地址,同时浏览器缓存域名也是有限制的,不仅浏览器缓存的大小有限制,而且缓存的时间也有限制 (域名被缓存的时间限制可以通过TTL属性来设置)
- 如果浏览器缓存中没有,浏览器会检查操作系统缓存是否有这个域名对应的DNS解析结果,即host文件。在Windows中在
C:\Windows\System32\drivers\etc\hosts
文件来设置,可以将任何域名解析到任何IP地址。在Linux中这个配置文件是/etc/hosts
。同样的缓存的时间受这个域名失效时间和缓存空间大小控制。以上两步属于在本机解析,还没涉及到域名服务器,如果本机解析不到就需要请求域名服务器来解析这个域名了 - 在我们的网络配置中都会有"DNS服务器地址"这一项,当上述两个过程无法解析时,操作系统会把这个域名发送到设置的这些地址上,即LDNS(Local DNS Server 本地域名服务器),你所属区域的电信或联通,或者是学校,通常不会很远。在Windows通过
ipconfig
可以查看LDNS的IP地址,在Linux通过cat /etc/resolv.conf
查看,如果没有可能看到有可能使用的是自动获取DNS的方式。这个专门的域名服务器性能都会很好,一般缓存空间不是影响域名失效的主要因素,而是受失效时间控制。LDNS主要承担了域名解析工作,大部分解析到这里都已经完成了 - 如果LDNS没有命中,就直接到Root Server( . 根域名)域名服务器请求解析
- 根据域名服务器返回给本地域名服务器(LDNS)一个说查询域的主域名服务器(gTLD Server)地址。gTLD是国际顶级域名服务器,如.com .cn .org等
- 本地域名服务器(LDNS)再向上一部返回的gTLD服务器发送请求
- 接受请求的gTLD服务器查找并返回此域名对应的Name Server服务器地址,这个Name Server就是该域名注册的域名服务器地址
- Name Server域名服务器查询存储的域名和IP地址映射表,得到对应IP记录,连同一个TTL值返回给LDNS域名服务器
- LDNS域名服务器缓存域名和IP对应关系,缓存时间由TTL值控制
- 把解析结果返回给用户(操作系统,浏览器),用户根据TTL值缓存在本地中,域名解析过程结束
CDN网络介绍
CDN也就是内容分布网络,是构建在现有Internet上的先进的流量分配网络。将网站的内容发布到最接近用户的网络,使用户可以就近取得所需资源,提高访问网站的响应速度
目前CDN都是以缓存网站中的静态数据为主,如CSS,JS,图片和静态页面等数据
CDN = 资源镜像(Mirror)+ 缓存(Cache)+ 整体负载均衡(GSLB)