目录:
- HTTP:WEB的基础
- HTTP概述
- URL与资源
- HTTP报文
- 连接管理
- HTTP结构
- WEB服务器
- 代理
- 缓存
- 集成点:网关、隧道和中继
- WEB机器人
- HTTP-NG
- 识别、认证与安全
- 客户端识别与cookie机制
- 基本认证机制
- 摘要认证机制
- 安全HTTP
- 实体、编码与国际化
- 实体和编码
- 国际化
- 内容协商与转码
- 内容发布与分发
- Web主机托管
- 发布系统
- 重定向与负载均衡
- 日志记录与使用情况跟踪
- 参考文章
备注:本文章主要记录《HTTP权威指南》每章节的重要知识点。
1、HTTP:WEB的基础
1.1HTTP概述
|
HTTP事务:
一个HTTP事务由一个HTTP请求与一个HTTP响应组成
|
HTTP方法:
GET: 从服务端向客户端发送命名资源
HEAD: 仅发送命中资源的头部
POST: 将客户端数据发送到服务器网关应用程序
PUT: 将来自客户端的数据存储到一个命名的服务器资源中去
DELETE: 从服务器删除命名资源
TRACE: 用户跟踪报文的传递路径
OPTIONS: 获取制定URL能接受的请求方法
CONNECT: 连接制定的频段。
|
HTTP状态码:
1xx:信息响应类,表示接收到请求并且继续处理
2xx:处理成功响应类,表示动作被成功接收、理解和接受
3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
5xx:服务端错误,服务器不能正确执行一个正确的请求
|
HTTP协议版本:
HTTP/0.9 - 》 HTTP/1.0 -》 HTTP/1.0+ -》 HTTP/1.1 -》 HTTP-NG(又名:HTTP/2.0)
现在1.1是常用版本,HTTP2.0还在研发ing。
|
WEB的结构组件:
|
1.2、URL与资源
|
URI、URL与URN三者之间的区别:
URL与URN都是URI的子集,URI定义了一系列获取资源的地址规范,而两个子集都是在其的基础下构建出来的。目前互联网上基本都使用URL,所以也主要论述URL的相关知识。
|
URL语法:
URL的主要由9个部分构成的通用格式如下:
<scheme>://<user>:<password>@<host>:<port>/<path>:<param>?<query>#<flag>
主要组件介绍:
scheme的方案种类(提供的访问协议):
|
URL的快捷方式:
相对URL与绝对URL:
上文提及的都是绝对URL,相对URL实际上就是一个不完整的URL,关系公式如下:
绝对URL = 基础URL + 相对URL
使用相对路径时,系统会设法把相对路径补全为绝对路径来访问资源,使用相对路径有比较多的好处,其中最为重要的一点就是这个路径能适应于不同的系统,只要把基础路径替换掉即可使用。
自动扩展URL:
浏览器能够自动扩展URL,这就是为什么有时候我们仅仅输入网址的一部分就能访问到相应网页的原因。其中主要由以下两种方式实现自动扩展:
|
URL encoding&decoding:
URL作为网络统一的资源访问器,必然会兼容很多国家不同语言的各种文字编码规范。
对于中文,中文通常不能直接用于URL是的,最好通过url-encoding使用,才能正常在网络上传输。
为了避免安全字符集表示法带来的限制。引入了名为“转义序列”的编码机制。
将所有的不安全的符号,全部通过%(表示转义)+ 在AESii码的十六进制来表示。
具体可以参考:RFC 2396
|
1.3、HTTP报文
HTTP报文就是HTTP程序之间发送、接收、处理的数据块,等于就是HTTP的数据结构。
HTTP使用术语流入(inbound)和流出(outbound)来描述事务处理的方向。
|
HTTP报文的语法:
HTTP报文的结构:
HTTP报文分两大类:请求报文、响应报文,它们的具体语法如下:
从上图可以得知,具体的差异仅仅是请求行。
请求报文:因为用于发起请求访问资源,所以得阐述用什么方法到哪个服务器获取什么资源,所以它就由 method + request-url + version组成。
响应报文:用于对请求的响应,所以主要需要阐述请求的结果与解析这个结果产生的原因,所有它就由 version + statuts-code + reason-phrase组成。
|
起始行详解:
从报文的语法可以得出起始行主要由请求的method+request-url与响应的status-code+reason-phrase,以及通用的version来组成。以下挑选部分重点说明一下:
method,7种请求方法如下所示:
status-code+reason-phrase:
status-code就是HTTP状态码是给计算机识别错误用的,而reason-phrase原因短语是给人来识别错误。
状态码分类如下:
|
首部详解:
首部主要有以下五种类型:
更加具体字段解析,请参考《HTTP权威指南》。
|
实体详解:
略。
之后章节再说明。
|
1.4、HTTP连接管理
|
HTTP与TCP:
几乎所有的HTTP协议的通信都是由TCP/IP协议来承载的,而且HTTP是应用层协议,TCP是传输层协议,所以真正实现连接、传输、断开的是TCP协议,但可以通过HTTP协议的配置来定义TCP在实现时的效果。
HTTP紧挨着TCP,所以HTTP事务的性能很大程度上取决于底层的TCP通道的性能,而传输数据的延迟的其实还好,造成延迟最严重的部分是TCP的连接的耗时。所以大部分的优化手段都是针对TCP的连接设计的。
影响TCP性能的五个主要要素:
所以进行HTTP优化的关键就是尽量去避免太多的TCP连接,尽可能地复用TCP传输通道,因为上面的1、2点都与连理连接相关的。
|
HTTP连接的处理:
1、Connection首部
可以用connection来主动关闭一个HTTP连接。
2、串行书屋处理延迟
通常一个HTML页面需要发起多个HTTP事务才能实现页面的显示。若串行去实现资源请求,大量的时间都会耗在TCP的连接与慢启动。
现存的几种提高HTTP连接性能的方案:
|
HTTP的持久连接的实现:
通过设置Connection字段与Keep-Alive字段可以控制HTTP为长连接。如下:
Connection:keep-alive
keep-alive:max=5,timeout=120
其中max=5,指明还可以又5个事务复用这个HTTP连接,这不是一个承诺值。
其中timeout = 120,指明这个HTTP连接的生命周期由120s。
但可以通过设置Connection:close来实现关闭一个HTTP连接。
|
2、HTTP结构
2.1、WEB服务器
|
WEB服务器需要处理的事务:
1、WEB服务器的常规任务
2、接收请求报文的连接输入输出结构,一共有如下四种:
单线程IO结构:只建立一条线程,每次执行一个HTTP任务。
多线程IO结构:同时建立多个线程执行HTTP事务。
复用的IO结构:建立一个线程,但分时复用,那个事务需要进行数据处理则到线程中进行计算。
复用的多线程IO结构:原理与复用的IO结构一样,但是多个线程在执行。
上面四种结构,复用的多线程IO结构效率是最好的,以后的软件设计需要这种多线程任务调用也可以考虑这种方案。
3、重定向
WEB服务器有时会返回重定向响应,并且将重定向的URL置于Location中,让客户端能对新的url地址发起新的请求,通常有以下情况需要发起重定向:
|
2.2、代理
|
1、web代理服务器的概念
WEB代理(proxy)服务器是网络的中间实体。代理是处理服务端与客户端之间,在各个端点回来处理经过它的报文,所以能在代理服务中部署很多的服务,将部分辅助功能从服务器中分离出去。
2、代理服务器的类型
私有代理:只为一个用户进行数据处理
共享代理:为N个用户进行数据处理与转发,集中式代理的成功与效率更好。
3、代理与网关
代理是多个协议的应用程序,是为了部署一些特殊的业务而存在的,如防火墙、WEB缓存。
网关主要协议的转换,若HTTP/FTP,就是实现HTTP流量转FTP流量而部署的。
|
|
2.3、缓存
|
WEB缓存概述与作用:
1、WEB缓存的作用:
2、WEB缓存的拓扑结构
缓存大概分两种:
|
WEB缓存服务器的运作机制:
1、WEB缓存服务器对一条HTTP请求的处理流程如下:
上面的流程其实与WEB服务器处理HTTP请求的流程是十分相似的,因为WEB缓存服务器实际上就是WEB服务器的代理,它替代WEB服务器接收请求并作响应的响应。
2、新鲜度检测
而WEB缓存最大的特点是新鲜度检测这个步骤,这个步骤通过报文的Cache-control、expires字段来检测文件是否过期,若过期则去询问服务器文档是否发生改变,若有则请求服务器重新获取一份文档,若无则更新该文档的cache-control、expires字段。而且新鲜度检查当且近且发生在用户发起请求的时机,这样可以减少无谓的操作。
|
HTTP如何实现缓存操作:
通过设置各种HTTP header的字段可以设置不同的缓存效果。
如设置缓存时间或等级的Cache-control、Expires,
如优化服务器再验证(新鲜度检查)的If-Modified-Since:Date、If-None-Match。
1、Cache-control与Expires
其中Expres是HTTP1.0的规范已经在逐渐淘汰,而Cache-Controll才是现在的主流的,Cache-Control的完整用法如下所示:
Cache-Control:no-store ,不会缓存在本地,用完立即删除。
Cache-Control:no-cache ,会缓存在本地,但每次使用前都必须经过新鲜度检测。
Cache-Control:must-revalidate ,让服务器严格遵守过期信息。
Cache-Control:max-age ,检测过期时间,若过期则需要进行新鲜度检查并更新缓存。
2、If-Modified-Since:Date与If-None-Match
If-Modified-Since:Date与If-None-Match的本质都是优化WEB缓存新鲜度检查者一块,把检查新鲜度的GET请求与获取新的文档的GET请求进行合并,提高效率。
但它们的差异是If-Modified-Since:Date是通过过期时间来判断文档是否过期,因为若服务器的文件进行修改则其修改时间就会不一致,则会请求相应文档。而If-None-Match是通过实体标签来比对是否修改的。
|
2.4、集成点:网关、隧道和中继
|
网关:
1、网关的主要作用:
2、客户端网关与服务端网关
可以用一个斜杠来分隔客户端和服务端协议,并以此对网关进行描述:
<客户端协议>/<服务端协议>
服务器端网关(server-side gateway)通过HTTP与客户端对话,通过其他协议与服务端通信(HTTP/*)
客户端网关(client-side gateway)通过其他协议与客户端对话,通过HTTP协议与服务器通信(*/HTTP)
3、协议网关
协议网关就是负责协议转换的效果。如HTTP/FTP网关就是把HTTP转成FTP协议流量的网络设备。
4、安全网关
HTTP/HTTPS 服务器端安全网关:通过将组织内所有输入的WEB请求进行加密,直接走SSL通道进行传输HTTPS报文。
HTTPS/HTTP 客户端安全加速器网关:部署在服务器之前,只接收安全的HTTPS流量。
5、资源网关
最常见的网关,应用程序服务器,会将目标服务器与网关结合在一个服务器设备中实现。
客户端通过HTTP报文直接与服务器网关进行通信,然后服务器网关通过通过程序API转发响应的报文信息给应用程序,然后再将应用程序的输出封装成HTTP请求发送回客户端。
|
隧道:
1、建立HTTP隧道
通过HTTP的Connect方法可以建立隧道。通过Connect方法可以与任意协议的任意服务器建立TCP连接。
CONNECT请求的语法:
{
CONNECT
www.baidu.com:443 HTTP/1.0
User-agent:Mozilla/4.0
}
CONNECT响应的语法:
{
HTTP/1.0 200 Connection Established
}
原因短语描述必须为“Connection Established”,但响应中不包括Content Type首部,以为此时连接只是对原始字节进行转接,不再是报文的承载者,所以不需要内容类型。
2、SSL隧道与HTTP/HTTPS网关的对比
HTTP/HTTPS网关的实现方式有如下三个缺点:
而隧道的话,是直接地客户端与服务端进行SSL的HTTP通信,所以无需中间代理。
|
中继:
中继是没有完全遵循HTTP规范的简单的HTTP代理。中继负责处理HTTP中建立连接的部分,然后对字节进行盲转发。
所以中继只负责建立连接与盲转发的工作。
|
2.5、WEB机器人
WEB机械人又称“爬虫”、“蜘蛛”、“机器人”。通过递归的方式解析每个页面,并获取每个页面中包含的URL跳转地址与页面资源、文档,对资源文本进行分析整理成自己的数据库,然后按照预先设定的跳转规则自动地浏览网页,这就是WEB机器人。
WEB机器人的最关心的两个技术点:
|
2.6、HTTP-NG
还没研发成功,略。
|
3、识别、认证与安全
3.1、客户端识别与cookie机制
因为HTTP最初是一个匿名的通信协议,但WEB站点希望能提供个性化的接触,若提供个性化的问候、内容推荐、信息管理归档、记录会话等,所以就设计出以上几种HTTP客户端识别方案。
|
承载用户信息的HTTP首部:
From、User-agent、referee字段都不足以实现可靠的用户识别,仅仅能实现简单的识别。
|
客户端IP地址跟踪,通过用户的IP地址对其进行识别:
早起的WEB曾经尝试使用IP地址作为唯一的标识符来使用,但这个方案也有不少缺点:
所以IP地址的方案也不大可行。
|
用户登录,用认证方式来识别用户:
通过要求用户输入用户名与密码来进行认证(登陆)来显式地询问用户身份。
HTTP包含一种内建机制,可以通过WWW-Authenticate首部和Authorization首部向WEB站点传送用户信息。大致流程如下:
(a)客户端发起一个请求
(b)服务端返回401 login required,需要填写www-authenticate字段,网页显示登陆页面
(c)用户输入完后,转化成authorization字段
(d)验证成功。
|
胖URL,一种在URL中嵌入识别信息的技术:
有些站点会为每个用户生成特点版本的URL来跟踪用户的身份。改动后包含用户信息的URL称为胖URL(fat URL)。
通过生成用户ID,并将用户ID添加到URL中,如亚马逊、淘宝、CSDN技术博客、简书等网站经常使用这个技术。
|
Cookie,强大而高效的持久化身份识别技术:
Cookie是当前识别用户,实现持久化会话的最好方式。
1、Cookie的类型主要分为会话cookie与持久cookie:
2、Cookie的工作机理:
(a)客户端发送请求到服务器。
(b)因为是首次访问,服务器通过set-cookie设置给当前访问的客户端打上标签。
(c)以后客户端的每次访问,都必须得带上已经设置好的cookie,服务端通过获取cookie来识别用户。
3、Cookie的首部
4、Cookie与会话跟踪
可以用Cookie在用户与某个Web站点进行多项事务处理时对用户进行跟踪。下面我们用Amazon购物网站为例子说明Web服务器如何通过一系列的充电箱、URL重写以及cookie设置来附加标识信息。
(a)首先用户访问www.amazon.com网站
(b)服务器将客户端重定向到一个电子商务软件的URL上
(c)对重定向重新发起一个URL请求
(d)服务端用set-cookie设置两个会话cookie。
(e)客户端根据cookie内容,拼接成一个胖URL,并重新发起请求
(f)服务器重定向到home。html,并附加两个ubid身份标识
(g)重定向到home.html,并将四条cookie都添加到header中,以后对该网站发起请求均会附加上这四条cookie信息
(h)服务器返回带有用户个性化设置的网页。
5、Cookie与缓存
略。
6、Cookie与隐私安全性
略。
|
3.2、基本认证
|
基本认证机制:
基本认证与摘要认证都是HTTP定义的两个官方的认证协议,下面来概要说明基本认证的具体流程与实现。
基本认证是基于HTTP提供的“质询/响应认证框架”实现的,其具体流程如下图所示:
下图说明了质询/响应认证框架的流程中,具体是如何实现的:
可以看出主要是服务器通过WWW-Authenticate字段来告知客户端需要认证,且当前认证的安全域是哪个。
然后客户端用authorization字段将用户名与密码发送出去。
最后认证成功的话,服务端还会返回authentication字段来告知相应的附加信息。
下图为一个认证的具体事例:
|
基本认证缺陷:
这一切说明,基本认证只适合用于友好的环境,又或者隐私保护需求不强的环境里。
|
3.3、摘要认证
|
摘要认证机制:
摘要认证是HTTP提供的另外一种官方认证协议,虽然并不是最安全的协议,但在很多程度上修复了基本认证的一些严重缺陷,其中基本认真就是直接把账号与密码放在网络上传输的,而摘要认证的基本也是用了HTTP的质问/响应框架,但在网络上传输的是摘要而不是明文。
摘要认证遵循的箴言是“绝对不通过网络发送明文密码”,而是会发送摘要,这是密码的不可逆干扰码。
摘要认证的工作原理如下图所示:
其中摘要的生成公式如下:
<摘要生成算法>(用户名+密码+随机数+其他参数)。
摘要认证的握手机制如下图所示:
(1)服务器产生随机数
(2)服务器通过www-authenticate字段发送域、随机数、可选算法
(3)选择算法,生成摘要
(4)通过authentication字段发送摘要相应
(5)服务器进行验证
(6)若验证成功,发送authentication-info,补充附加信息
(7)客户端验证rspauth摘要
其中可以通过预先授权的方式来减少GET请求,从而提高请求响应的效率,如下图,每次完成一次认证,服务端就会就成功报文中预先添加下一次请求所需的随机数,那么下一次连接就可以去掉质询的步骤了。
|
3.4、安全HTTP
本章提供了一种更复杂、更安全的技术,通过数字密码来保护HTTP事务免受窃听和篡改的侵害。
|
数字加密的基础知识:
1、密码与秘钥
密码是一套编码方案,一种特殊的报文编码方式和一种稍后使用的相应解码方式的集合体。
秘钥是输入到密码编码算法中的一个特殊的参数,输入输出会根据秘钥参数值的一样一,而有所不同。
现在大部分的加解密算法是公开的,正因为秘钥的存在才让大家能用这些加解密算法来保护自己的信息。
2、对称加密与非对称加密
对称加密就是使用相同的秘钥对明文进行加密、解密,如AES、DES算法
而非对称加密就是使用不同的秘钥对明文进行加密、解密,如RSA算法。
加解密都可以通过枚举攻击来破解密码,也就是通过测试所有的秘钥来实现解密,所以若秘钥长度越长,需要测试的数据就越多,也就越安全。
3、公开秘钥加密系统
通过非对称加密的方式,让所有的子客户端都拥有相同的服务器加密公钥,然后生成会话数字证书(证书内包含自己的公钥),用服务器公钥加密数字证书中的秘钥,再发送给服务端,从而实现安全的通信。
4、数字签名与数字证书
数字签名就是附加在保温上的特殊加密校验码,使用数字签名有以下两个好处:
数字证书:包含了由某个受到信任组织担保的用户或公司的相关信息。数字证书主要包括以下内容:
目前数字证书大多以X509作为标准格式。
|
HTTP的安全形式HTTPS:
1、HTTPS概念
HTTPS的实现实际上就是在应用层与传输层中间添加一个安全层(SSL或者TLS),来实现报文的加解密,如下图所示:
也就是说,在TCP协议上传输的是SSL/TLS流量,而不是HTTP流量,所以得经过安全层进行解析后,也就是SSL流程转成HTTP流程,应用层代码才能理解报文。
所以在传输中,数据是安全了,只要安全层的秘钥没有泄露。
2、建立安全连接
建立HTTPS连接其实与建立HTTP连接是十分相似的,就是差别在使用的是443端口,而且得在建立TCP连接后,进行SSL安全参数握手,在关闭TCP连接前,得先关闭SSL连接,如下图所示:
SSL握手的实现:
|
4、实体、编码与国际化
略。
5、内容发布与分发
略。
6、参考文章
HTTP权威指南
|