HTTP及Web核心基础

1. HTTP服务重要基础

1.1 用户访问网站基本流程

(1)客户端从浏览器输入“www.baidu.com”网站地址,回车后,系统首先会查找系统本地的DNS缓存及hosts文件信息,查找是否存在www.baidu.com域名对应的IP解析记录,如果有就直接获取IP地址,然后去访问这个IP地址对应域名“www.baidu.com”的服务器,一般第一次请求时,本地DNS缓存是没有解析记录的,而hosts文件,多在内部临时测试时使用。
(2)如果本地客户端hosts及DNS缓存没有www.baidu.com域名对应的解析记录,那么系统会把浏览器的解析请求发送给客户端本地设置的DNS服务器地址(通常称此DNS为LDNS,及Local DNS)解析,如果LDNS服务器的本地缓存有对应的解析记录就会直接返回IP地址给客户端,如果没有,则LDNS会负责继续请求其他的DNS服务器。
(3)LDNS会从DNS系统的(.)根开始请求“www.baidu.com”域名的解析,针对各个层级的DNS服务器进行一系列的查找,最终会查找到baidu.com域名对应的授权DNS服务器,而这个授权DNS服务器正式企业购买域名时用于管理域名解析的服务器,这个授权服务器会有www.baidu.com域名对应的IP解析记录,如果此时没有,就表示企业的域名管理人员没有为www.baidu.com域名做解析设置,即网站还没有架设好。
(4)baidu.com域名的授权DNS会把www.baidu.com对应的最终IP解析记录发送给LDNS。
(5)LDNS把收到来自授权DNS服务器www.baidu.com对应的IP解析记录发送给客户端浏览器,并且在LDNS把本地域名和IP对应的解析缓存起来,以便下一次更快的返回相同解析请求的记录,这些缓存记录在指定的时间(DNS TTL 值控制)内不会过期。
(6)客户端浏览器获取到了www.baidu.com的对应IP地址,接下来浏览器会请求获得的IP地址对应的网站服务器,网站服务器接收到客户请求并响应处理,将客户请求的内容返回给客户端浏览器。

1.2 DNS树状结构图

image.png
总结:访问域名时,如:www.baidu.com,实际上是从后往前访问的,就是.,com,baidu,www

2. DNS解析详细流程

(1)客户端从浏览器输入“www.baidu.com”网站地址,回车后,系统首先会查找系统本地的DNS缓存及hosts文件信息,查找是否存在www.baidu.com域名对应的IP解析记录,如果有就直接获取IP地址,然后去访问这个IP地址对应域名“www.baidu.com”的服务器,一般第一次请求时,本地DNS缓存是没有解析记录的,而hosts文件,多在内部临时测试时使用。
(2)如果本地客户端hosts及DNS缓存没有www.baidu.com域名对应的解析记录,那么系统会把浏览器的解析请求发送给客户端本地设置的DNS服务器地址(通常称此DNS为LDNS,及Local DNS)解析,如果LDNS服务器的本地缓存有对应的解析记录就会直接返回IP地址给客户端,如果没有,则LDNS会负责继续请求其他的DNS服务器。
(3)LDNS会从DNS系统的(.)根开始请求“www.baidu.com”域名的解析,根DNS服务器再全球一共只有13台,根服务器下面是没有www.baidu.com域名解析记录的,但是有www.baidu.com对应的顶级域名.com的解析记录,因此,根会把.com对应的DNS服务器地址返回给LDNS。
(4)LDNS获取到.com对应的DNS服务器地址后,就会去.com服务器请求www.baidu.com域名的解析,而.com服务器下面也没有www.baidu.com域名的解析记录,因此,根会把baidu.com对应的DNS服务器地址返回给LDNS。
(5)LDNS获取到baidu.com对应的DNS服务器地址后,就会去baidu.com服务器请求www.baidu.com域名的解析记录,baidu.com域名对应的DNS服务器是该域名的授权DNS服务器,这个DNS服务器正是企业购买域名时管理解析所在的服务器(也可能是自建的授权DNS服务器),这个服务器会有www.baidu.com对应的解析记录,如果此时没有,就表示企业的域名管理人员没有为www.baidu.com域名做解析设置,即网站还没有架设好。
(6)baidu.com域名DNS服务器会把www.baidu.com对应的IP解析记录发送给LDNS。
(7)LDNS把收到的来自授权DNS服务器www.baidu.com对应的解析记录发送给客户端浏览器,并且LDNS会在本地把域名和IP的对应解析记录缓存起来,以便下一次更快的返回相同解析请求的记录。

