HTTP权威指南BR-1:Web的基础
By arthur503 -- 17 Oct 2013
前天刚买的《HTTP权威指南》,准备看一下HTTP协议。昨天看了前四章,对基本的有了个了解。现在整理总结一下。
CH1 HTTP概述
HTTP协议主要是用来做Web客户端和服务器通信的,是因特网的通用公共语言。
每个资源在因特网上都有资源地址(URI,一般表现为URL,下一代为URN),通过HTTP协议对地址请求获取。HTTP会给每种资源都打上MIME的数据格式标签,如:
Content-type: text/html
前者text表示主类型,后者html表示子类型。
一个HTTP事务是由一条Request请求命令和Response响应结果组成,这种通信是通过名为HTTP报文(HTTP Message)的格式化数据块进行的。详细见下面CH3。
HTTP连接使用TCP/IP协议。TCP提供:
* 无差错的数据传输 * 按需传输(数据总是会按照发送顺序到达) * 未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)
HTTP是应用层协议,TCP是传输层(Transmission)协议,IP是网络层(Internet)协议。
HTTP在URL没有端口号时,默认为80端口。
HTTP协议版本有:HTTP/0.9, HTTP/1.0, HTTP/1.0+, HTTP/1.1, HTTP-NG(HTTP/2.0)
Web的结构组件包括:
* 代理:位于客户端与服务器之间,一般用来做内容检查、审查等;
- 缓存:HTTP仓库,是特殊的HTTP代理服务器。通常保存常用页面的副本来加快访问速度;
- 网关:特殊的Web服务器,通常用于将HTTP等协议转换为其他协议,作为其他服务器的中间实体使用;
- 隧道:对HTTP通信报文进行盲转发的特殊代理;
- Agent 代理:半智能Web客户端,如Web浏览器等,代表用户发起HTTP请求的客户端程序;
CH2 URL与资源
URL是因特网上资源信息地址。URI是更通用的资源标识符,包括URL和URN组成。URL实际上是URI的一个子集,但实际中URL更通用。
URL的通用格式如下:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
其中,scheme就是方案,指访问服务器以获取资源时要使用哪种协议。方案名是大小写无关的,即http与HTTP等价。
CH3 HTTP报文
HTTP报文是在HTTP应用程序之间发送的简单格式化数据块。HTTP报文都是纯文本,不是二进制代码,方便人们读写。包括:对报文进行描述的起始行(Start Line),包含属性的首部块(Header),以及可选的、包含数据的主体(Body)部分。注意:首部的最后使用空行表示结尾。
一个HTTP事务是由一条Request请求命令和Response响应结果组成,这种通信是通过名为HTTP报文(HTTP Message)的格式化数据块进行的。
HTTP Request请求命令方法常见的包括:
- GET
- POST
- PUT
- DELETE
- HEAD
HTTP Response响应结果状态码是一个三位数字的代码。常见的包括:
* 200~299:成功
* 300~399:资源被重定向
* 400~499:客户端错误(常见的是404 not found,表示客户端请求网页不存在错误)
* 500~599:服务器端错误
简单报文示例如下:
请求报文:
GET /index.html HTTP/1.0
Accept:text/*
Accept-Language: en, fr
响应报文:
HTTP1.0 200 OK
Content-type: text/plain
Content-length: 19
Hi!I'm a message!
CH4 连接管理
TCP是通过端口号来保持所有连接不断的进行。TCP连接是通过四个值来识别的:
<源IP地址、源端口号、目的IP地址、目的端口号>
这四个值唯一的定义了一条连接,没有两个不同连接所有的四个值都是一样的。两个不同的TCP连接不能拥有四个完全相同的地址组件值(但不同连接的部分组件可以拥有相同的值)。
TCP编程接口有套接字API提供的主要接口,它向HTTP程序员隐藏了TCP和IP的所有细节。主要包括方法如下:
- s = new socket():建立一个新的、未命名、未关联的套接字;
- bind():向套接字赋一个本地端口号和接口;
- connect():创建本地套接字与远程主机及端口的连接;
- listen():标识一个套接字,使其可以合法接受连接;
- accept():等待某人建立一条到本地端口的连接;
- read():尝试从套接字向缓冲区读取字节;
- write():尝试从缓冲区中向套接字写入字节;
- close();完全关闭TCP连接;
- shutdown():只关闭TCP连接的输入或输出端;
TCP事务时延
TCP建立连接、传输请求、相应报文的时延可能比事务处理的时延要长很多。
TCP握手时延
三次握手。小的HTTP事务可能会在TCP建立上花费50%甚至更多的时间。
延迟确认
由于确认报文很小,所以TCP允许在发往相同方向的输出数据分组中对其进行“捎带”,可以有效的利用网络。若是在规定窗口时间内没有等到,就将确认信息放在单独分组中传送。
TCP慢启动
TCP连接会随着时间进行自我“调谐”,起初会限制连接的最大速度,若数据传输成功,会随着时间的推移提高传输速度。用于防止因特网的突然过载和拥塞。因此,新连接的传输速度会比交换过一定量数据的“已调谐”连接慢一些。
提高HTTP连接性能
- 并行连接:通过多条TCP连接发起并发的HTTP请求;
- 持久连接:重用TCP连接,以消除连接及关闭时延。
- 管道化连接:通过共享的TCP连接发起并发的HTTP请求; * 复用的连接:交替传送请求和相应报文(试验阶段);
并行连接并不一定更快,但会让用户感觉起来快一些;
持久连接
持久连接包括:
- HTTP/1.0+ “keep-alive”连接
Connection: keep-alive首部只是请求将连接保持在活跃状态,发出Connection: keep-alive请求后,客户端和服务器并不一定会同意进行keep-alive会话。
Connection: keep-alive首部必须随所有希望保持长久连接的报文一起发送。若客户端没有发送Connection: keep-alive首部,服务器就会在那条请求之后关闭连接。
- HTTP/1.1 “persistent”连接
除非特别指明,否则HTTP/1.1假定所有连接都是持久的。要在事物处理结束之后,应用程序向报文中显式的添加一个Connection: close首部,来将连接关闭。不过,不发送Connection: close首部并不意味着服务器承诺永远将连接保持在打开状态。
持久连接和并行连接配合使用可能是最高效的方式。
参考资料:
- 《HTTP权威指南》