# 《图解 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(通过设置陷阱,强制对已认证用户进行非预期的个人信息操作)。
← 《HTTP2 基础教程》 《博弈论》 →