image.png

3. HTTP协议

3.1 HTTP协议简介

HTTP协议,中文名为“超文本传输协议”。
HTTP协议中有很多应用,WWW服务(Web服务)就是其中之一。
HTTP协议端口:80
HTTPS协议端口:443

3.2 HTTP请求方法

在HTTP通信中,每个HTTP请求报文到包含一个方法。
用来告诉WEB服务器端需要执行什么具体的动作。
常用的HTTP请求方法如下:
HTTP请求方法 作用描述
GET 客户端请求指定资源信息,服务器返回指定资源(如下载一张图片)
HEAD 只请求响应报文
POST 将客户端的数据提交到服务器,如注册表单
PUT 从客户端向服务器传送的数据取代指定的文档内容
DELETE 请求服务器删除Request-URI所标识的资源
MOVE 请求服务器将指定的页面移至另一个网络地址

3.3 HTTP状态码

HTTP状态码是用来表示Web服务器响应HTTP请求状态的数字代码。
每当Web客户端想Web服务器发送一个HTTP请求时,Web服务器都会返回一个状态响应码。

不同范围的状态码及其对应的作用

状态码范围 作用描述
100-199 用于指定客户端相应的某些动作
200-299 用于表示请求成功
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息
400-499 用于指出客户端的错误
500-599 用于指出服务器端自身的错误

生产场景中常见的状态码及其对应的作用

状态码 详细描述说明
200 - OK 服务器成功返回网页,这是成功的HTTP请求返回的标准状态码
301 - Moved Permanently 永久跳转,所有请求的网页将永久跳转到被设定的新的位置。例如:从etiantian.org跳转到www.etiantian.org
403 - Forbidden 禁止访问,这个请求是合法的,但是服务端因为匹配了预先设置的规则而拒绝响应客户端的请求,此类问题一般为服务器或服务权限配置不当导致。
404 - Not Fount 服务器找不到客户端请求的指定页面,可能是客户端请求了服务器上不存在的资源所致。
500 - Internal Server Error 内部服务器错误,服务器遇到了意外情况,不能完成客户端的请求。这是一个较为笼统的错误,一般为服务器的设置或内部程序问题所致。例如:SELinux开启,而又没有为HTTP设置规则许可,客户端访问的就是500。
502 - Bad Gateway 坏的网关,一般是代理服务器请求后端服务时,后端服务不可用或没有完成响应网关服务器。一般为反向代理服务器下面的节点出问题所导致。
503 - Service Unavailable 服务当前不可用,可能是因为服务器超载或停机维护导致,或者是反向代理服务器后面没有可以提供服务的节点。
504 - Gateway Timeout 网关超时,一般是网关代理服务器请求后端服务时,后端服务没有在特定的时间内完成处理请求,一般是由于服务器过载导致没有在指定的时间内返回数据给前端代理服务器。

查看响应头(返回状态码)

[root@web01 ~]# curl -I www.baidu.com
HTTP/1.1 200 OK   /---状态码
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 277
Content-Type: text/html
Date: Fri, 26 Apr 2019 03:48:34 GMT
Etag: "575e1f60-115"
Last-Modified: Mon, 13 Jun 2016 02:50:08 GMT
Pragma: no-cache
Server: bfe/1.0.8.18

