《HTTP权威指南》 阅读笔记

2020-01-14 · 17 min read

HTTP权威指南

第一部分 HTTP

第一章 HTTP概述

1.1 HTTP 1.2 web客户端和服务器 1.3 资源

  • MIME媒体类型
MIME type
    text/html
    text/plain  普通的ASCII文本文档
    image/jpeg  
    image/gif   
    video/quicktime Apple的视频格式
    application/vnd.ms-powerpointer 微软的ppt格式     
    ......(附录D)
  • URI 统一资源标识符

Uniform Resource Identifier,定位服务器上的某一资源 如服务器上的一张图片:

leoooy.site/demo.gif
  • URL 统一资源定位符

Uniform Resource Location, 描述获取某服务器上某资源的特定位置

现在几乎所有的URI都是URL URL由三部分组成: 协议,如httphttps 域名,如leoooy.site 位置,如/api/getData

http://leoooy.site/api/getData
  • URN 统一资源名,URI的另一种形式

实验阶段,可以用同一个名字通过多种网络协议来访问资源

一般来说不太区分URI和URL

1.4 事务 一个HTTP事务由一条请求命令和一个响应结果组成,通信通过HTTP报文的格式化数据块进行的。

  • 方法
GET 从服务器向客户端发送资源
PUT 将来自客户端的数据存储到服务器中
DELETE 删除服务器中的资源
POST # The POST method is used to submit an entity to the specified resource, often causing a change in state or side effects on the server.
HEAD 仅发送HTTP首部
  • 状态码

1.5 报文

1.6 连接 基于TCP/IP

1.7 协议版本

HTTP/0.9 HTTP/1.0 HTTP/1.0+ HTTP/1.1

HTTP/2(HTTP-NG) HTTP/3

1.8 Web的结构组价 代理 代表用户发送请求

缓存

网关 作为服务器的中间实体,通常用于转换协议,如http转ftp

隧道 在隧道之间进行盲转发,转发时不会窥探数据 http隧道的常见用途是 SSL/TLS

Agent代理 爬虫常用,伪装user-agent

第二章 URL与资源

2.1 网络上的资源 2.2 URL的语法 协议 主机与端口 *用户名与密码 http://uname:[email protected]/xx ftp://uname:[email protected]/xx 资源路径 参数 /api1;type=1 查询字符串 queryString ?a=1 锚点(仅作用于客户端) /index.html#p1

2.3 URL快捷方式

2.3.1 相对URL 2.3.2 自动扩展URL(浏览器处理)

2.4 各种字符 URL字符集 编码机制

第三章 HTTP报文

3.1 报文流 3.2 报文的组成 报文的语法 起始行 首部(通用首部,请求首部,响应首部,实体首部,扩展首部) 实体的主体 3.3 方法

第四章 连接管理

第二部分 HTTP的结构

第五章 web服务器结构

5.52 web服务器结构

  • 单线程web服务器
  • 多进程及多线程web服务器
  • 复用I/O的web服务器
  • 复用的多线程web服务器

接受客户端连接 接收请求报文 处理请求 对于资源映射的访问 构建响应 发送响应 记录日志

第六章 http代理服务器

  • 文档访问控制
  • 儿童保护
  • 安全防火墙
  • web代理缓存(cdn)
  • 反向代理
  • 内容路由器
  • 转码器

代理服务器的部署

  • 出口代理
  • 入口代理
  • 反向代理
  • 网络交换代理

代理的层次结构 报文从一个代理传到另一个代理,直到最终抵达原始服务器 多层代理

代理层次结构的内容路由

  • 负载均衡
  • 地理位置附近的路由
  • 协议/类型路由
  • 基于订购(付费)的路由: 会员用户的资源URI被转发到大型缓存或压缩引擎上

代理如何截获请求(请求是如何经过代理的)

  • 修改客户端(浏览器代理)
  • 修改网络(全局代理)
  • 修改DNS(hosts)
  • 修改web服务器(服务器重定向)

客户端的代理设置

  • 手工配置(全局代理、浏览器代理): 显式的设置要使用的代理
  • 自动代理PAC(Proxy Auto-Configuration)
  • WPAD(Web Proxy Autodiscovery Protocal)有些浏览器支持web代理自动发现协议

追踪报文

  • via 首部
  • TRACE

代理认证

代理的互操作性

第七章 web缓存机制

缓存解决的问题

  • 冗余的数据传输
  • 带宽瓶颈
  • 瞬间拥塞
  • 距离时延

