Web请求过程

深入分析 javaWeb 技术内幕 读书笔记


写好博客,记住点滴;写明是什么,为什么


不是简单的将树上的文字,搬运到博客上 ;那样毫无意义,笔者在其中加了一些自己的理解,用自己的话,按照自己的理解,叙述了一遍 ;

目录


B/S网络架构概述

  • 什么是B/S

    B/S就是 Browser / Serve 的缩写;是浏览器直接到服务器,与以往的C/S模式不同,没有客户端这么一说,只需要有浏览器;


  • 理解

    • B/S网络架构,是没有客户端参与的,只要PC上有浏览器就OK;
    • 基于应用层HTTP协议传输数据;
    • 基于HTTP自身的特点,B/S在完成一次通信以后,就会断开浏览器与服务器的连接;这为处理海量请求提供了实现的可能,毕竟服务器的连接数有最大上限;(C/S是长时间连接,就好比我们打LOL,我们的客户端与LOL的服务器是一直处于连接状态的)

向服务器发送请求的过程

简略版,这里面的域名解析、CDN都一笔带过,后面会仔细讲一下;
  • 当我们在浏览器的地址栏中输入 www.taobao.com ,就会看到淘宝网的数据,这后面都发生了什么?

    • 浏览器会先请求DNS,解析这个 www.taoba.com ( URL)域名,得到这个域名的ip地址 ;
    • 拿到ip地址以后,在网上找到对应的服务器,向他发送一个 get 请求 ;
    • 服务器返回数据;如果服务器有多台,会根据情况选择其中的一台服务器,这里就涉及负载均衡了(笔者,也是新手,不太了解,就知道有这么一个过程,后面会说下我理解的负载均衡);
    • 浏览器收到数据,进行 解析 显示 ;如果浏览器,在解析的过程中发现数据里面还有一些静态资源(CSS,JS,图片资源),浏览器会再次发起HTTP请求 ,这里面又有可能涉及到 CDN;(CDN是什么,后面也会简单的说下)
  • 上述说的过程是最简单的网络架构了,随着网络的发展,出现了许多许多的各式网络架构;有的架构和上面比起来已经相差甚远了,但是无论网络架构如何发展,这里面的一些东西是永远不会改变的;

    • URL

      URL 是不会改变,也是独一无二的,资源定位符,网络上那么多的资源,都需要规定一个URL,来供大家访问 ;

    • HTTP

      在网络中传输数据必须需要遵守这个规范,这样你发送的信息,才能被网络中的其他人认识;(虽说现在出现了HTTPS,但是这不是HTTP变了,只能说是对HTTP的改进)

    • B/S模式

      无论网络架构怎么变化,目前还是都基于B/S模式,都是浏览器与服务器的交互,服务器返回的数据,都是浏览器显示 ;


如何发起一个HTTP请求·

除了浏览器可以向服务器发送HTTP请求以外;我们也可以自己模拟浏览器,向服务器发送HTTP请求
  • 要想模拟浏览器向服务器发送HTTP请求,首先要知道浏览器发送给服务器的请求,里面都写了啥;
  • 我们自己按下F12,看下请求一个网页,都发送了什么数据;都发送了哪些请求头,基本上都类似如下;
accept-ranges   : bytes
access-control-allow-origin  : *
age : 623174
cache-control   : max-age=604800
content-encoding     : gzip
content-length16866
  • 我们自己建立一个socket连接,在outputStream.write流里面,写上我们刚刚看的那些字段以及字段值(主要是为了符合 HTTP 规范),然后在这些数据的后面,再写上我们想发送的数据,最后将这些数据一并发送给服务器,服务器会认识这是一个HTTP请求,它会有回应的 ;

  • 说白了发起一个HTTP请求,就是与服务器建立一个socket通信的过程,只不过这个通信过程,得遵守一个规则(HTTP规范),就像古时候,对暗号一样,暗号对上了,对方才会回应你 ;这里是HTTP对上了,服务器才会处理这次请求 ;

当然了也有一些工具,可以完成简单的HTTP请求


浏览器缓存机制

  • 我们什么时候看到的数据是缓存的?

    当我们向服务器请求的数据是静态资源(CSS、JS、图片等资源)的时候,服务器一般会控制浏览器进行缓存,这样下一次再次访问同样的资源,浏览器就会显示缓存的数据,而不是再去访问服务器;这样做可以减轻服务器的压力和加快响速度 ;

  • 强制浏览器访问服务器端的数据

    只要我们刷新页面,浏览器就不会再去拿缓存,而是再次向服务器发送一次请求 ;但是, 假如服务器前面部署了一个 缓存服务器 ,我们还是只能访问到缓存的数据 ;.

综上所述,缓存有浏览器缓存、服务器缓存 ;我们要想 拿到最新的数据,还是有万般阻挠的,只能使用HTTP来控制 ;这里还需要 置缓存服务器的缓存策略 ,让它识别我们的一些特殊请求头,以便返回最新的数据给我们 ; 超出我的知识范围了 ;


DNS域名解析过程

整个互联网世界,也仅仅有几个 DNS 根 域名服务器 ;
  • 当我们在浏览器URL栏中,输入 www.t66y.com 的时候,我们是如何得到这个域名对应的IP地址的呢?

    1. 浏览器会在自身的缓存中的寻找是否有这个域名对应的IP地址,如果有,则解析结束 ;

      浏览器的缓存是有大小和时间限制的 ;其中域名的缓存时间,可以通过TTL属性来修改 ;但是域名的缓存时间,是个玄学;时间设置的太短或太长都不好;太短了,会导致需要重新解析域名;太长了,会导致人家域名对应的IP地址已经发生了改变,你这边还不知道,还在使用缓存的IP地址,造成访问失败 ;

    2. 如果没有,则回去访问操作系统中的缓存中,有没有记录这个域名对应的IP地址;如果有,解析结束 ;
    3. 如果操作系统也没有缓存;则需要访问真正的域名解析服务器来解析这个域名了;
    4. 上面已经说过了,根域名解析服务器,全世界也就那么几台;我们肯定不能上来就去问人家要结果 ;那么,我们先去问谁要这个结果呢?本地区的域名解析服务器 (LDNS)

      域名解析服务器。可以有很多啊,少的只是那几个最高级别的 根域名解析服务器

    5. 那么本地区的域名服务器在哪呢? 在我们的网络配置里面有个DNS服务器地址,这个地址就是!当发现在本机上无法完成域名解析的时候,操作系统就会把域名发给这个地址的域名解析服务器

      本地区域名解析服务器 从名字的 ‘本地区’ 也可以看出这个服务器,距离我们不远,就在我们的附近;你在学校用的网,那么这个服务器就在你学校里;在小区用的网,那这个服务器,就在运营商那里,通常就在城市的某个角落 ;
      在这里缓存的域名,一般缓存空间 不是 影响缓存域名失效的主要因素 ; 影响缓存域名失效的主要因素是 域名本身失效了
      基本上 80% 的域名解析,到这里都完成了 ;

    6. 如果 LDNS 仍然没有解析出域名,完了,这表示小弟解决不了这件事了;那么就只能请老大 Root Server(根域名解析服务器) 出马了;LDNS 会直接向根域名服务器发送请求 ;
    7. 根域名服务器收到请求后,会根据查询的域名的后缀(com、org、cn等),返回管理这个域的主域名服务器 (gTLD)地址;
    8. 然后 LDNS 会向根域名服务器返回的主域名服务器 (gTLD)地址发送请求;
    9. gTLD 服务器,根据域名的特征,查找并返回此域名的服务商地址 ;这个服务商就是你注册的域名服务器,你在谁家注册的,这里就是谁;相当于找到域名老家了 ;
    10. LDNS 拿着域名提供商的地址,去找他;域名服务商,查询自己的数据库,找到域名对应的IP,连同一个TTL值一起返回给 LDNS ;
    11. LDNS 会缓存这个域名的IP,缓存的时候,由那个服务器一并返回的TTL(这里应该就是写明了域名的失效时间)控制 ;
    12. 将结果返回给用户,用户根据TTL值,在本地做缓存 ;
    13. 整个域名解析过程结束 ;

我们可以发现,只有LDNS 之前是根据缓存来解析域名的;后面的是,直接找到域名的老家去了 ;

  • 域名的缓存时间

    我们可以发现域名在两个地方做了缓存:LDNS和本机 ,并且这两个地方缓存的时间,都是由域名服务器商返回的TTL值确定的,很难人工介入 ;

  • JVM也会缓存DNS的解析结果,是使用InetAdreess类完成的,目前没用过这个类,不做回答 ;


几种域名解析方式

域名解析分为几大类: A 记录、MX 记录、CNAME 记录、NS 记录、TXT 记录 ;

  • A 记录
    A 代表 Adress ,用来指定域名对应的ip地址 ;即平时 WEB直接访问一个域名,DNS解析出来IP地址 ;其中多个域名可以解析到同一个IP地址,反之,则不可以

    这很好理解:比如一家有好几口人,我们寻找其中一个人,只要到他家找就好了;反过来,一个人有好几个家,那么我们去哪一个家找这个人呢,这就是问题了,去哪里找这个人;其中,人对应域名,家对应IP地址 ;

  • MX 记录
    MX 代表 Mail Exchange ,用来将 某个域名下面的 邮件服务,解析到某个IP地址上 ;

    比如:taobao.com 的A 记录的ip地址是 115.238.25.xxx ;我们可以将taobao.com的MX 记录的ip地址设置为 115.238.21.xxx ; 则访问 xxx@taobao.com DNS就会把域名解析到MX 记录的IP地址上 ;而我们正常通过WEB访问 taobao.com DNS还是会把域名解析到A 记录的ip地址上 ;

  • CNAME 记录
    CANME 代表 Canonical Name (即别名解析)。可以为一个域名设置一个或多个别名 ;对域名进行解析的时候,可以把域名解析到它的别名IP上 ;

  • NS 记录
    为某个域名指定DNS解析服务器;就是在访问该域名的时候,DNS解析,在某个指定的DNS域名解析服务器上 ;

  • TXT记录
    为某个域名或主机名设置说明;比如taobao.com ,可以为它设置一个说明:“马云家的大卖场”

上述的解析方式,主要在域名解析过程中,可以看到;如果你跟踪域名解析,就会看到这个解析方式 ;


CDN工作机制

CDN是 内容分发网络 的简写 ;

  • 什么是内容分发网络?
    可以简单的理解为:根据当前的网络状况,将用户请求重新导向到离用户最近的网络节点 专业的说法是:流量分配网络 主要用来解决网络拥堵,提高响应速度

  • 为什么能提高响应速度,解决网络拥堵?
    首先了解下,,CDN是由许多许多的服务器组成的,并且这些服务器分布很广,可以想象下,我们生活的城市周围,都有这样的服务器存在 ;这些服务器上面一般都保存着静态资源,如CSS、JS、图片、静态网页等 ;

    当我们访问一个网站的时候。,这个网站的主服务器可能距离我们很远,因此我们只是从这个网站上请求到了一些动态资源;而静态资源,则是从我们周围的CDN节点上下载下来的 ;由于CDN服务器,距离我们很近,因此,下载的速度就很快;给我们一种网站响应速度很快的感觉 ;


CDN架构(即CDN是怎么样参与我们的访问的过程的)

上面,只是简单的说了下,从主站上请求到动态资源,从CDN节点上请求到静态资源;下面比较详细的说下每一步 ;
  • 当我们访问 taobao.com 的时候,CDN是怎么参与其中的?

    第一步:解析域名,获取IP地址 ;以往我们是获取到IP地址以后,就直接到去访问网站了; 现在,有了CDN的存在,我们不直接去源网站(就是上面域名解析出的IP对应的网站);在注册域名的服务商(域名老家)那里,对域名设置了 别名解析, 让LDNS去CDN域名解析服务器处;

    第二步:LDNS拿着源站的IP地址,去访问CDN的域名解析服务器,进行负载均衡 的计算;最后返回距离请求用户最近的CDN节点的IP地址 ;(在LDNS处进行缓存,将CDN节点的IP地址缓存,便于下次访问)

    第三步:本机 带上源站的IP,去访问距离我们最近的CDN节点服务器,从这个CDN节点服务器上下载我们需要的资源;如果该CDN节点服务器上没有我们需要的资源,则由这个这个CDN节点,进行跳转去源站下载我们需要的资源 ;其中我们需要的动态资源,CDN节点一般是没有的,也是在这一步经由这个CDN节点,去源站下载,不过从CDN到源站的路径,也是计算出来的,寻找最优路径; 最后将这些资源 返回给用户 ;(本机中同样也缓存CDN节点IP地址,这样下次访问,就不再需要去注册域名服务商那里了)

上述的理解,是笔者自己的理解;因为,《深入分析javaWeb技术内幕》这本书对这部分的讲解,笔者感觉不是很清晰 ;如果错误,请指正


负载均衡

有三种:链路负载均衡、硬件负载均衡、软件负载均衡 ;(书上讲的是在是简单,笔者无法进行自己的讲解;)

其中的链路负载均衡,就是我们刚刚讲的CDN;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值