[root@web01 ~]# curl -I www.baidu.com///dasdfasdfasf
HTTP/1.1 302 Found  /---状态码
Cache-Control: max-age=86400
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
Date: Fri, 26 Apr 2019 03:49:51 GMT
Expires: Sat, 27 Apr 2019 03:49:51 GMT
Location: https://www.baidu.com/search/error.html
Server: Apache
X-Pad: avoid browser bug

生产环境常见HTTP状态码的博客文章见 http://oldboy.blog.51cto.com/2561410/716294

3.4 HTTP报文

HTTP报文分为两种:
(1)从Web客户端发往Web服务端的HTTP报文,称为请求报文(Request Message)
(2)从Web服务端发往Web客户端的报文,称为响应报文(Response Message)
两种报文格式类似

3.4.1 HTTP请求报文介绍

HTTP请求报文由请求行、请求头部、空行和请求报文主体组成。如下
报文格式 报文信息
起始行 协议及版本号、数字状态码、状态信息
响应头部 字段名1:值1
字段名2:值2
……
例如:
Accept: image/gif, image/jpeg
Accept-Language: zh-cn
……
空白行 空白无内容
请求主体报文 GET方法没有请求报文主体,POST方法才有

(1)请求行

请求行是请求报文的第一行,用来说明客户端想要做什么。
内容由请求方法、URL、和HTTP协议版本3个字段组成。如下
请求方法字段示例 URL字段示例 HTTP协议版本
GET /index.html HTTP 1.1

(2)请求头部

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号(:)分隔。
请求头部的作用是客户端把请求的相关信息告诉服务器,如下
请求头信息 说明
Accept: image/gif, image/jpeg 媒体类型
Accept-Language: zh-cn 语言类型
Accept-Encoding: gzip, deflate 支持压缩
User-Agent: Mozilla/4.0(compatible; MSIE 6.0; Windows NT; ...) 客户端支持类型
Host: www.etiantian.org 主机名

(3)空行

最后一个请求头部信息之后是一个空行,发送回车符和换行符,通知Web服务器空行以下不会再有请求头部信息。

(4)请求报文主体

请求报文主体中包括了要发送给Web服务器的数据信息。
请求报文主体不会应用于HTTP的GET命令方法,而是应用于POST方法,POST方法适用于需要客户填写表单的场景。

3.4.2 HTTP响应报文介绍

HTTP响应报文主体由起始行、响应报文头部、空行和响应报文主体几个部分组成,和HTTP请求报文类似。
如下:
报文格式 报文信息
起始行 协议及版本号、数字状态码、状态信息
响应头部 字段名1:值1
字段名2:值2
……
例如:
Content-Type: text/html; charset=utf-8
Content-Length:78
……
空行 空白无内容
响应报文主体
oldboy's blog


I am oldboy,mysql blog is http://oldboy.blog.51cto.com

(1)起始行

响应报文的起始行也叫状态行,用来说明服务器响应客户端请求的状况。
一般为协议及版本号、数字状态码、状态情况。例如:HTTP 1.1 200 OK

(2)响应头部

和请求报文类似,起始行的后面一般有若干个头部字段。
每个头部字段都包含一个名字和一个值,两者之间用冒号分隔。
头部结尾也以一个空行结束

(3)空行

最后一个响应头部信息之后是一个空行,发送回车符和换行符,通知客户端空行下文无头部信息。

(4)响应报文主体

响应报文主体中装载了要返回给客户端的数据。
这些数据可以是文本,也可以是二进制信息(如图片、视频)。

3.4.3 HTTP协议原理及重点分析

用户访问网站流程.jpg

4. HTTP资源

4.1 URL介绍

URL,简单理解为网站地址(网址)

URL格式

4.2 URI介绍

URI,简单理解为网站地址和邮件地址。

URI格式

4.3 静态网页资源

(1)静态网页资源介绍

