HTTP及相关核心Web技术方面的权威著作
权威专家详解HTTP协议、深入说明Web工作原理
语言简洁精确,细节图解翔实
高效Web开发、Web程序员必备权威指南
HTTP是Web的基础,这里所说的Web,不仅只是通常意义上的Browser/Server端的开发,而是Web Service。
HTTP初看上去似乎是非常简单的协议,是的,HTTP 0.9确实是非常简单的,简单到只有一个GET方法,更不用说什么持久连接了。HTTP协议还有一个显著特点,那就是其协议是明文的基于文本的。这使得通过工具与HTTP进行交互变得非常简单,*原始的telnet也可以发送HTTP请求(参考本书15页)。
而大多数人对HTTP的了解也就是这种程度了(没有读此书之前的我也是这样)。此书的意义在于,它让你知道,HTTP不仅只有一个简单的GET,HTTP可以做为一种通用的分布式编程的协议。现如今Web上大行其道的所谓Restful Web Service,其基础就是HTTP,而提出Rest这个概念的Roy Fielding,也是HTTP协议(RFC2616)的主要作者之一
《HTTP权威指南》是HTTP及其相关核心Web技术方面的权威著作,主要介绍了Web应用程序是如何工作的,核心的因特网协议如何与架构构建块交互,如何正确实现因特网客户和服务器等。 《HTTP权威指南》适合所有想了解HTTP和Web底层结构的人阅读。
目录
- 第一部分 HTTP:Web的基础
- 第1章 HTTP概述 3
- 1.1 HTTP——因特网的多媒体信使 4
- 1.2 Web客户端和服务器 4
- 1.3 资源 5
- 1.3.1 媒体类型 6
- 1.3.2 URI 7
- 1.3.3 URL 7
- 1.3.4 URN 8
- 1.4 事务 9
- 1.4.1 方法 9
- 1.4.2 状态码 10
- 1.4.3 Web页面中可以包含多个对象 10
- 1.5 报文 11
- 1.6 连接 13
- 1.6.1 TCP/IP 13
- 1.6.2 连接、IP地址及端口号 14
- 1.6.3 使用Telnet实例 16
- 1.7 协议版本 18
- 1.8 Web的结构组件 19
- 1.8.1 代理 19
- 1.8.2 缓存 20
- 1.8.3 网关 20
- 1.8.4 隧道 21
- 1.8.5 Agent代理 21
- 1.9 起始部分的结束语 22
- 1.10 更多信息 22
- 1.10.1 HTTP协议信息 22
- 1.10.2 历史透视 23
- 1.10.3 其他万维网信息 23
- 第2章 URL与资源 25
- 2.1 浏览因特网资源 26
- 2.2 URL的语法 28
- 2.2.1 方案——使用什么协议 29
- 2.2.2 主机与端口 30
- 2.2.3 用户名和密码 30
- 2.2.4 路径 31
- 2.2.5 参数 31
- 2.2.6 查询字符串 32
- 2.2.7 片段 33
- 2.3 URL快捷方式 34
- 2.3.1 相对URL 34
- 2.3.2 自动扩展URL 37
- 2.4 各种令人头疼的字符 38
- 2.4.1 URL字符集 38
- 2.4.2 编码机制 38
- 2.4.3 字符限制 39
- 2.4.4 另外一点说明 40
- 2.5 方案的世界 40
- 2.6 未来展望 42
- 2.7 更多信息 44
- 第3章 HTTP报文 45
- 3.1 报文流 46
- 3.1.1 报文流入源端服务器 46
- 3.1.2 报文向下游流动 47
- 3.2 报文的组成部分 47
- 3.2.1 报文的语法 48
- 3.2.2 起始行 50
- 3.2.3 首部 53
- 3.2.4 实体的主体部分 55
- 3.2.5 版本0.9的报文 55
- 3.3 方法 56
- 3.3.1 安全方法 56
- 3.3.2 GET 56
- 3.3.3 HEAD 57
- 3.3.4 PUT 57
- 3.3.5 POST 58
- 3.3.6 TRACE 58
- 3.3.7 OPTIONS 60
- 3.3.8 DELETE 60
- 3.3.9 扩展方法 61
- 3.4 状态码 62
- 3.4.1 100~199——信息性状态码 62
- 3.4.2 200~299——成功状态码 63
- 3.4.3 300~399——重定向状态码 64
- 3.4.4 400~499——客户端错误状态码 68
- 3.4.5 500~599——服务器错误状态码 69
- 3.5 首部 70
- 3.5.1 通用首部 71
- 3.5.2 请求首部 72
- 3.5.3 响应首部 74
- 3.5.4 实体首部 75
- 3.6 更多信息 77
- 第4章 连接管理 79
- 4.1 TCP连接 80
- 4.1.1 TCP的可靠数据管道 80
- 4.1.2 TCP流是分段的、由IP分组传送 81
- 4.1.3 保持TCP连接的正确运行 82
- 4.1.4 用TCP套接字编程 84
- 4.2 对TCP性能的考虑 85
- 4.2.1 HTTP事务的时延 86
- 4.2.2 性能聚焦区域 87
- 4.2.3 TCP连接的握手时延 87
- 4.2.4 延迟确认 88
- 4.2.5 TCP慢启动 89
- 4.2.6 Nagle算法与TCP_NODELAY 89
- 4.2.7 TIME_WAIT累积与端口耗尽 90
- 4.3 HTTP连接的处理 91
- 4.3.1 常被误解的Connection首部 91
- 4.3.2 串行事务处理时延 92
- 4.4 并行连接 94
- 4.4.1 并行连接可能会提高页面的加载速度 94
- 4.4.2 并行连接不一定更快 95
- 4.4.3 并行连接可能让人“感觉”更快一些 95
- 4.5 持久连接 96
- 4.5.1 持久以及并行连接 96
- 4.5.2 HTTP/1.0 keep-alive连接 97
- 4.5.3 Keep-Alive操作 98
- 4.5.4 Keep-Alive选项 98
- 4.5.5 Keep-Alive连接的限制和规则 99
- 4.5.6 Keep-Alive和哑代理 100
- 4.5.7 插入Proxy-Connection 102
- 4.5.8 HTTP/1.1持久连接 104
- 4.5.9 持久连接的限制和规则 104
- 4.6 管道化连接 105
- 4.7 关闭连接的奥秘 106
- 4.7.1 “任意”解除连接 106
- 4.7.2 Content-Length及截尾操作 107
- 4.7.3 连接关闭容限、重试以及幂等性 107
- 4.7.4 正常关闭连接 108
- 4.8 更多信息 110
- 4.8.1 HTTP连接 110
- 4.8.2 HTTP性能问题 110
- 4.8.3 TCP/IP 111
- 第二部分 HTTP结构
- 第5章 Web服务器 115
- 5.1 各种形状和尺寸的Web服务器 116
- 5.1.1 Web服务器的实现 116
- 5.1.2 通用软件Web服务器 117
- 5.1.3 Web服务器设备 117
- 5.1.4 嵌入式Web服务器 118
- 5.2 最小的Perl Web服务器 118
- 5.3 实际的Web服务器会做些什么 120
- 5.4 第一步——接受客户端连接 121
- 5.4.1 处理新连接 121
- 5.4.2 客户端主机名识别 122
- 5.4.3 通过ident确定客户端用户 122
- 5.5 第二步——接收请求报文 123
- 5.5.1 报文的内部表示法 124
- 5.5.2 连接的输入/输出处理结构 125
- 5.6 第三步——处理请求 126
- 5.7 第四步——对资源的映射及访问 126
- 5.7.1 docroot 127
- 5.7.2 目录列表 129
- 5.7.3 动态内容资源的映射 130
- 5.7.4 服务器端包含项 131
- 5.7.5 访问控制 131
- 5.8 第五步——构建响应 131
- 5.8.1 响应实体 131
- 5.8.2 MIME类型 132
- 5.8.3 重定向 133
- 5.9 第六步——发送响应 134
- 5.10 第七步——记录日志 134
- 5.11 更多信息 134
- 第6章 代理 135
- 6.1 Web的中间实体 136
- 6.1.1 私有和共享代理 136
- 6.1.2 代理与网关的对比 137
- 6.2 为什么使用代理 138
- 6.3 代理会去往何处 143
- 6.3.1 代理服务器的部署 144
- 6.3.2 代理的层次结构 144
- 6.3.3 代理是如何获取流量的 147
- 6.4 客户端的代理设置 148
- 6.4.1 客户端的代理配置:手工配置 149
- 6.4.2 客户端代理配置:PAC文件 149
- 6.4.3 客户端代理配置:WPAD 150
- 6.5 与代理请求有关的一些棘手问题 151
- 6.5.1 代理URI与服务器URI的不同 151
- 6.5.2 与虚拟主机一样的问题 152
- 6.5.3 拦截代理会收到部分URI 153
- 6.5.4 代理既可以处理代理请求,也可以处理服务器请求 154
- 6.5.5 转发过程中对URI的修改 154
- 6.5.6 URI的客户端自动扩展和主机名解析 155
- 6.5.7 没有代理时URI的解析 155
- 6.5.8 有显式代理时URI的解析 156
- 6.5.9 有拦截代理时URI的解析 157
- 6.6 追踪报文 158
- 6.6.1 Via首部 158
- 6.6.2 TRACE方法 162
- 6.7 代理认证 164
- 6.8 代理的互操作性 165
- 6.8.1 处理代理不支持的首部和方法 166
- 6.8.2 OPTIONS:发现对可选特性的支持 166
- 6.8.3 Allow首部 167
- 6.9 更多信息 167
- 第7章 缓存 169
- 7.1 冗余的数据传输 170
- 7.2 带宽瓶颈 170
- 7.3 瞬间拥塞 171
- 7.4 距离时延 172
- 7.5 命中和未命中的 173
- 7.5.1 再验证 173
- 7.5.2 命中率 175
- 7.5.3 字节命中率 176
- 7.5.4 区分命中和未命中的情况 176
- 7.6 缓存的拓扑结构 177
- 7.6.1 私有缓存 177
- 7.6.2 公有代理缓存 177
- 7.6.3 代理缓存的层次结构 179
- 7.6.4 网状缓存、内容路由以及对等缓存 180
- 7.7 缓存的处理步骤 181
- 7.7.1 第一步——接收 181
- 7.7.2 第二步——解析 182
- 7.7.3 第三步——查找 182
- 7.7.4 第四步——新鲜度检测 182
- 7.7.5 第五步——创建响应 182
- 7.7.6 第六步——发送 183
- 7.7.7 第七步——日志 183
- 7.7.8 缓存处理流程图 183
- 7.8 保持副本的新鲜 183
- 7.8.1 文档过期 184
- 7.8.2 过期日期和使用期 185
- 7.8.3 服务器再验证 185
- 7.8.4 用条件方法进行再验证 186
- 7.8.5 If-Modified-Since:Date再验证 187
- 7.8.6 If-None-Match:实体标签再验证 189
- 7.8.7 强弱验证器 190
- 7.8.8 什么时候应该使用实体标签和最近修改日期 190
- 7.9 控制缓存的能力 191
- 7.9.1 no-Store与no-Cache响应首部 191
- 7.9.2 max-age响应首部 192
- 7.9.3 Expires响应首部 192
- 7.9.4 must-revalidate响应首部 192
- 7.9.5 试探性过期 193
- 7.9.6 客户端的新鲜度限制 194
- 7.9.7 注意事项 194
- 7.10 设置缓存控制 195
- 7.10.1 控制Apache的HTTP首部 195
- 7.10.2 通过HTTP-EQUIV控制HTML缓存 196
- 7.11 详细算法 197
- 7.11.1 使用期和新鲜生存期 198
- 7.11.2 使用期的计算 198
- 7.11.3 完整的使用期计算算法 201
- 7.11.4 新鲜生存期计算 202
- 7.11.5 完整的服务器——新鲜度算法 202
- 7.12 缓存和广告 204
- 7.12.1 发布广告者的两难处境 204
- 7.12.2 发布者的响应 204
- 7.12.3 日志迁移 205
- 7.12.4 命中计数和使用限制 205
- 7.13 更多信息 205
- 第8章 集成点:网关、隧道及中继 207
- 8.1 网关 208
- 8.2 协议网关 210
- 8.2.1 HTTP/*:服务器端Web网关 211
- 8.2.2 HTTP/HTTPS:服务器端安全网关 212
- 8.2.3 HTTPS/HTTP客户端安全加速器网关 212
- 8.3 资源网关 213
- 8.3.1 CGI 215
- 8.3.2 服务器扩展API 215
- 8.4 应用程序接口和Web服务 216
- 8.5 隧道 217
- 8.5.1 用CONNECT建立HTTP隧道 217
- 8.5.2 数据隧道、定时及连接管理 219
- 8.5.3 SSL隧道 219
- 8.5.4 SSL隧道与HTTP/HTTPS网关的对比 220
- 8.5.5 隧道认证 221
- 8.5.6 隧道的安全性考虑 221
- 8.6 中继 222
- 8.7 更多信息 224
- 第9章 Web机器人 225
- 9.1 爬虫及爬行方式 226
- 9.1.1 从哪儿开始:根集 226
- 9.1.2 链接的提取以及相对链接的标准化 227
- 9.1.3 避免环路的出现 228
- 9.1.4 循环与复制 228
- 9.1.5 面包屑留下的痕迹 229
- 9.1.6 别名与机器人环路 230
- 9.1.7 规范化URL 230
- 9.1.8 文件系统连接环路 231
- 9.1.9 动态虚拟Web空间 232