第一章 深入浅出Web请求过程(笔记)

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要达到以下几个目标:
  1. 可扩展(Scalability)。性能可扩展性:应对新增的大量数据、用户和事务的扩展能力。成本可扩展性:用低廉的运营成本提供动态的服务能力和高质量的内容分发。

  2. 安全性(Security)。强调提供物理设备、网络、软件、数据和服务过程的安全性,(趋势)减少因为DDoS攻击或者其他恶意行为造成商业网站的业务中断。

  3. 可靠性、相应和执行(Reliability、Responsiveness 和 Performance)。服务可用性指能够处理可能的故障和用户体验下降的问题,通过负载均衡及时提供网络的容错机制。

    CDN架构(画重点)

    这里写图片描述

     如上图,一个用户访问某个静态文件(如 CSS文件),这个静态文件的域名假如是cdn.taobao.com,那么首先向LDNS服务器发起请求,一版经过迭代解析后回到这个域名的注册服务器去解析,一般每个公司都会有一个DNS解析服务器。这时这个DNS解析服务器通常会把它重新CNAME解析到另外一个域名,而这个域名最终会被指向CDN全局中DNS负载均衡服务器,再由这个GTM(广域网负载均衡)来最终分配是那个地方的访问用户,返回给离这个访问用户最近的CDN节点。
     拿到DNS解析结果,用户直接去这个CDN节点访问这个静态文件,如果这个节点所请求的文件不存在,就会再回到源站去获取这个文件,然后返回给用户。

CDN动态加速(了解)

     CDN的动态加速技术也是当前比较流行的一种优化技术,其原理就是在CDN的DNS解析中通过动态链路探测来寻找回最好的一条路径,然后通过DNS的调度将所有请求调度到选选定的这条路上回源,从而加速用户访问效率。

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值