静态网页是相对于动态网页而言的,是指没有后台数据库、不包含程序(如PHP、JSP、ASP)和可交互的网页。

(2)静态网页资源特点

1)每个页面都有一个URL,且URL一般以.htm、.html、.shtml等为后缀,而且不包含问号和&等特殊字符。
2)网页内容固定不变,容易被搜索引擎收录,且是实实在在保存在服务器上的文件实体,每个网页都是一个独立的文件。
3)网页没有数据库支持,交互性差,功能实现少。
4)客户端解析,而不是服务端解析,效率更高。
5)网页一旦发布完成,就不会改变(除非人工修改)
6)存储在类似于NFS这样的存储里
7)内容来源:核心-用户上传的图片视频等。程序员开发的代码-.html、.js、.css

(3)静态网页架构思想

在高并发、高访问的场景下做架构优化,关键就是把动态网页转换成静态网页,而不是直接请求数据库和动态服务器,并且可以把静态内容推送到前端缓存(或CDN)中提供服务,这样可以提升用户体验,节约服务器成本。

4.4 动态网页资源

(1)动态网页资源介绍

动态网页是相对于静态网页而言的。
动态网页的URL后缀为.asp、.aspx、.php、.js、.do、.cgi等。
动态网页地址中会包含问号?和&,而且大多数情况下,后端有数据库支持。

(2)动态网页资源特点

1)常见扩展后缀名.asp、.aspx、.php、.js、.do、.cgi等。
2)网页一般以数据库技术为基础,大大降低了网站维护的工作量。
3)采用动态网页技术的网站可以可实现更多的功能,如用户注册、用户登录、在线调查、投票、用户管理、订单管理、发博文等。

(3)动态网页架构思想

静态网页的性能是动态网页的10-30倍,且动态网站效率低下,并发能力也很低,在高并发场景尽可能的转成静态网页。
动态转静态应根据业务需求设计,以免出现数据不一致的情况。

4.4 伪静态网页

(1)伪静态网页介绍

伪静态就是通过某些技术(如rewrite)把动态网页的URL地址伪装成静态网页的URL地址,但实际上用户访问的还是动态网页,知识URL看起来是符合静态URL的特征的。
而且可以便于搜索引擎收录,让更多的用户访问到。

(2)伪静态网页缺点

不能真正提升网站的访问效率性能,从理论上来说,还会降低网站性能,没有动态转静态访问效率高。

(3)伪静态网页总结

1)利用rewrite技术将动态网页伪装成静态网页(URL地址改写)
2)便于搜索引擎收录,提升用户访问量及用户体验
3)访问性能没有提升,并且做伪静态会消耗资源,网站性能下降
4)尽可能做真正的动态转静态
5)并发量不是很大或动态更新过于频繁的时候,用rewrite实现伪静态也可以
6)伪静态网页的实现过程一般都是由运营和产品提出需求,开发和运维共同实现的

5. 网站流量度量术语

5.1 IP

IP即独立IP,这里指独立的IP数,独立IP数是指不同的IP地址的计算机访问网站时被计算的总次数。
独立IP数是衡量网站流量的一个重要指标。
一般一天24小时内相同IP地址的客户端访问网站页面只被计算1次。

5.2 PV

PV即访问量,也称为页面浏览,即页面浏览量或点击量,不管客户端是否相同,也不管独立IP是否相同,用户每次访问一个网站页面都会被计算一次pv。
PV是网站被访问的页面数量的一个指标,但并不能直接反映有多少人访问了这个网站。

5.3 UV

UV即独立访客,同一台客户端(PC或移动端)访问网站被计算为一个访客。
24小时内同一台客户端多次访问同一个网站只计算一次UV。
UV一般是以客户端Cookie等技术作为统计依据的,实际统计会有误差。

5.4 企业对IP、PV、UV的度量

(1)对IP的度量方法

1)分析所有WEB服务器的访问日志,对IP地址段去重后计数,这是基本计算方法。
2)第三方统计工具,如谷歌的统计(GA)

