# 《图解 HTTP》

最近阅读完图解 http,扫盲了一次 http 基础,在此写一下总结。

# 了解 web 及网络基础

# TCP/IP 架构

协议层 协议 描述
应用层 http 生成基于目标服务器的 http 请求报文
传输层 tcp 为了方便通信,将 http 请求报文分割成报文段
网络层 ip 搜索对方的地址,一边中转一边传送
数据链路层 网络 处理请求

# 简单的 http 协议

http 是无状态的协议。

# 请求报文

请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成。

# 响应报文

响应报文是由协议版本、状态码、状态码短语、可选的响应首部字段以及实体主体构成。

# 常用的请求方法

  • GET 获取资源。
  • POST 传输实体的主体。
  • PUT 传输文件。
  • HEAD 获得报文首部(类似 get,不返回报文实体)。
  • DELETE 删除文件。
  • OPTIONs 询问支持的方法。
  • TRACE 追踪路径(让服务器将之前的请求通信返回给客户端)。
  • CONNECT 要求用隧道协议连接代理(主要使用 SSL)。

# 持久化链接

持久连接 keep-live,串行输入,第二个请求需等待第一个请求响应完才能执行。

持久链接示例
建立 TCP 连接
请求 1----->
<-----响应 1
请求 2----->
<-----响应 2
关闭 TCP 连接

管线化,多个请求可同时发出,不需等待。

管线化示例
建立 TCP 连接
请求 1----->
请求 2----->
<-----响应 1
<-----响应 2
关闭 TCP 连接

# http 报文内的 http 信息

# http 报文

http 报文
报文首部
空行(CR+LF)
报文主体

# 返回结果的 http 状态码

  • 200 OK 请求成功。
  • 204 No Content 请求处理成功,但没有资源返回。
  • 206 Partial Content 请求到资源的一部分。
  • 301 Move Permanently 永久重定向。
  • 302 Found 临时重定向。
  • 303 See Other 临时重定向,采用 get 方法。
  • 304 Not Modified 没有改变。
  • 307 Temporary Redirect 临时重定向,采用之前的方法,不会强制使用 get 方法。
  • 400 Bad Request 请求报文中存在语法错误。
  • 401 Unauthorized 发送的请求需要有认证信息。
  • 403 Forbidden 请求的资源被服务器拒绝。
  • 404 Not Found 没有找到对应资源。
  • 500 Internal Server Error 服务器端报错。
  • 503 Service Unavaliable 服务器超负载或在维护。

# 与 http 协作的 web 服务器

# 通信数据转发程序

代理:

转发客户端请求到服务器,或转发服务器响应到客户端。

网关:

转发服务器通讯的服务器,可以处理请求,客户端不易察觉,可冒充服务器。可使用非 http 协议通讯。

隧道:

与服务器建立一条通讯线路,确保安全通信。

# http 首部

首部字段

为了给浏览器和服务器提供报文主体大小,所使用的语言,认证信息等。

请求报文首部:方法,uri,http 版本,请求首部字段,通用首部字段,实体首部字段。

响应报文首部:http 版本,状态码,响应首部字段,通用首部字段,实体首部字段。

# 通用首部字段

首部字段 描述
CaChe-Control 控制缓存机制
Connection 控制不再转发的首部字段,管理持久连接
Date 创建 http 报文的时间
Trailer 事先说明报文主体后包含的首部字段
Transfer-Encoding 传输报文采用的编码方式
Upgrade 检测 http 协议以及其他协议是否可使用更高的版本进行通信
Via 追踪客户端和服务器之间的请求和响应报文的传输路径
Warning 告知客户缓存相关的问题警告

# 请求首部字段