缓存命中和未命中 可以用已有副本来为某些到达缓存的服务提供副本,被称为缓存命中。 相反的,称为缓存未命中,未命中的缓存被转发到原始服务器上重新请求

  • 再验证 revalidation
  • 命中率 cache hit rate,缓存提供的服务的请求所占的比例
  • 字节命中率 bite hit rate
  • 判断来自CDN缓存还是原始服务器,两种状态码都是200ok,可以通过 via首部 Date首部 age首部来判断

缓存的拓扑结构

  • 私有缓存(浏览器中有内建的私有缓存)
  • 公有缓存

公有缓存是特殊的共享代理服务器,被称为缓存代理服务器(caching proxy server)或是代理缓存(proxy cache)

代理缓存的层次结构

原始服务器 > 广域网 > 二级缓存 > 地区性网络 > 一级缓存 > 客户端(第一级缓存命中)

# 我们希望用户都在一级缓存命中,如果没有命中,较大的父级缓存(这里对应二级缓存)可能能够处理它们的请求

# 如果浏览器自带缓存,那么这个就是一个三级缓存的结构
# 父级缓存可能还要更大一些,以便更多的装载必要的缓存,还有接收子缓存聚合的流量
# 实际应用中,网络结构会被限制在2到3个代理以内,不过新一代的高性能代理服务器会使得代理链的长度不那么重要

网状缓存

根据url在父缓存和原始服务器中进行动态选择
根据url动态选择一个特定的父缓存
前往父缓存之前,先在本地缓存中搜索已缓存的副本
允许缓存之间相互访问,但不允许外网流量访问其缓存(兄弟缓存)

缓存的处理步骤

接收
解析    
查询    查看是否有本地副本可用,没有就重新请求并保存一份副本
新鲜度查询: 查看缓存副本是否已经过期,过期重新请求并缓存
创建响应: 新的首部和已缓存的主体来构建一条响应
发送
日志

缓存的新鲜度server revalidation

  • 过期时间和使用期
cache-control: max-age
Expiers: Fri, 05 Jul 2002, 05:00:00 GMT
  • 服务器再验证
if-modified-since:<date>
if-none-match:<tags>  <=>  Etag

# Etag的值和 if-none-match 不同,则回重新请求并更新Etag
  • 服务器控制缓存(响应首部)
cache-control: 

no-store
no-cache
must-revalidate
max-age

# no-store 和 no-cache
Pragma: no-cahce       # 为了兼容http/1.0+,不兼容就不需要
Cache-Control: no-store  # 禁止缓存此次响应,并删除已缓存的对象
Cache-Control: no-cache  # 再验证之前不存储

# max-age首部 和s-maxage
Cache-Control: max-age=3600     # 单位是s秒    
Cache-Control: s-maxage=3600    # s-maxage仅仅适用于公有缓存
                                # 两个age=0,则是不使用缓存

# Expires首部(不推荐使用)
由于很多服务器时钟不同步或是不正确,所以实际可能不准确。
通过计算过期日期和现在的差值,转换为max-age
Expiers: Fri, 05 Jul 2002, 05:00:00 GMT

# must-recalidate响应首部 (response header)
Cache-Control: must-revalidate # 告诉缓存严格遵守过期信息
                            # 事先没和服务器再验证的情况下,不得提供缓存的副本

# 试探性过期
  • 客户端控制缓存(请求首部)
Cache-Control: max-stale          # 缓存可以随意提供过期的文件
Cache-Control: max-stale= <s>     # 缓存在s秒内绝不过期

Cache-Control: min-feash= <s>     # 在s秒内不得缓存

Cache-Control: max-age= <s>   # 大于s秒的缓存为过期,
                              # 除非同时指定了max-stale

Cache-Control: no-cache  # 再验证之前不使用缓存
#Pragma: no-cache        兼容http/1.0+

Cache-Control: no-store  # 禁止缓存此次响应,并删除已缓存的文件

Cache-Control: only-if-cached # 只有当缓存中有副本存在时,客户端才会获取一份副本
  • 缓存与广告

广告可以通过缓存更快,更好的展示,但是有些服务商是按访问次数计费,如果访问只到达缓存而不通过服务器则隐藏了实际的访问次数。 解决方案试将命中的缓存记录日志再发送到原始服务器 日志分发策略

第八章 集成点:网关、隧道及中继

  • 使用http访问其他协议的资源及
  • 将http作为框架启动其他协议和应用程序通信