(2)对PV的度量方法

1)分析WEB访问日志(需排除JS、CSS及各种图片的日志信息),只计算HTML、PHP等页面数量。
2)第三方统计工具,如谷歌的统计(GA)

(3)对UV的度量方法

1)通过客户端HTTP请求报文分析
2)通过Cookie鉴别
详情见老男孩web集群实战第8章

5.5 IP、PV、UV的区别

IP统计的是客户端不同的IP数量
PV统计的是客户端不同的页面访问量
UV统计的是不同客的户端数量

5.6 并发连接

(1)什么是网站并发连接

网站服务器再单位时间内(1秒或多秒内)能够处理的最大连接数。

工作场景下,统计并发数的基本方法

1)统计当下时刻的Linux网络连接数并发:
netstat -an|grep -i 'est'|wc -l
ss -ant|grep -ic est

2)Nginx Web层active status

(2)其他服务器并发连接

1)QPS
每秒查询率QPS是用于衡量一个特定的查询服务器再规定时间内所处理流量多少的标准。
工作中,DNS系统及数据库等服务的查询性能经常用每秒查询率 来衡量。
2)IOPS
即每秒进行读写(I/O)操作的次数,多用于数据库场合,衡量随机性能。

6. WWW服务软件介绍

(1)Nginx

Nginx是一个开源且高性能、可靠的Http Web服务、代理服务。

开源: 直接获取源代码

高性能: 支持海量并发

可靠: 服务稳定

# 动态服务器(调用动态请求,调用数据库)
tomcat
resin
php
weblogic
jboss

# 静态服务器(没有办法直接连接数据库)
nginx
apache
iis
lighttpd
tengine
openresty-nginx

Nginx和Apache区别

(1)模型不一致
- nginx采用Epool网络模型,Apache采用Select模型
Epool:当用户发起请求,epool模型会直接进行处理,效率高效,并无连接限制
Select:当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下。
- select:每当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下
- Epool:每当用户发起请求,epool模型会直接进行处理,效率高效,并无连接限制

(2)nginx的优点
- 轻量级,同样起web服务,比apache占用很少的资源
- 行并发,nginx处理请求是异步非阻塞,而apache则是非阻塞型,在高并发下nginx能保持低资源低消耗高性能
- 高度模块化的设计,编写模块相对简单,功能模块少
- 社区活跃,各种高性能模块出品迅速
- 代码模块化(易读,便于二次开发,对于开发人员非常友好)
- 互联网公司选择使用nginx
- 适合主流架构趋势,微服务,云架构,中间层
- 统一技术栈,降低维护成本,降低技术跟新成本

(3)apache相对nginx的优点
- rewrite,比nginx的rewrite强大
- 模块超多,基本想到的都可以找到
- 少bug,nginx的bug相对较多
- 超稳定

(4)存在理由
一般来说,需要性能的web服务,用nginx,如果不需要性能只求稳定,那就用apache,后者的各种功能模块实现得比前者强,例如ssl的模块就比前者好,可配置项多。这里需要注意一点,epoll(freebsd上都是kqueue)网络IO模型是nginx处理性能高的根本理由,但并不是所有情况下epoll大获全胜,如果本身提供静态服务的就只有几个寥寥几个文件,apache的select模型或许比epoll更高性能,当然,这只是根据网络io模型的原理作的假设,真正的应用还需要实测了再说的。

面试重点

(1)用户访问网站基本流程
(2)DNS系统解析原理
(3)HTTP协议通信原理,包括HTTP协议、请求报文、响应报文、状态码等
(4)动态、静态及伪静态个概念
(5)IP、PV、UV的概念和区别
(6)并发的概念理解
(7)统计并发和流量的方法
(9)了解常用WWW服务软件特点,如:Apache、Nginx、PHP(FastCGI)、Tomcat等
原文地址:https://www.cnblogs.com/xiets/p/12906920.html