首部字段 描述
Accept 通知服务器,用户代理能够处理的媒体类型以及媒体类型的优先级
Accept-Charset 通知服务器,用户代理支持的字符集以及字符集的优先级
Accept-Encoding 通知服务器,用户代理支持的内容编码以及内容编码的优先级
Accept-Language 通知服务器,用户代理能够处理的自然语言集,以及优先级
Authorization 通知服务器,用户代理的认证信息
Except 通知服务器,期望出现的某种特定行为,如服务器不理解,返回 417
From 通知服务器,用户代理的电子邮箱
Host 通知服务器,请求资源的主机名和端口号,用于一台服务器多个 web 服务
If-Match 如果 Etag 一致时服务器才接受请求
If-Modified-Since 如果资源更新了,则希望能处理请求
If-None-Match 如果 Etag 不一致时服务器才接受请求
If-Range 范围请求
If-Unmodified-Since 如果资源未更新,则希望处理请求
Max-Forwards 没经过一层代理,字段值-1
Proxy-Authorization 告知服务器认证信息
Range 范围请求
Referer 告知服务器请求的原始资源 URI
TE 告知服务器客户端能够处理响应的传输编码,以及优先级
User-Agent 告知服务器客户端信息

# 响应首部字段

首部字段 描述
Accept-Ranges 告知客户端能否处理范围请求
Age 告知客户端,源服务器在多久之前创建了响应
ETag 告知客户端实体标识
Location 将响应接收方引导至某个与请求 URI 位置不容的资源
Proxy-Authenticate 把由代理服务器所要求的认证信息发送给客户端
Retry-After 告知客户端多久以后再次发送请求
Server 告知客户端服务器端信息
Vary 对缓存进行控制
WWW-Authenticate 用于 http 访问认证

# 实体首部字段

首部字段 描述
Allow 通知客户端能够支持的方法 Get,Head 等
Content-Encoding 告知客户端,服务器对实体的主体部分采用的内容编码
Content-Language 告知客户端,服务器对实体的主体部分使用的自然语言
Content-Length 实体的主体部分的发小
Content-Location 给出报文主体部分对应的 URI
Content-MD5 检查报文主体在传输过程中是否保持完整
Content-Range 告知客户端返回的实体属于哪一部分
Content-Type 实体主体的媒体类型
Expires 告知客户端资源失效的日期
Last——modified 资源最终的修改时间

# 确保 web 安全的 https

http 缺点

  • 通信使用铭文,内容可能会被窃听。
  • 不验证通信方的身份,因此有可能遭遇伪装。
  • 无法证明报文的完整性,所以有可能已遭篡改。

https

http+加密+认证+完整性保护 = https

对称加密,非对称加密。 https 慢,通信慢(加密解密耗时,http 通信部分变长)。

# 确认访问用户身份认证

认证方式 描述 缺点
Basic 认证 http 请求首部字段 Authorization 容易被窃听
Digest 认证 认证时加上质询码,降低窃听危险
SSL 客户端认证 在客户端安装证书,以确保客户端身份 客户端必须安装证书,需要收费
基于表单认证 Session+Cookie

# 基于 http 的功能追加协议

# http 瓶颈

  • 一条连接上只可发送一个请求。
  • 请求只能从客户端开始。客户端不可以接收除响应意外的指令。
  • 请求/响应首部未经压缩就发送。首部信息越多延迟越大。
  • 发送冗长的首部。每次互相发送相同的首部造成的浪费较多。
  • 可任意选择数据压缩格式。非强制压缩发送。

# 解决方案

  • ajax(局部更新)。
  • comet(长连接,耗费资源)。
  • SPDY
  • WebSocket

在 http 层和 SSL 层之间,增加 SPDY 会话层,用以实现:

  • 多路复用(只适用于同一域名下)
  • 赋予请求优先级
  • 压缩 http 首部
  • 推送功能
  • 服务器提示功能

WebSocket:

  • 不使用 http 协议,避免协议瓶颈。
  • 推送功能。
  • 减少通信量,首部信息小。

Http2:

  • SPDY。
  • Http Speed + Mobility。
  • Network-Friendly Http Upgrade。

# 构建 web 内容的技术

  • XML
  • JSON

# web 的攻击技术

  • XSS。
  • SQL 注入攻击。
  • OS 命令注入攻击(只要能调用 shell 函数的地方就存在被攻击的风险)。
  • HTTP 首部注入攻击(增加空白行,篡改请求报文实体)。
  • 目录遍历攻击(通过推测目录,获取本无权限获取的资源)。
  • 远程文件包含漏洞(传递参数获取文件,可传递攻击者的文件)。
  • 不正确的错误消息处理。
  • 会话劫持(攻击者拿到用户会话 id 宠儿冒充用户)。
  • 跨站点伪造请求 CSRF(通过设置陷阱,强制对已认证用户进行非预期的个人信息操作)。