前言
书籍阅读笔记
《图解HTTP》[ 日 ] 上野宣 著
HTTP
默认为持久连接:只要任意一端没有明确提出断开连接,则保持 TCP 连接
- 管线化(pipelining):不用等待响应,亦可直接发送下一个请求
HTTP 报文
分为报文首部和报文主体,由空行(CR 回车符+LF 换行符)来划分
- 通常,不一定要有报文主体
- 传输实体资源:由实体主体得到报文主体
说明 | 首部字段 | |
---|---|---|
压缩 | 内容编码指明编码格式 | Accept-Encoding |
分块传输 | 十六进制记录块的大小 | Transfer-Encoding |
多部分对象集合 | 一份报文主体内可含有多类型实体 | Content-type |
范围请求 | 一部分、一部分地请求数据 | Range(byte 范围) |
内容协商 | 访问相同 URI 的Web页面时,显示不同的内容 以响应资源的语言、字符集、编码方式等作为判断的基准 | Accept 相关 |
首部字段
包括通用首部、请求首部、响应首部、实体首部
- 首部字段名: 字段值
- 多个字段值用逗号分隔:Keep-Alive(逐跳首部): timeout=15, max=100
- 逐跳首部(Hop-by-hop):只对单次转发有效,下一服务器不再转发该字段
- 端到端首部:每一个经过的服务器都必须转发,直至客户端 / 服务端最终接收
- 除8个逐跳首部外,均为端到端首部
通用首部
通用首部字段名 | 说明 | 逐跳首部 |
---|---|---|
Cache-Control | 缓存相关的处理和控制 | |
Connection | Connection: 逐跳首部字段名(使其端到端转发) (默认)Connection: Keep-Alive Connection: close(断开连接) | Y |
Date | 创建报文的日期时间 | |
Pragma | Pragma: no-cache,仅为兼容 | |
Trailer | 声明在报文主体后有哪些首部字段 | Y |
Transfer-Encoding | 报文主体的传输编码方式 | Y |
Upgrade | 升级为其他协议 Upgrade: TLS/1.0, HTTP/1.1 | Y |
Via | 经过的代理服务器的相关信息(避免请求回环) | |
Warning | 错误通知 |
请求首部
- If-xxx:条件请求,服务端判断指定条件为真时,才会执行请求
请求首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型,及其优先级 text/html, image/jpeg, application/octet-stream(应用程序使用的二进制文件) 用 q= 表示优先级权重(范围为0-1),用 ; 分隔 |
Accept-Charset | 支持的字符集,及其优先级 |
Accept-Encoding | 支持的内容编码方式,及其优先级 |
Accept-Language | 支持的自然语言,及其优先级 |
Authorization | 认证信息(证书值) |
Expect | 期待服务器的特定行为 |
From | 用户代理的负责人的电子邮箱地址 |
Host(必须包含) | 请求的资源所处的互联网主机名和端口号 |
If-Match | If-Match: 字符串(该字符串与实体标记(ETag)一致时为真) |
If-Modified-Since | If-Modified-Since: 日期时间(该时间后资源更新过为真) |
If-None-Match | 与If-Match相反 |
If-Range | If-Range: ETag 值或日期时间(一致则作为范围请求处理,反之,则返回全部资源) |
If-Unmodified-Since | 与If-Modified-Since相反 |
Max-Forwards | 最大传输转发数 |
Proxy-Authorization(逐跳首部) | 告知代理服务器认证信息 |
Range | 资源的字节范围请求(无法处理则返回全部资源) |
Referer | 请求 URI 是从哪个Web页面发起的 |
TE(逐跳首部) | 支持的传输编码方式,及其优先级 |
User-Agent | 客户端的相关信息(中间可能添加上代理服务器的信息) |
响应首部
响应首部字段名 | 说明 |
---|---|
Accept-Ranges | 是(bytes )否(none )接受范围请求 |
Age(代理创建响应时必须包含) | 源服务器在多久(秒)前创建了响应 |
ETag | 唯一标识资源的字符串 服务器为每份资源分配一个 ETag 值,资源更新时,ETag 值也会更新 |
Location | 令客户端重定向至指定 URI |
Proxy-Authenticate(逐跳首部) | 告知客户端,代理服务器所要求的认证信息 |
Retry-After | 告知客户端,应该在多久之后再次发送请求 |
Server | 服务器上安装的 HTTP 服务器应用程序的信息 |
Vary | Vary: 首部字段名 值相同,直接从缓存返回响应;反之,则先从源服务器获取资源,再返回响应 |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体首部
实体首部字段名 | 说明 |
---|---|
Allow | 资源支持的 HTTP 方法 |
Content-Encoding | 实体主体的内容编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(byte ) |
Content-Location | 实体主体对应的 URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的响应范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 资源失效的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
非1.1版 HTTP 规定的首部
Cookie(网景公司):用户识别及状态管理
- HTTP 不保留之前一切的请求或响应报文的信息,无法根据之前的状态进行本次的请求处理
- 服务端设置响应报文内首部字段的 Set-Cookie(写入生成的Cookie 值),通知客户端保存 Cookie;客户端会自动在下次的请求报文中加入 Cookie 值(首部字段:Cookie)后发送出去
-
Set-Cookie 字段的属性 说明 name=VALUE 赋予 Cookie 的名称和其值(必须) expires=DATE Cookie 的有效期(默认为浏览器关闭前为止) path=PATH Cookie 适用的文件目录(默认为文档所在的文件目录) domain=域名 Cookie 适用的域名(默认为创建 Cookie 的服务器) secure 仅在 HTTPS 安全通信时才能发送Cookie HttpOnly 使 Cookie 不能被 JavaScript 脚本访问 - 服务器只能通过覆盖已过期的 Cookie,实现对客户端 Cookie 的实质性删除
首部字段名 | 说明 | 字段值 |
---|---|---|
X-Frame-Options | 响应首部 | DENY(拒绝),SAMEORIGIN(仅同源域名下的页面许可) |
X-XSS-Protection | 响应首部 | 0(无 XSS 过滤),1(有 XSS 过滤) |
DNT | 请求首部 | 0(同意广告追踪),1(拒绝广告追踪) |
P3P | 响应首部,保护用户隐私 |
请求报文
请求方法、请求URI、协议版本、首部字段(可选的)、报文主体
请求方法:方法名必须使用大写字母
-
方法名 说明 GET 获取资源 POST 传输数据(返回处理结果) HEAD 获得报文首部 OPTIONS 询问支持的方法 TRACE 追踪路径 CONNECT 要求用隧道协议连接代理 - 隧道:使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后,经网络隧道传输
对服务器本身发起请求,可以用 *
来代替请求 URI
响应报文
协议版本、状态码、用以解释状态码的原因短语、首部字段(可选的)、报文主体
状态码:第一位指定了响应类别
-
类别 原因短语 说明 1XX Informational(信息性状态码) 接收的请求正在处理 2XX Success(成功状态码) 请求正常处理完毕 3XX Redirection(重定向状态码) 需要进行附加操作以完成请求 4XX Client Error(客户端错误状态码) 服务器无法处理请求 5XX Server Error(服务器错误状态码) 服务器处理请求出错 - 只要遵守状态码类别的定义,可以改变 RFC 中定义的状态码,或服务器端自行创建状态码
- 返回301、302、303 响应状态码时,几乎所有浏览器都会把POST 改成 GET,并删除请求报文内的主体,自动再次发送请求
- 可能出现 Web 应用程序内部发生错误,状态码依然返回 200 OK
服务器
一台 Web 服务器可搭建多个独立域名的 Web 网站(虚拟主机、相同IP)
-
代理:转发时,需要在首部字段Via 中记录经过的主机信息
-
网关:使通信线路上的服务器提供非 HTTP 协议的服务,如连接数据库等
- -
隧道:安全通信,透明传输
缓存:超过缓存有效期后,客户端 / 代理服务器会向源服务器确认资源的有效性
确认访问用户的身份
HTTP 使用的认证方式 | 说明 |
---|---|
BASIC 认证(基本认证) | 采用 Base64 编码,传输用户 ID 和密码 |
DIGEST 认证(摘要认证) | 由接收到的质询码(challenge)计算生成响应码(response)并返回 |
SSL 客户端认证 | HTTPS 的客户端证书(花钱注册,内含公钥) |
FormBase 认证(基于表单认证) | Web 应用程序的用户登录信息,一般使用 Cookie 来管理Session(会话) |
通常,SSL 采用双因素认证,即用客户端证书来认证主机,用密码来确定用户本人
功能追加
HTTP 的瓶颈:
- 一条连接上只可发送一个请求
- 请求只能从客户端开始,客户端不可以接收除响应以外的指令
- 请求 / 响应首部未经压缩就发送
- 每次互相发送相同的首部造成的浪费较多
- 可任意选择数据压缩格式,而非强制压缩发送
解决方法:
-
Ajax(Asynchronous JavaScript and XML,异步 JavaScript 与 XML技术):局部 Web 页面替换加载
-
Comet:先将响应置于挂起状态,当服务器端有内容更新时,立即返回该响应(模拟实现推送)
-
SPDY(Google):会话层
- 一条 TCP 连接上处理多个 HTTP 请求(单个域名通信多路复用),并赋予请求优先级
- 压缩 HTTP 首部
- 支持服务器主动向客户端推送数据
- 支持服务器主动提示客户端请求所需的资源
-
WebSocket(Google):Web 浏览器与 Web 服务器之间全双工通信标准
- HTTP 连接建立之后,需要完成一次“握手”(Upgrade: websocket),切换为 WebSocket 协议
-
WebDAV:对 Web 服务器上的内容直接进行操作的分布式文件系统
- 创建、删除文件,文件创建者管理,文件编辑时加锁,文件版本控制等