《HTTP权威指南》阅读记录

# URL与资源

  • URL就是因特网资源的标准化名称
  • URL = 协议(scheme) + 服务器位置(domain or ip) + 资源路径(path)
  • 自动扩展url:主机名扩展、历史记录扩展
  • URL并不完美:可以通过资源地址找到资源,一旦资源被移走,URL就不再有效了。永久统一资源定位符是用URL来实现对资源的url进行登记和跟踪

# HTTP报文

  • http报文是在http应用程序之间发送的数据块
  • 所有报文都向下游流动,不管是请求报文还是响应报文
  • http报文的三个部分:起始行、首部、主体
  • 报文的简要描述:方法(method)、请求URL(request-url)、版本(version)、状态码(status-code)、原因短语(reason-phrase)、首部(header)、主体部分(entity-body)
  • 报文都以一个起始行作为开始:请求报文的起始行说明了要做些什么,响应报文的起始行说明发生了什么
  • 常用的HTTP方法:GET、HEAD、POST、PUT、TRACE、OPTIONS、DELETE(HTTP1.0定义了三种请求方法:GET、POST、HEAD,HTTP1.1新增五种请求方法:OPTIONS、PUT、DELETE、TRACE、CONNECT)
  • 状态码分类:信息提示(100-101)、成功(200-306)、重定向(300-305)、客户端错误(400-415)、服务器错误(500-505),括号内表示已经定义了的,也可以对当前协议的扩展进行定义
  • 并不是每一个服务器都实现以上七种方法,如果一台服务器要与HTTP1.1兼容,那么只要为其资源实现GET方法和HEAD方法就可以了
  • GET方法和HEAD方法的HTTP请求都不会产生什么动作
  • DELETE方法所做的事情是请服务器删除请求URL所指定的资源。客户端应用程序无法保证删除操作一定会被执行
  • WebDAV HTTP扩展:LOCK(允许用户锁定资源),MKCOL(允许用户创建资源),COPY(便于服务器上复制资源),MOVE(在服务器上移动资源)

# 连接管理

  • HTTP连接是HTTP报文传输的关键通道
  • TCP流是分段的、由IP分组传送
  • 安全版本HTTPS就是HTTP和TCP之间插入一个(称为TLS或SSL的)密码加密层
  • 每一个TCP段都是由IP分组承载,从一个IP地址发送到另一个IP地址的。每个分组中包括:一个IP分组首部、一个TCP段首部、一个TCP数据块
  • IP首部包含缘何目的IP地址、长度和其他一些标记。TCP段首部包含了TCP端口号、TCP控制标记、以及用于数据排序和完整性检查的一些数字值
  • TCP连接是通过4个只来识别的:源IP地址、源端口号、目的IP地址、目的端口号
  • 串行HTTP事务的时间线:DNS查询、连接、请求、处理、响应、关闭
  • 最常见的TCP相关时延:TCP连接建立握手、TCP慢启动拥塞控制、数据聚集的Nagle算法、用于捎带确认的TCP延迟确认算法、TIME_WAIT时延和端口耗尽
  • 基本web服务器请求的步骤:建立连接、接收请求、处理请求、访问资源、构建响应、发送响应、记录事务处理过程

# 代理

  • Web代理、中间实体、客户端和服务器之间、来回传送HTTP报文
  • 使用代理用途:信息过滤、文档访问控制、安全防火墙、web缓存、反向代理、
  • 防止用户绕过控制代理:静态的配置web服务器,使其仅接受来自代理服务器的请求
  • 代理获取流量方法:修改客户端、修改网络(拦截)、修改DNS的命名空间、修改web服务器
  • 客户端代理设置:手工配置、预先配置浏览器、代理的自动配置、WPAD的代理发现
  • HTTP/1.0要求代理请求发送完整的URI,但为服务器请求保留部分URI的形式
  • 虚拟主机的问题(多个web站点共享一个物理web服务器),显式的代理要求在请求报文中使用完整的URI来解决问题,虚拟主机web服务器要求使用Host来承载主机和端口信息
  • 反向代理和拦截代理都是客户端无法区分出来的,客户端只会发送部分的URI
  • 没有代理的情况下,浏览器会进行主机名自动扩展(比如输入yahoo,大多数浏览器都会自动将其扩展为www.yahoo.com)
  • 有显式代理时,浏览器不会对不完整主机名进行自动扩展
  • 使用拦截代理时,浏览器无法检测出已经停用服务器的IP地址
  • 用OPTIONS来判定服务器支持的方法,如请求整个服务器所支持的功能:OPTIONS * HTTP/1.1