8.1 网关 作为翻译器,将http请求翻译为其他协议

# 协议网关
http/ftp 网关           
http/https 网关

# 资源网关
http/CGI(应用程序服务器) 网关 # 或者其他API

8.5 隧道 web tunnel(web 隧道) 通过http协议访问非http协议的应用程序 (通过http流量发送非http流量)

用CONNECT方法建立HTTP隧道 SSL隧道:通过一条HTTP连接来传输SSL流量,以穿过80端口的http防火墙

SSL隧道和HTTP/HTTPS网关的对比

# 网关
客户端到网关的连接仍是不安全的HTTP
客户端只能认证网关,但不能对远端服务器进行SSL客户端认证

8.6 中继 HTTP中继(relay)是没有完全按照HTTP规范执行的简单HTTP代理 中继负责处理HTTP建立连接的部分,然后对字节进行盲转发 常见的问题: 无法处理connection首部的问题,所以有潜在的挂起keep-alive连接的可能

第九章 web机器人(爬虫)

第十章 web技术的未来

第三部分 识别、认证与安全

第十一章 客户端识别与cookie机制

cookie

响应首部 set-cookie
请求首部 cookie 

第十二章 基本认证机制

将用户名和密码通过base64编码传输到服务器,只能防止非恶意用户无意间进行的访问。 不能防止暴力破解、钓鱼网站、重放攻击和中间人攻击

一般将基本认证和HTTPS配合使用来变得更安全

第十三章 摘要认证

摘要认证之比基本认证强大一些,并没有HTTPS安全 将客户端的用户名和密码计算成一个摘要发送到服务器中,服务器取用户名和密码计算一个摘要和此摘要进行对比

用随机数防止重放攻击:服务器每次传一个随机数,在计算摘要之前加入用户名或密码

第十四章 HTTPS

第四部分 实体、编码和国际化

第十五章 实体和编码

# 正确的识别
Content-Type
Content-Language

# 正确的解包
Content-Length
Content-Encoding

# 是最新的
Etag
缓存相关首部,参考缓存一章

# 符合用户的需求
Accept系列的内容协商首部

# 在网络上可以快速的传输
范围请求、差异编码及数据压缩方法首部

# 完整到达,未被篡改
传输编码首部,Content-MD5校验和

内容编码

# 服务器响应首部
Content-Encoding: gzip,compress,delate,identity
gzip效率最高,使用最广泛

# 客户端请求首部
Accept-Encoding: *
Accept-Encoding: compress,gzip
Accept-Encoding: compress;q=1.0, gzip;q=0.5

可靠传输

Transfer-Encoding

分块编码

Content-length

范围请求

range: bytes=4000-

第十六章 国际化

国际化与字符集

# 客户端设置
Accept-Language:  fr,en;q=0.8   # q是质量因子,表示优先级,最高是1
Accept-Charset: iso-8859-1, utf-8
# 也可以在HTML中的META标签中设置
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"/>
<META LANG="cn"/>

# 服务器则实在Content-Type中设置
Content-Type: text/html ;charset: utf-8   # 表示用utf-8解码算法解码内容的二进制值

字符集:HTTP字符集的值说明如何吧实体内容的二进制码转换为特定的字母表中的字符

字符集标记在由IANA维护

第十七章 内容协商与转码

内容协商

  • 客户端驱动的协商 (多次请求、需要多个URI、繁琐)
  • 服务器驱动的协商(1 根据客户端Accept首部集响应对应内容 2 根据其他首部进行变通,如浏览器提供的user-agent)

内容协商首部

# 客户端                        # 服务器
Accept                         Content-Type
Accept-Language                Content-Language 
Accept-Charset                 Content-Type
Accept-Encoding                Content-Encoding
# 由于http是无状态的(不会在不同请求之间zuiz)

第五部分 内容分发与发布

第十八章 主机托管服务(云服务)

上云 镜像集群(更可靠) 内容分发网络(CDN)

  • CDN中的反向代理缓存
  • CDN中的代理缓存

第十九章 发布系统

第二十章 重定向和与负载均衡

HTTP重定向
DNS重定向
任播路由
策略路由
IP MAC转发
IP地址转发
WCCP Web缓存协调协议
ICP 缓存通信协议
HTCP 超文本缓存协议
NECP 网元控制协议
CARP 缓存阵列路由协议
WPAD Web代理自动发现协议

日志记录与使用情况


Profile picture

Blogs by Leo Yang who lives and works in Chengdu writing interesting things. You should follow me on Github 😁