一、基础部分
1. HTTP 请求方法
2. 持久连接
-
Connection: keep-alive
-
特点:只要任意一端没有明确提出断开连接,则保持 TCP 连接状态
-
在 HTTP/1.1 中,所有的连接默认都是持久连接
-
管线化(pipelining):不用等待响应亦可直接发送下一个请求,可以做到并行发送多个请求
3. Cookie 技术
-
Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态
-
Cookie 服务端发送(响应头部字段Set-Cookie通知客户端保存Cookie),客户端保存并在之后的请求中都带 Cookie 信息(Cookie 字段)
二. HTTP 报文
1. 概述
-
HTTP 报文大致可分为报文首部和报文主体两块
-
首部与主体(可以没有)由空行(CR + LF)划分
-
实例
2. 报文(message)和实体(entity)
-
通常,报文主体等于实体主体
-
只有传输中进行编码操作时,实体主体内容变化,二者才会有差异
-
multipart
-
multipart/form-data:在 Web 表单文件上传时使用
-
multipart/byteranges:状态码 206(Partial Content,部分内容)
-
Content-Type:加上boundary=string-separates
-
- 内容协商机制:客户端和服务器端就响应的资源内容进行交涉,然
后提供给客户端最为适合的资源
三. HTTP 状态码
- 200:OK
- 204: No Content(页面不更新)
- 206:Partial Content(Content-Range 指定范围)
- 301:Moved Permanently(永久性重定向)
- 302:Found(临时性重定向)
- 303:See Others(资源URI更新)
- 304:Not Modified(命中协商缓存,无重定向)
- 307:Temporary Redirect(同302,但禁止POST => GET)
- 400:BadRequest(请求报文中存在语法错误)
- 401:Unauthorized(认证失败)
- 403:Forbidden(无访问权限)
- 404:Not Found
- 500:Internal Server Error(执行请求时发生了错误)
- 503: Service Unavailable(服务器超负载或停机维护)
四. 代理、网关、隧道
- 代理:转发功能,中间人
- 网关:转发,非HTTP协议,提高通信的安全性(加密)
- 隧道:透明的通信线路,SSL加密
五. HTTP 首部
1. 概述
-
HTTP 首部字段是构成 HTTP 报文的要素之一
-
请求和响应都会使用首部字段,起到传递额外重要信息的作用
-
给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容
-
结构:
首部字段名: 字段值
Content-Type: text/html
2. HTTP 首部字段类型
- 通用首部字段:请求报文和响应报文两方都会使用的首部
- 请求首部字段
- 响应首部字段
- 实体首部字段
3. End-to-end 首部和 Hop-by-hop 首部
-
逐跳首部(Hop-by-hop Header)
- 只对单次转发有效,会因通过缓存或代理而不再转发
- HTTP/1.1 和之后版本中,如果要使用 hop-by-hop 首部,需提供 Connection 首部字段
- HTTP/1.1 中的8个逐跳首部:
Connection
、Keep-Alive
、Proxy-Authenticate
、Proxy-Authorization
、Trailer
、TE
、Transfer-Encoding
、Upgrade
4. 通用首部字段
-
Cache-Control
通过缓存请求指令和缓存响应指令操作缓存
-
Connection
控制不再转发给代理的首部字段:
Connection: 不再转发的首部字段名
管理持久连接HTTP/1.1 版本的默认连接都是持久连接
HTTP/1.1 之前的 HTTP 版本的默认连接都是非持久连接
Connection: close
:表明服务器端想明确断开连接时
Connection: Keep-Alive
:在旧版本的 HTTP 协议上维持持续连接 -
Transfer-Encoding
规定传输报文主体时采用的编码方式:
Transfer-Encoding: chunked
HTTP/1.1 的传输编码方式仅对分块传输编码有效
使用 q= 来额外表示权重值,当服务器提供多种内容时,将会首先返回权重值最高的媒体类型
5. 请求首部字段
-
Accept
通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级
使用 type/subtype 这种形式,可一次指定多种媒体类型- 示例
- 示例
-
Accept-Charset
用来通知服务器用户代理支持的字符集及字符集的相对优先顺序
示例:Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
-
Accept-Encoding
用来通知服务器用户代理支持的内容编码及内容编码的相对优先顺序
示例:Accept-Encoding: gzip, deflate
-
User-Agent
会将创建请求的浏览器和用户代理名称等信息传达给服务器
6. 响应首部字段
-
Accept-Ranges
可指定的字段值有两种
可处理范围请求时指定其为 bytes
反之则指定其为 none -
实体首部字段
-
Allow
通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法
当服务器接收到不支持的 HTTP 方法时,会以状态码405 Method Not Allowed 作为响应返回 -
Content-Encoding
会告知客户端服务器对实体的主体部分选用的内容编码方式
主要采用 4 种内容编码的方式:gzip
、compress
、deflate
、identity
-
Content-Language
告知客户端,实体主体使用的自然语言
Content-Language: zh-CN
-
Content-Location
给出与报文主体部分相对应的 URI
-
Last-Modified
指明资源最终修改的时间
7. 为 Cookie 服务的首部字段
8. 其它首部字段
-
X-Frame-Options
属于 HTTP 响应首部
用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题
主要目的是为了防止点击劫持(clickjacking)攻击两个可指定的字段值
- DENY:拒绝
- SAMEORIGIN:同源许可
-
X-XSS-Protection
属于 HTTP 响应首部
是 Do Not Track 的简称,意为拒绝个人信息被收集两个可指定的字段值
- 0:将 XSS 过滤设置成无效状态
- 1:有效
-
DNT
属于 HTTP 请求首部
针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器 XSS 防护机制的开关两个可指定的字段值
- 0:同意
- 1:拒绝
-
P3P
属于 HTTP 响应首部
利用该技术可以让 Web 网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的
六. 访问用户身份认证
1. BASIC 认证( HTTP/1.0)
- 步骤
- BASIC 认证是从 HTTP/1.0 就定义的认证方式
- Base64 编码方式,但这不是加密处理,有被窃听的风险
- 一般的浏览器却无法实现认证注销操作
- 不常用
2. DIGEST 认证( HTTP/1.1)
- 步骤
- 提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制
- 安全等级不高,适用范围有限
3. SSL 客户端认证
-
SSL 客户端认证是借由 HTTPS 的客户端证书完成认证的方式
-
SSL 客户端认证采用双因素认证
SSL 客户端认证不会仅依靠证书完成认证,一般会和基于表单认证组合形成一种双因素认证(Two-factor authentication)来使用
-
SSL 客户端认证必要的费用
费用是指,从认证机构购买客户端证书的费用,以及服务器运营者为保证自己搭建的认证机构安全运营所产生的费用
4. 基于表单认证
- 该认证方法并不是在 HTTP 协议中定义的
- 不具备共同标准规范
- Session 管理及 Cookie 应用
七. 基于 HTTP 的功能追加协议
1. 基于 HTTP 的协议
HTTP 功能上的不足,但又无法完全抛弃。因此产生一些新协议的规则是基于 HTTP 的,并在此基础上添加了新的功能
2.消除 HTTP 瓶颈的 SPDY
-
HTTP 的瓶颈
- 一个连接只可发送一个请求
- 请求只能从客户端发起
- 请求/响应首部不压缩就发送,首部信息越多延迟越严重
- 首部冗长,且每次发送相同的首部造成浪费
- 可任意选择数据压缩格式。非强制压缩发送
-
解决方法
-
Ajax
- 只更新一部分页面,响应中传输的数据量会因此而减少
- 利用 Ajax 实时地从服务器获取内容,有可能会导致大量请求产
生
- Ajax 仍未解决 HTTP 协议本身存在的问题
-
Comet
- 是一种通过延迟应答,模拟实现服务器端向客户端推送(Server Push)的功能
- Comet 会先将响应置于挂起状态,当服务器端有内容更新时,再返回该响应
- 一次连接持续时间长,会消耗更多的资源
- Comet仍未解决 HTTP 协议本身存在的问题
-
-
SPDY 的设计与功能
- SPDY 没有完全改写 HTTP 协议,只是增加了会话层
- 考虑到安全性问题,SPDY 规定通信中使用 SSL
- SPDY 以会话层的形式加入,控制对数据的流动,但还是采用 HTTP 建立通信连接
-
使用 SPDY 后,HTTP 协议额外获得以下功能
- 多路复用流:单一 TCP 连接,处理无限制多个 HTTP 请求,提高了 TCP 处理效率
- 赋予请求优先级:可以给请求逐个分配优先级顺序,解决带宽低导致响应慢的问题
- 压缩 HTTP 首部:减少通信产生的数据包数量和发送的字节数
- 推送:服务器可直接发送数据,而不必等待客户端的请求
- 服务器提示:在资源已缓存等情况下,可以避免发送不必要的请求
-
SPDY 基本上只是将**单个域名( IP 地址)**的通信多路复用,所以当一个 Web 网站上使用多个域名下的资源,改善效果就会受到限制