# 缓存

  • 缓存可以处理的问题:冗余的数据传输、带宽瓶颈、瞬间拥塞、距离时延
  • 收到GET If-Modified-Since请求时发生的情况:再验证命中(服务器内容未被修改)、再验证未命中(服务器内容已被修改)、对象被删除(服务器上的对象被删除了)
  • 命中率衡量:缓存命中率(或文档命中率,由缓存提供服务的请求所占的比例),字节命中率(缓存中提供的字节在传输的所有字节中所占的比例)
  • 区分命中和未命中:使用Date首部,将响应中的Date首部的值与当前时间进行比较
  • 缓存的处理步骤:接收、解析、查询、新鲜度检测、创建响应、发送、日志
  • 注意:缓存不应该调整Date首部,Date首部表示的是原始服务器最初产生这个对象的日期
  • 服务器使用HTTP/1.0+的Expires首部或HTTP/1.1的Cache-Control:max-age的响应首部来指定过期日期,同时还会带有响应主体
  • 设置缓存控制:控制Apache的HTTP首部、通过HTTP-EQUIV控制HTML缓存(有些软件会忽略这种HTTP-EQUIV标签)
  • 对于发布广告者,理想情况下,内容提供商会让缓存吸收其流量,而缓存会告诉内容提供商他们拦截了多少次命中

# 集成点:网关、隧道及中继

  • Web网关在一侧使用HTTP协议,在另一侧使用另一种协议
  • CGI:标准接口集,web服务器可以用它来装载程序以响应对特定URL的HTTP请求,并收集程序的输出数据,将其放在HTTP响应中回送
  • Web隧道:可以通过HTTP应用程序访问使用非HTTP协议的应用程序
  • 建立一条到达网关的隧道的过程:CONNECT请求、CONNECT响应
  • 最初开发web隧道的目的是为了通过防火墙来传输加密的SSL流量
  • 机器人的META指令:NOINDEX(告诉机器人不要对页面的内容进行处理,忽略文档)、NOFOLLOW(告诉机器人不要爬行这个页面的任何外连链接)
  • 搜索引擎的META标签:description、keywords、revisit-after(重访天数)

# Web机器人

  • 根集:爬虫开始访问的URL初始集合
  • 大规模Web爬虫对其访问过的地址管理:树和散列表、有损的存在位图、检查点、分类
  • 避免循环和重复:规范化URL、广度优先的爬行、节流、限制URL的大小、站点黑名单

# 客户端识别和cookie机制

  • 个性化接触(Amazon):个性化的问候、有的放矢的推荐、管理信息的存档、记录会话
  • 用户识别机制:承载用户身份信息的HTTP首部;客户端IP地址跟踪,通过用户的IP地址对其进行识别;用户登录,用认证方式来识别用户;胖URL,一种在URL中嵌入识别信息的技术;cookie,一种功能强大且高效的持久身份识别技术
  • 使用客户端IP地址来识别用户存在着很多缺点,无法使用IP地址确定目标的地方太多了
  • 胖URL的问题:显示上带来困扰;无法共享URL;破坏缓存;额外的服务器负荷;逃逸口;非持久(退出登录即丢失信息)
  • cookie类型:会话cookie(退出浏览器就丢失)和持久cookie(存储在硬盘上),他们之间的唯一区别就是他们的过期时间
  • cookie的基本思想:就是让浏览器积累一组服务器特有的信息,每次访问服务器时都将这些信息提供给它
  • 网景的cookie:domain(域)、allh(是否指定了名字的主机获取)、path(路径)、secure(安全)、expires(过期)、name(名字)、value(值)
  • IE的cookie:存储在高速缓存目录下独立的文本文件中,每个cookie都是用多行构成
  • cookie规范的两个版本:cookies版本0(最初的Netscape cookie标准)、cookies版本1(RFC 2965),cookies版本1是对cookies版本0的扩展,应用不如后者广泛

