1、B/S网络架构概述
当用户在浏览器里输入url后,首先会请求DNS把这个域名解析成对应ip地址,然后根据ip地址在网上找到对应服务器,向这个服务器发起一个get请求,由这个服务器决定返回默认的数据资源给访问的用户。
在服务器端实际上还有很复杂的业务逻辑:服务器可能有多台,到底只用哪台服务器来处理请求,还需要一个负载均衡设备来平均分配所有用户的请求;还有请求的数据是存储在分布式缓存里还是一个静态文件中,或是在数据库里;当数据返回浏览器时,浏览器解析数据发现还有一些静态资源(css、js、image等)时又会发起另外的http请求,而这些请求很可能会在CDN(内容分发网络)上,那么CDN服务器又会出来这个请求,大体上一个用户请求会涉及到这么多操作。每个细节都会影响请求最终是否成功。
2、如何发起请求
发起一个HTTP请求和建立一个Socket连接区别并不大,只不过outputStream.write写的二进制字节数据要符合HTTP。浏览器在建立Socket连接之前,必须根据浏览器地址栏里输入的url的域名DNS解析出IP地址,再根据IP地址和默认的端口号80与远程服务器建立Socket连接,然后浏览器根据这个url组装成一个get类型的HTTP请求头,通过outputStream.write发送到目标服务器,服务器等待inputStream.read返回数据,最后断开这个连接。一句话,发起一个HTTP请求过程就是建立一个Socket通信的过程。
基本HttpClient的调用示例如下:
/**
* httpclient测试
* @param args
*/
public static void main(String[] args) {
HttpClient hclient = new HttpClient();
PostMethod pm = new PostMethod("http://blog.csdn.net");
// 请求头
pm.addRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=GBK");
// 参数
pm.addParameter("ip", "100.38.17.65");
pm.addParameter("cont", "11112222");
try {
// 请求
hclient.executeMethod(pm);
// 输出服务器返回状态
System.out.println(pm.getStatusLine());
// 输出返回信息
System.out.println(pm.getResponseBodyAsString());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
// 释放链接
pm.releaseConnection();
}
}
注:Linux系统可以通过使用 curl + URL 就可以见到的发起一个HTTP请求,这里就不做演示了,喜欢的可以hava a try。
3、HTTP解析
B/S 网络架构核心是HTTP,要理解HTTP,最重要的就是要熟悉HTTP中的 HTTP Header, HTTP Header控制着互联网成千上万的用户数据的传输。最关键的是,它控制着用户浏览器的渲染行为和服务器的执行逻辑(画重点) 。例如,当服务器没有用户请求的数据就会返回一个404状态码,告诉浏览器没有请求的数据,通常浏览器就会展示一个非常不愿意看到的该页面不存在的错误信息。
常见HTTP请求头:
请求头 | 说明 |
---|---|
Accpet-Charset | 用于指定客户端接收的字符集 |
Accpet-Encoding | 用于指定可接受的字符编码,如Accept-Encoding:gzip.deflate |
Accpet-Language | 用于指定一种自然语言,如Accpet-Language:zh-cn |
Host | 用于指定被请求资源的Internet主机和端口号,如Host:www.taobao.com |
User-Agent | 客户端将它的操作系统、浏览器和其他属性告诉服务器 |
Connection | 当前连接是否保持,如Connection:Keep-Alive |
常见HTTP响应头:
响应头 | 说明 |
---|---|
Accpet-Charset | 用于指定客户端接收的字符集 |
Server | 使用的服务器名称,如Server:Apache/1.3.3(Unix) |
Content-Type | 用来指明发送给接收者的实体正文的媒体模型,如Content-Type:text/html; charset=GBK |
Content-Encoding | 与请求报头Accpet-Encoding对应,告诉浏览器服务端采用的是什么压缩编码 |
Content-Language | 描述资源所用的自然语言,与Accept-Language对应 |
Content-Length | 指明实体正文长度,用以字节方式存储的十进制数字来表示 |
Keep-Alive | 保持连接的时间,如Keep-Alive:timeout=5, max=120 |
常见HTTP状态码(状态码可以参考链接:http://blog.csdn.net/w214019153/article/details/77870313):
状态码 | 说明 |
---|---|
200 | 客户端请求成功 |
302 | 临时跳转,跳转的地址通过Location指定 |
400 | 客户端请求语法有错误,不能被服务器识别 |
403 | 服务器收到请求,但是拒绝提服务 |
404 | 请求资源不存在 |
500 | 服务器发生不可预知的错误 |
4、DNS解析(画重点)
Step1、 当用户浏览器输入域名并按下回车后,浏览器会检查缓存中有没有这个域名对应的解析过的ip地址,如果缓存有,这个解析过程就结束。
Step2、 如果浏览器缓存中没有,浏览器会查找操作系统缓存是否有这个域名对应的DNS解析结果。
(Step1、 Step2都是在本机完成,以下步骤对应上图)
Step3、 如果本机未完成DNS解析,在我们的网络配置中都会有“DNS服务器地址”这一项,操作系统会把这个域名发送给这里的LDNS,也就是本地区的域名服务器。这个DNS通常都提供本地互联网接入的一个DNS解析服务,例如在学校接入互联网,那么DNS服务器肯定在你的学校,如果是在小区接入互联网,那这个DNS就是提供你接入的互联网应用提供商,即电信或者联通,也就是通常所说SPA,那么这个DNS通常就在所在城市的某个角落,一般不会很远。(大约80%的解析到这里就完成了,所以LDNS主要承担了域名解析工作)
Step4、如果LDNS仍然没有命中,就直接到根域名服务器Root Server域名服务器进行请求解析。
Step5、根域名服务器Root Server返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址。gTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右。
Step6、本地域名服务器(Local DNS Server)再向上一步返回的gTLD服务器发送请求。
Step7、接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器,例如在某个域名服务器提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。
Step8、Name Server域名服务器会查询存储的域名和IP的映射关系表,在正常情况下都根据域名得到对应目标IP记录,连同一个TTL值返回给DNS Server域名服务器。
Step9、返回该域名服务器对应的IP和TTL值,LDNS Server会缓存这个域名和IP的对应关系,缓存时间有TTL值控制。
Step10、把解析结果返回给用户,用户根据TTL值缓存在本地系统中,域名解析过程结束。
注:在实际DNS解析过程中,可能还不止这10个步骤,如Name Server也可能有多级,或者有一个GTM来负载均衡控制,这都会影响域名解析过程。
5、CDN 工作机制
CDN也就是内容分布网络(Content Delivery Network),它是构筑在现有 Internet 上的一种先进的流量分配网络。其目的是通过现有的 Internet中增加一层新的网络架构,将网站内容发布到最接近用户的网络“边缘”,是用户可以就近取得所需要的内容,提高用户访问网站的相应速度。CDN比镜像更智能,可以做这样一个比喻:CND = 镜像(Mirror) + 缓存(Cache) + 整体负载均衡(GSLB)。因而,CDN可以明显提高 Internet中信息流动的效率。
目前CDN主要用户缓存网站上的静态数据,如css、js、图片和静态页面等数据。用户从主网站服务器请求道动态内容后,再从CDN上下载这些静态数据,从而加速网页数据内容的下载速度,如淘宝有90%以上的数据都是由CDN提供的。
通常来说,CDN要达到以下几个目标:
可扩展(Scalability)。性能可扩展性:应对新增的大量数据、用户和事务的扩展能力。成本可扩展性:用低廉的运营成本提供动态的服务能力和高质量的内容分发。
安全性(Security)。强调提供物理设备、网络、软件、数据和服务过程的安全性,(趋势)减少因为DDoS攻击或者其他恶意行为造成商业网站的业务中断。
可靠性、相应和执行(Reliability、Responsiveness 和 Performance)。服务可用性指能够处理可能的故障和用户体验下降的问题,通过负载均衡及时提供网络的容错机制。
CDN架构(画重点)