图解 HTTP
目录
第一章
- 三次握手,关键词:高效、可靠
- tcp/ip协议分层,链路层/网络层(ip)/传输层(tcp)/应用层
- ip 是一种协议,和ip地址做区分
第二章
- 持久连接:只要任意一端没有提出断开连接,就会一直保持TCP连接状态
- Cookie技术通过在request和response的报文中写入信息来控制客户端的状态
第三章
内容编码 指明应用在实体内容上的编码格式,并保持实体信息原样的压缩。常用的内容编码有以下几种:
- gzip(GUN zip)
- compress(UNIX 系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
第四章
code | 类别 | 原因短语 |
---|---|---|
1XX | Informational | 接受的请求正在处理 |
2XX | Success | 请求正常处理完毕 |
3XX | Redirection | 需要进行附加操作以完成请求 |
4XX | Client Error | 服务器无法处理请求 |
5XX | Server Error | 服务处理请求出错 |
204 No Content
请求处理成功,但没有资源可返回206 Partial Content
范围请求处理成功301 Moved Permanently
永久性重定向302 Found
临时性重定向304 Not Modified
未满足_附带条件的请求_(GET 方法请求报文中包含 If-Match/If-Modified-Since/If-None-Math/If-Range/If-Unmodified-Since);服务器资源未改变,可直接使用客户端未过期的缓存400 Bad Request
请求报文语法错误401 Unauthorized
请求需要通过某些认证403 Forbidden
请求不允许访问- 500 Internal Server Error 服务器故障
503 Service Unavailable
服务器超负载或者停机维护
第五章
- 利用 虚拟主机 可以在一台服务器上搭建多个Web站点,发送HTTP请求时Host首部需指定域名的URI
- 一些用于通信数据的转发程序配合服务器工作:代理、网关、隧道
- 代理服务和客户端本地磁盘都可以保存资源副本用以缓存
使用代理的目的:
- 利用缓存技术减少网络带宽的流量
- 针对一些网站做访问控制,从而获取访问日志等信息
网关能使通信线路上的服务器提供非HTTP协议服务
隧道可按要求建立与其他服务器的通信线路,使用SSL等加密手段进行通信
如何判断缓存是否有效?
第六章
通用首部字段
- cache-control
- no-cache —— 不缓存过期的资源,缓存会向源服务器确认有效期后处理资源
- no-store —— 不使用缓存
- connection
- [不再转发的首部字段名] —— 可控制不再转发的首部字段名
- Keep-Alive —— 持久连接,HTTP/1.1 默认值
- close —— 服务器端明确想断开连接
请求时的首部字段
referer 原始请求URI。客户端一般会带上这个字段请求服务器,但是当在浏览器地址栏直接访问时,出于安全考虑会省略
对请求内容的一些补充
- accept 支持的媒体类型 (text/html,application/json)
- accept-charset 支持的字符集 (unicode-1-1)
- accept-encoding 支持的内容编码 (gzip)
- accept-language 支持的自然语言集 (zh-cn)
附带条件的请求
携带字段 满足条件的返回 不满足条件的返回 if-match( ETag
)200 412 if-modified-since 200 304 if-range( ETag
)206 200
响应时的首部字段
ETag
值是资源被缓存时分配的身份标识,其生成算法没有统一规则,仅与服务器有关- expires 未过期的情况下
- 浏览器将直接从缓存中读取,不会发送http请求
- 缓存服务器将返回缓存,不请求源服务器
- last-modified 浏览器发送下一次请求相同资源时,会带上 if-modified-since 的 request header
- location 几乎所有的浏览器在接收到带有location的响应后,都会强制性的跳转访问
- vary 源服务器对代理服务器缓存的使用进行控制,如
Vary: Accept-Encoding
第一次请求accept-encoding =gzip,第二次如果也是 gzip 请求则使用代理服务器缓存 - 对返回内容的一些补充
- content-type(text/html,application/json)
- content-language
- content-length
- content-encoding 告知客户端资源返回的编码格式
第七章
HTTP的安全问题
- 不验证通信方的身份,可能遭遇伪装
- 通信使用明文,内容可能被窃听
- 通过 wireshark 等抓包工具可以查看到明文信息
HTTPS
HTTPS 就是 HTTP 和 TCP 之间加入了 SSL 协议,HTTP 先和 SSL 通信,SSL 再和 TCP 通信
SSL 协议:在应用层和传输层之间对连接进行加密的通信协议
- SSL 协议 1.0 和 2.0 版本存在问题已经废弃,目前 TLS协议 均以 SSL 3.0 为基准制定
HTTPS的安全通信机制:
- 客户端发起 SSL 通信请求
- 客户端也有客户端证书,比如网银会要求客户端安装证书才能登录访问,但是客户端证书只能证明客户端存在,不能证明用户的真实有效 性,有些鸡肋
- 服务端返回证书和公钥
- 客户端根据内置的证书公钥验证证书合法性 —— 解决无法验证通信方身份的问题
- 浏览器发行商会预设一些权威证书机构的证书公钥
- 客户端生成 pre-master-secret,通过服务器公钥加密后发送给服务器
- 服务器接收并通过私钥解密,获取 pre_master_secret
- 客户端和服务器生成 pre_master_secret -> master_secret -> 一些密钥(共享密钥)
- 双方通过 HTTP 传输用共享密钥加密的信息 —— 解决通信使用明文的问题
第八章
HTTP 协议标准提供的 BASIC 认证和 DIGEST 认证,由于使用上的便利性和安全性,导致几乎不怎么使用
SSL 客户端认证虽然具有高度的安全等级,但是导入操作以及证书维持费用等问题,也没怎么使用
因为HTTP时无状态协议,目前 Web 登录认证多半基于表单认证:
- 客户端发送 身份ID 和 登录密码
如何保存登录密码等信息并没有标准化
一种安全的保存方法,给密码附加额外信息(加盐),再使用散列函数求出散列值后保存,这样能增加攻击者利用密码特征库破解的难度
- 服务器响应头返回 Set-Cookie
- 客户端请求头携带 Cookie 进行后续的用户操作,从而维持登录状态
第九章
HTTP协议导致的性能瓶颈
- 一条连接只能发送一个请求
- 请求只能从客户端开始
- 请求/响应首部信息不会压缩
- 每次互相发送相同的首部信息造成浪费
- 数据发送非强制压缩
基于HTTP追加的协议
- HTTP / 2.0
多路复用流,通过单一的 TCP 连接,可以同时无限制地处理多个HTTP 请求
多路复用代替了 HTTP1.x 的序列和阻塞机制,所有的相同域名请求都通过同一个TCP连接并发完成。
在 HTTP1.x 中,并发 N 个请求需要 N 个TCP连接,浏览器为了控制资源会有6-8个TCP连接都限制。
赋予请求优先级
压缩 HTTP 首部
推送功能,服务器可以主动向客户端推送数据
- WebSocket:实现 WebSocket 通信,在 HTTP 连接建立后,需要完成一次握手。因为基于 HTTP,所以 WebSocket 请求由客户端发起,成功握手确认连接后,通信时使用的不再是 HTTP 的数据帧,而是 WebSocket 独立的数据帧。
- 推送功能
- 减少通信量,WebSocket 的首部信息很小
第十章 / 第十一章 构建 Web 内容的技术 / Web 的攻击技术
两个章节简单介绍了一些常用的 Web 应用开发技术和攻击手段,略读