# HTTP-NG

  • HTTP-NG:下一代HTTP结构方案
  • HTTP发展中存在的问题:复杂性(特性相互依存)、可扩展性(很难实现递增式扩展)、性能(部分效率不高)、传输依赖性(需要为替代协议栈提供更多的支持)
  • HTTP-NG主题:模块化及功能增强,将协议模块化为三层(第一层、报文传输层,第二层、远程调用层,第三层、Web应用层)
  • 报文传输层:不考虑报文的功能,致力于端点间报文的不透明传输,主要负责高效报文传输及处理
  • 远程调用层:独立于报文的传输以及操作,只是提供了一种标准的方法来调用服务器上所有的操作
  • Web应用层:提供了大部分的内容管理逻辑

# 识别、认证与安全

  • ...

# 基本认证机制

  • HTTP定义了两个官方的认证协议:基本认证和摘要认证
  • Base-64用户名/密码编码:提示用户输入用户名和密码;用冒号将用户名和密码连接起来;Base-64编码;发送认证信息
  • 代理认证:通过代理服务器提供对组织内部资源的统一访问控制
  • 基本认证的缺陷:Base-64编码的用户名和密码可以轻易的通过反向编码过程进行解码,经过Base-64编码的密码实际上就是“明文”传送的;假冒服务器很容易骗过基本认证

# 摘要认证

  • 摘要认证与基本认证兼容,但却更为安全,尽管摘要认证还没有得到广泛应用
  • 摘要认证的改进:永远不会以明文方式在网络上发送密码;可以防止恶意用户捕获并重放认证的握手过程;可以有选择地防止对报文内容篡改;防范其他几种常见的攻击方式
  • MD5输出的128位的摘要通常会被写成32个十六进制的字符
  • 摘要函数有时也被称为加密的校验和、单向散列函数或指纹函数

# 安全HTTP

  • ...

# 实体和编码

  • HTTP要确保它所承载的“货物”满足以下条件:
    • 可以被正确的识别(通过Content-Type首部说明媒体格式,Content-Language首部说明语言)
    • 可以被正确的解包(通过Content-Length首部和Content-Encoding首部)
    • 是最新的(通过实体验证码和缓存过期控制)
    • 符合用户的需要(基于Accept系列的内容协商首部)
    • 在网络上可以快速有效的传输(通过范围请求、差异编码以及其他数据压缩方法)
    • 完整到达、未被篡改(通过传输编码首部和Content-MD5校验和首部)
  • 实际报文内容的十六进制转储中首部末尾以LF(0x0A=<LF>)结尾
  • HTTP的早期版本采用关闭连接的办法来划定报文的结尾,但没有Content-Length的话,客户端无法区分到底是报文结束时正常的连接关闭还是报文传输中由于服务器崩溃导致的连接关闭

# 国际化

  • 字符编码方案把字符代码编码成比特,并负责反向变换
  • 实体的Content-Language首部字段描述实体的目标受众语言
  • 客户端发送Accept-Charset首部和Accept-Language首部,告知服务器理解哪些字符集编码算法和语言以及其中的优先顺序
  • 二进制码转换显示过程:二进制码、字符代码(通过编码方案)、唯一字符(使用编码后的字符集找到字符)、字形(使用字体和版式软件找到显示字形)
  • HTTP只关心字符数据和相关语言及字符集标签的传输,字符形状的显示是由用户的图形显示软件(包括浏览器、操作系统、字体等)来完成
  • 字符编码方案可用来减少识别字符所需要的数据总量(压缩)、解决传输限制、统一重叠编码字符集
  • 不要把字符和字形混淆,字符是唯一的、抽象的语言原子,字形是画出字符每个字符时使用的特定方式,每个字符可以有多种不同的字形

# 内容协商与编码

  • 共有3种不同的方法可以决定服务器上哪个页面最适合客户端:让客户端来选择、服务器自动判定、让中间代理来选择
  • 客户端驱动的协商:服务器收到客户端请求时只是发挥响应,并在其中列出可用的页面,让客户端来选择(速度慢且过程枯燥乏味,让用户厌烦)
  • 服务器驱动的协商:服务器通过客户端请求的首部集来获取信息以决定发送什么类型的数据(q质量值)
  • 3种类别的转码:格式转换、信息综合、内容注入

# web主机托管

  • ...

# 发布系统

  • ...

# 重定向与负载均衡

  • ...

# 日志记录与使用情况跟踪

  • ...

# 相关资料

  1. 用大数据来节能 (opens new window)
  2. 史上最“脑残”的“抢火车票”程序 (opens new window)
  3. Https&Http2.0&HttpDNS的那些事 (opens new window)
  4. 一步步教你HTTPS抓包 (opens new window)