HTTP权威指南BR-1:Web的基础      
View on GitHub

龙珠

修炼自己与发现世界

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的结构组件包括:

* 代理:位于客户端与服务器之间,一般用来做内容检查、审查等;

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请求命令方法常见的包括:

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的所有细节。主要包括方法如下:

TCP事务时延

TCP建立连接、传输请求、相应报文的时延可能比事务处理的时延要长很多。

TCP握手时延

三次握手。小的HTTP事务可能会在TCP建立上花费50%甚至更多的时间。

延迟确认

由于确认报文很小,所以TCP允许在发往相同方向的输出数据分组中对其进行“捎带”,可以有效的利用网络。若是在规定窗口时间内没有等到,就将确认信息放在单独分组中传送。

TCP慢启动

TCP连接会随着时间进行自我“调谐”,起初会限制连接的最大速度,若数据传输成功,会随着时间的推移提高传输速度。用于防止因特网的突然过载和拥塞。因此,新连接的传输速度会比交换过一定量数据的“已调谐”连接慢一些。

提高HTTP连接性能

并行连接并不一定更快,但会让用户感觉起来快一些;

持久连接

持久连接包括:

  1. HTTP/1.0+ “keep-alive”连接

Connection: keep-alive首部只是请求将连接保持在活跃状态,发出Connection: keep-alive请求后,客户端和服务器并不一定会同意进行keep-alive会话。

Connection: keep-alive首部必须随所有希望保持长久连接的报文一起发送。若客户端没有发送Connection: keep-alive首部,服务器就会在那条请求之后关闭连接。

  1. HTTP/1.1 “persistent”连接

除非特别指明,否则HTTP/1.1假定所有连接都是持久的。要在事物处理结束之后,应用程序向报文中显式的添加一个Connection: close首部,来将连接关闭。不过,不发送Connection: close首部并不意味着服务器承诺永远将连接保持在打开状态。

持久连接和并行连接配合使用可能是最高效的方式。

参考资料: