最近在看许令波的《深入理解JavaWeb技术内幕》。整理了一些笔记。想做一个系列,这篇是系列的第一篇,讲Web请求。

B/S架构

最常见的架构方式。

优点:

1.客户端使用统一(此处的统一主要指实现原理统一)的浏览器,不需要特殊的网络配置。

2.服务端基于统一的HTTP协议。基于此协议的服务器有很多,如Tomcat,Nginx,JBoss。这些服务器可以直接拿来用。

请求发生的完整过程

HTTP最大的特点就是无状态的短连接的通信方式,通常情况下一次请求就完成了一次数据交互,通常也对应一次业务逻辑。然后这次通信就断开了。

采用这种方式是为了能够同时服务更多的用户,防止由于一个用户独占连接而造成阻塞的现象。

下面主要介绍用户在浏览器输入网址之后发生的整个完整过程。

1.用户输入URL,也就是网址。如www.google.com。

2.DNS域名服务器会将其转换成IP地址。

3.用户端根据IP地址向服务器发起请求。

4.服务器端可能会有负载均衡设备来平均分配所有的用户请求。在请求到达服务器后,会经过一些复杂的业务逻辑来处理用户请求。请求的数据可能在三个地方:

分布式缓存系统,文件系统或者数据库中。从其中取出数据返回给浏览器。

5.数据返回后,浏览器解析数据发现还有一些静态的资源(CSS,JS或者图片),然后再次发起请求。这些静态资源很有可能是在CDN上,如果在的话CDN服务器会再次处理用户的请求。

6.最终在浏览器端看到完整的网页。

以上就是大致的请求数据的过程。

不管架构如何变化,有三个原则是始终不变的:

1)互联网上的所有资源都要用一个URL表示。

2)必须基于HTTP与服务端交互。

3)数据展示必须在浏览器中进行。

如何发起请求

发起请求实质上就是建立一个Socket连接,但是这是一个特殊的Socket连接。

端口号:80

所以完全可以自己模拟浏览器发起一个HTTP请求。专门有个处理HTTP请求的开源工具包,叫HttpClient。

在linux中通过curl+URL可以简单地发起一个HTTP请求。如:curl "www.google.com"

请求的解析

HTTP请求的最重要的部分就是HTTP的头部。

HTTP请求头:

  1. Accept-Charset 用于指定客户端接受的字符集
  2. Accept-Encoding 可接受的内容编码
  3. Accept-Language 自然语言 比如zh-cn
  4. Host 指定被请求资源的Internet主机和端口号
  5. User-Agent 客户端将它的操作系统、浏览器和其他属性告诉服务器
  6. Connection 当前连接是否保持。

HTTP响应头:

  1. Server 使用的服务器名称
  2. Content-type 指明发送给接受者的实体正文的媒体类型,如Content_Type:text/html;charset = GBK
  3. Content-Encoding: 告诉浏览器服务端采用的压缩编码
  4. Content-Language: 描述了资源所用的自然语言
  5. Content-Length : 指明实体正文的长度
  6. Keep-Alive : 保持连接的时间

常见的状态吗:

  1. 404 请求资源不存在
  2. 200 客户端请求成功
  3. 400 客户端请求有语法错误
  4. 500 服务端发生不可预期的错误

浏览器的缓存设置

在浏览器端Ctrl+F5可以重新发起请求而不使用缓存数据。发出报文的请求头里面相关字段告诉服务器,不要缓存要最新的数据。

这两个字段是:Pragma:no-cache Cache-Control:no-cache

DNS域名解析过程

1.用户输入URL,浏览器检查自身有没有缓存该域名的IP地址。

2.如果没有,浏览器检查操作系统缓存中是否有这个DNS解析结果。

3.如果缓存中还没有,则操作系统会把这个域名发送给LDNS(Local DNS)即本地域名服务器。

4.如果LDNS中还没有,则只能去Root Server域名服务器中请求解析了。这样的情况比较罕见,因为全球只有13台左右这样的服务器。

5.根域名服务器会返回一个本地域名服务器所查域的主域名服务器(gTLD Server)地址。

6.LDNS向gTLD发送请求。

7.gTLD接受此请求,返回一个此域名对应的Name Server域名服务器的地址。这个Name Server通常就是你注册的域名服务器。

8.Name Server返回该域名对应的IP和TTL值,然后Local DNS Server会缓存这个对应关系,缓存时间由TTL控制。

9.解析结果返回用户。用户根据TTL值缓存此对应关系。

清除缓存域名

Local DNS的缓存由TTL来控制,很难人工介入。但是本地机器的缓存可以用以下命令来清除:

  1. Windows: ipconfig /flushdns
  2. Linux: /etc/init.d/nscd restart

几种域名的解析方式

域名解析记录主要分为:A 记录、MX记录、CNAME 记录、NS记录和 TXT记录

A记录:A 代表的是Address,用来指定域名对应的IP地址。域名可以多对一但是不能一对多。

MX记录:Mail Exchange,就是讲某个域名下的邮件服务器指向自己的Mail Server。

CNAME记录:别名解析。将一个域名设置一个或者多个别名。

NS记录:为某个域名指定DNS解析服务器。

TXT记录:为某个主机名或者域名设置文字说明。

CDN

工作机制

CDN即内容分发网络。通过现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络边缘,使用户可以就近取得所需要的内容,提高用户网站的响应速度。

负载均衡

对工作任务进行平衡、分摊到多个操作单元上去,共同完成任务。

三种架构:

1.链路负载均衡

由DNS解析来完成负载均衡,用户直接访问目标服务器,而不需要经过其他的代理服务器,通常访问速度会更快。

缺点:一旦某台服务器挂掉,由于用户本地和Local DNS都有缓存,缓存没有及时更新,则造成用户无法访问这个域名。

2.集群负载均衡

############硬件负载均衡:由一台专门的硬件设备负责转发请求,太贵一般公司用不起,但是性能很好(一分钱一分货啊)

############软件负载均衡:由多台代理服务器组成。网络延时较长。

3.操作系统负载均衡

利用操作系统级别的软中断或者硬件中断来完成。(说实话不太懂,以后看了专门的知识在来完善吧!)

深入理解JavaWeb技术内幕(一)的更多相关文章

  1. 深入理解JavaWeb技术内幕之中文编码

    为什么要编码 1.计算机中存储信息的最小单元是1个字节,所能表示的字符范围为0~255个. 2.人类要表示的符号太多,无法用1个字节来完全表示. 常见的编码类型 ASCII码 总共128个,用1个字节 ...

  2. 深入分析JavaWeb技术内幕(修订版)》【PDF】下载

    <深入分析JavaWeb技术内幕(修订版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062569 内容简介 <深入分析 ...

  3. 《深入分析JavaWeb技术内幕》学习笔记

    第一章 深入Web请求过程 1.1 B/S网站架构概述 HTTP协议采用无状态的短连接的通信方式.通常一次请求就完成一次数据交互,通常也对应一个业务逻辑. 当在浏览器里输入一个URL,首先会请求DNS ...

  4. 深入分析JavaWeb 技术内幕

    1,通过浏览器请求一个资源,会发生以下几种过程 1) http的解析过程,包括对于http请求头和响应头中指令(控制用户浏览器的渲染行为和 服务器的执行逻辑)的解析 2)DNS的解析过程(根据域名获取 ...

  5. 走进JavaWeb技术世界开篇:JavaWeb技术汇总

    微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频 ...

  6. 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口

    Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...

  7. Java并发编程与技术内幕:线程池深入理解

    摘要: 本文主要讲了Java当中的线程池的使用方法.注意事项及其实现源码实现原理,并辅以实例加以说明,对加深Java线程池的理解有很大的帮助. 首先,讲讲什么是线程池?照笔者的简单理解,其实就是一组线 ...

  8. 2本Hadoop技术内幕电子书百度网盘下载:深入理解MapReduce架构设计与实现原理、深入解析Hadoop Common和HDFS架构设计与实现原理

    这是我收集的两本关于Hadoop的书,高清PDF版,在此和大家分享: 1.<Hadoop技术内幕:深入理解MapReduce架构设计与实现原理>董西成 著  机械工业出版社2013年5月出 ...

  9. 深入分析Java Web技术内幕(修订版)

    阿里巴巴集团技术丛书 深入分析Java Web技术内幕(修订版)(阿里巴巴集团技术丛书.技术大牛范禹.玉伯.毕玄联合力荐!大型互联网公司开发应用实践!) 许令波 著   ISBN 978-7-121- ...

随机推荐

  1. C#中Dispose、析构函数、close的区别

    一.Close与Dispose这两种方法的区别 调用完了对象的Close方法后,此对象有可能被重新进行使用:而Dispose方法来说,此对象所占有的资源需要被标记为无用了,也就是此对象要被销毁,不能再 ...

  2. _ConnectionPtr.CreateInstance(__uuidof(Connection))“不支持此接口”错误解决

    最近在换了win7 64位的系统,今天突然发现以前写的ADO连接数据库的代码编译后在windows2003下会执行到: _ConnectionPtr.CreateInstance(__uuidof(C ...

  3. setInterval && setTimeout || 定时器

    来自w3school的解释 定时器setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterva ...

  4. JQuery中的省市联动

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  5. Tomcat学习笔记 - 错误日志 - Tomcat访问Manager apps出现401 Unauthorized错误

    原因是配置文件中未指定管理员身份. 打开tomcat>conf>tomcat-user.xml文件,添加如下代码: <role rolename="admin-gui&qu ...

  6. 自动运行native2ascii 命令的Bat文件的编写

        使用eclipse开发,对于.properties文件的国际化,如果不使用插件对文件进行转码,则需要使用native2ascii命令自行对文件进行转码.     为了更方面的执行此操作,我将该 ...

  7. ajax创建对象

    <script>     function createAjax(){         var request=false;                   //window对象中有X ...

  8. python一句代码建立树

    from collections import defaultdict def tree(): return defaultdict(tree) 上面的代码不难理解,就是利用递归的方式,创建了一个树的 ...

  9. codecomb 2086【滑板鞋】

    题目背景 我的滑板鞋时尚时尚最时尚 回家的路上我情不自禁 摩擦 摩擦 在这光滑的地上摩擦 月光下我看到自己的身影有时很远有时很近 感到一种力量驱使我的脚步 有了滑板鞋天黑都不怕 题目描述 你在魅力之都 ...

  10. java打印菱形的简单方法

    代码: public class Diamond { /** * 测试main方法 */ public static void main(String[] args) { printDiamond(1 ...