HTTP权威指南自学总结

第一章HTTP概述

1.1HTTP

客户端向服务器发送HTTP请求,服务器会在HTTP响应中送回所请求的数据。
HTTP客户端和HTTP服务器共同构成了万维网的基本组件。

1.2Web客户端和服务器

Web服务器是Web资源的宿主,Web资源是Web内容的源头。
最简单的资源就是Web服务器文件系统中的静态文件。资源还可以是根据需要生成内容的软件程序。
URI:服务器资源名称为统一资源标识符
http://www.joes-hardware.com/specials/saw-blade.gif
URI有两种形式分别为:URL和URN

URL:统一资源定位符
http----使用HTTP协议
www.joes-hardware.com----进入www.joes-hardware.com
/specials/saw-blade.gif----获取名为/specials/saw-blade.gif的资源
几乎所有的URI都是URL。
大部分URL都遵循一种标椎格式,这种格式包含三个部分
1.URL的第一部分被称为方案,说明了访问资源所使用的的协议类型,这部分通常就是HTTP协议(http://)
2.第二部分给出了服务器的因特网地址(比如www.joes-hardware.com)
3.第三部分指定了Web服务器上的某个资源(比如 /specials/saw-blade.gif)

URN:统一资源名。URN是作为特定内容的唯一名称使用的,与目前的资源所在地无关。
不论因特网标准文档RFC2141位于何处,都可以用下列URN来命名:urn:ietf:rfc:2141
URN仍然处于试验阶段,还未大范围使用。

1.3事务

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

HTTP请求方法:GET 从服务器向客户端发送命名资源
PUT 将来自客户端的数据存储到一个命名的服务器资源中去
DELETE 从服务器中删除命名资源
POST 将客户端数据发送到一个服务器网关应用程序
HEAD 仅发送命名资源响应中的HTTP首部
状态码:
200 OK,文档正确返回
302 重定向,到其他地方去获取资源
404 无法找到这个资源

1.4报文

从Web客户端发往Web服务器的HTTP报文称为请求报文,从服务器发往客户端的报文称为响应报文,此外没有其他类型的HTTP报文。

HTTP报文格式:
1.起始行:报文的第一行就是起始行,在请求报文中用来说明要做什么,在响应报文中说明出现了什么情况。
2.首部字段:起始行后面有零个或多个首部字段,每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号来分隔。首部以一个空行结束,添加一个首部字段和添加新行一样简单。
3.主体:空行之后就是可选的报文主体了,其中包含了所以类型的数据。请求主体中包括了要发送给Web服务器的数据;响应主体中装载了要返回给客户端的数据。
起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意的二进制数据。
简单的文本结构组成的HTTP报文:
HTTP权威指南自学总结

1.6 TCP/IP

HTTP是个应用层协议,把联网的细节交给了因特网传输协议TCP/IP。
TCP提供了:
无差错的数据传输
按序传输(数据总是会按照发送的顺序到达)
未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)
只要建立了TCP连接,客户端和服务器之间的报文交换就不会丢失,不会被破坏,也不会在接收时出现错序了。
HTTP网络协议栈:
HTTP权威指南自学总结
Telnet程序可以将键盘连接到某个目标TCP端口,并将此TCP端口的输出回送到显示屏上,Telnet常用于远程终端会话,但它几乎可以连接所有的TCP服务器,包括HTTP服务器。

1.7Web结构组件

代理:位于客户端和服务器之间的HTTP中间实体
缓存:HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方
网关:连接其他应用程序的特殊Web服务器
隧道:对HTTP通信报文进行盲转发的特殊代理。常见的用途是通过HTTP连接承载加密的安全套接字层(SSL)流量。
Agent代理:发起自动HTTP请求的半智能Web客户端

第二章URL与资源

2.1URL语法

通用URL组件
方案:使用什么协议
http://www.joes-hardware.com/specials/saw-blade.gif 中的http
用户,密码:很多服务器要求输入用户名和密码才会允许用户访问数据。
例子:
ftp://ftp.prep.ai.mit.edu/pub/gnu
ftp://[email protected]/pub/gnu
ftp://username:[email protected]/pub/gnu
主机,端口:提供了哪台机器装载了资源,以及在那台机器的什么地方可以找到对目标资源进行访问的服务器。
示例:http://www.joes-hardware.com:80/index
http://161.58.228.45:80/index
路径:说明了资源位于服务器的什么地方。路径通常很像一个分级的文件系统路径。
示例:http://www.joes-hardware.com/specials/saw-blade.gif 中的/specials/saw-blade.gif
参数:为了向应用程序提供它们所需的输入参数,以便正确地与服务器进行交互。
示例:ftp://ftp.prep.ai.mit.edu/pub/gnu;type=d中的type=d
查询:很多资源,比如数据库服务,都是可以通过提问题或进行查询来缩小所请求资源类型范围的。
示例:http://www.joes-hardware.com/specials/saw-blade.gif?item=13721&color=blue中的?item=13721&color=blue
片段:为了引用部分资源或资源的一个片段,URL支持使用片段组件来表示一个资源内部的片段。
示例:ftp://ftp.prep.ai.mit.edu/pub/gnu#drills中的#drills

2.2URL快捷方式

URL有两种方式:绝对的和相对的。
绝对URL中包含有访问资源所需的全部信息。
相对URL是不完整的,要从相对URL中获取访问资源所需的全部消息,就必须相对于另一个,被称为其基础的URL进行解析。
绝对的:http://www.joes-hardware.com/tools.html
相对的:./hammers.html

相对URL和基础URL转换成绝对URL如图:
HTTP权威指南自学总结
路径为./hammers.html,基础URL为http://www.joes-hardware.com/tools.html。
方案为空,沿着图表的左半边向下处理,继承基础URL方案(HTTP)。
至少一个组件非空,一直处理到底端,继承主机和端口组件。
将来自相对URL的组件与我们继承来的组件合并起来,得到新的绝对URL:http://www.joes-hardware.com/hammers.html
编码字符示例:
~ http://www.joes-hardware.com/%7Ejoe
空格 http://www.joes-hardware.com/more%20tools.html
% http://www.joes-hardware.com/100%25satisfaction.html

常见方案格式:
1.http :超文本传输协议
示例 http://www.joes-hardware.com/tools.html 默认端口 80
2.https :与http是一对,唯一的区别在于方案https使用了网景的SSL,SSL为HTTP连接提供了端到端的加密机制
示例 https://www.joes-hardware.com/tools.html 默认端口 443
3.mailto :指向的是E-mail地址。
示例 mailto:[email protected]
4.ftp :文件传输协议可以用来从FTP服务器上下载或向其上传文件,并获取FTP服务器上的目录结构内容的列表。
示例 ftp://anonymous:joe%[email protected]:21/pub/gnu/ 默认端口 21
5.rtsp,rtspu: RTSP是可以通过实时流传输协议,解析音频视频媒体资源的标识符。
rtspu中的u表示它是使用UDP协议来获取资源的。
示例 rtsp://www.joes-hardware.com:554/interview/cto_video 默认端口 554
6.file:表示一台指定主机上可直接访问的文件。
示例 file://OFFICE-FS/policies/casual-fridays.doc
7.news:根据RFC1036的定义,用来访问一些特定的文章或新闻组。newsURL自身包含的信息不足以对资源进行定位。
示例 news:rec.arts.startrek
8.telnet:用于访问交互式业务。它表示的并不是对象自身,而是可通过telnet协议访问的交互式应用程序。
示例 telnet://slurp:[email protected]:23/

第三章HTTP报文

3.1报文流

HTTP报文是在HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。
不管是请求报文还是响应报文,所有报文都会向下游流动。所有报文的发送者都在接受者的上游。
HTTP权威指南自学总结

3.2报文的组成部分

每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应。
由三个部分组成,对报文进行描述的起始行,包含属性的首部块,以及可选的包含数据的主体部分。
起始行和首部是由行分隔的ASCII文本。每行都以一个由两个字符组成的行终止序列作为结束,其中包括一个回车符和一个换行符。行终止序列可以写作CRLF。
稳健的应用程序也应该接受单个换行符作为行的终止。
注意:一组HTTP首部总是应该以一个空行结束,甚至即使没有首部和实体的主体部分也应如此。
HTTP权威指南自学总结

3.2.1报文语法:

方法,请求URL,版本,状态码,原因短语,首部,实体的主体部分
HTTP权威指南自学总结

3.2.2起始行:

1.请求行:请求报文请求服务器对资源进行一些操作,请求报文的起始行称为请求行,包含了一个方法和一个请求URL,这个方法描述了服务器应该执行的操作,
请求URL描述了要对哪个资源执行这个方法。请求行中还包含了HTTP的版本,用来告知服务器,客户端使用的是哪种HTTP。所有这些字段都由空格符分隔。
示例:GET /testhi-there.txt HTTP/1.1 一个方法GET 一个请求URL /testhi-there.txt HTTP的版本HTTP/1.1
2.响应行:响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应报文的起始行称为响应行,包含了响应报文使用的HTTP版本、数字状态码,
以及描述操作状态的文本形式的原因短语。所有这些字段都由空格符分隔。
示例:HTTP/1.0 200 OK HTTP版本HTTP/1.0 数字状态码200 原因短语OK
3.方法:请求的起始行以方法作为开始,方法用来告知服务器要做些什么。
示例:GET /testhi-there.txt HTTP/1.1 GET方法
** 常用HTTP方法:**
HTTP权威指南自学总结
4.状态码:是用来告诉客户端,发生了什么事情。
200–299之间的状态码表示成功。
300–399之间的状态码表示资源已经被移走。
400–499之间的状态码表示客户端请求出错了。
500–599之间的状态码表示服务器出错了。

100–199信息状态码
200–299成功状态码
300–399重定向状态码
400–499客户端错误状态码
500–599服务器错误状态码
5.原因短语:原因短语和状态码是成对出现的。原因短语是状态码的可读版本。
6.版本号:版本号会以HTTP/x.y的形式出现在请求和响应报文的起始行中。

3.2.3首部:

首部跟在起始行后面可以有零个、一个或多个HTTP首部字段。
HTTP首部字段向请求和响应报文中添加了一些附加信息。本质上来说,它们只是一些名、值对的列表。
示例:Content-length:19
1.首部分类:
通用首部:既可以出现在请求报文中,也可以出现在响应报文中。
请求首部:提供更多有关请求的信息。
响应首部:提供更多有关响应的信息。
实体首部:描述主体的长度和内容,或者资源本身。
扩展首部:规范中没有定义的新首部。
2.首部延续行
将长的首部行分为多行可以提高可读性,多出来的每行前面至少要有一个空格或tab
示例:Server:Test Server
Version 1.0
常见首部实例:
HTTP权威指南自学总结

3.2.4实体的主体部分:

HTTP报文的第三部分是可选的实体主体部分,实体的主体是HTTP报文的负荷,就是HTTP要传输的内容。

3.3方法

1.GET:是最常用的方法。通常用于请求服务器发送某个资源。
GET示例:
HTTP权威指南自学总结
2.HEAD:与GET方法行为类似,但服务器在响应中只返回首部。不会返回实体的主体部分。
使用HEAD可以:
在不获取资源的情况下了解资源的情况;
通过查看响应中的状态码,看看某个对象是否存在;
通过查看首部,测试资源是否被修改了。
HEAD示例:
HTTP权威指南自学总结
3.PUT:与GET从服务器读取文档相反,PUT方法会向服务器写入文档。
允许用户对内容进行修改。
PUT示例:
HTTP权威指南自学总结
4.POST:起初是用来向服务器输入数据的,实际上通常会用它来支持HTML的表单。表单中填好的数据通常会被送给服务器,然后由服务器将其发送到它要去的地方。
POST示例:
HTTP权威指南自学总结
5.TRACE:客户端发起一个请求时,这个请求可能要穿过防火墙、代理、网关或其他一些应用程序。每个中间节点都可能会修改原始的HTTP请求。
TRACE方法允许客户端在最终将请求发送给服务器时,看看它变成了什么样子。
TRACE请求会在目的服务器端发起一个环回诊断,行程最后一站的服务器会弹回一条TRACE响应,并在响应主体中携带它收到的原始请求报文。这样客户端就可以查看在所有中间HTTP应用程序组成的请求/响应链上,原始报文是否以及如何被毁坏或者修改过。
TRACE主要用于诊断。TRACE请求中不能带有实体的主体部分。
TRACE示例:
HTTP权威指南自学总结
6.OPTIONS:请求Web服务器告知其支持的各种功能,可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法。
OPTIONS示例:
HTTP权威指南自学总结
7.DELETE:请服务器删除请求URL所指定的资源。客户端应用程序无法保证删除操作一定会被执行,因为HTTP规范允许服务器在不通知客户端的情况下撤销请求。
DELETE示例:
HTTP权威指南自学总结
8.扩展方法:扩展方法指的就是没有在HTTP/1.1规范中定义的方法。

第四章TCP连接

4.1TCP连接

世界上几乎所有的HTTP通信都是由TCP/IP承载的,TCP/IP是全球计算机及网络设备都在使用的一种常用的分组交换网络分层协议集。
Web浏览器通过TCP连接与Web服务器进行交互
http://www.joes-hardware.com:80/power-tools.html
1.浏览器解析出主机名
2.浏览器查询这个主机名的IP地址(DNS)
3.浏览器获得端口号(80)
4.浏览器发起到202.43.78.3端口80的连接
5.浏览器向服务器发送一条HTTP GET报文
6.浏览器从服务器读取HTTP响应报文
7.浏览器关闭连接
HTTP权威指南自学总结

4.1.1TCP的可靠数据管道

TCP为HTTP提供了一条可靠的比特传输管道,从TCP连接一端填入的字节会从另一端以原有的顺序,正确地传送出来。
TCP流是分段的,由IP分组传送:
TCP的数据是通过名为IP分组的小数据块来发送的。

HTTP要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输,TCP收到数据流之后,会将数据流砍成被称作段的小数据块,并将段封装在IP分组中,通过因特网进行传输。所有这些工作都是由TCP/IP软件来处理的。
每个IP分组中包括:
一个IP分组首部,一个TCP段首部,一个TCP数据块。

TCP连接是通过4个值来识别的:
<源IP地址,源端口号,目的IP地址,目的端口号>
这四个值一起唯一地定义了一条连接。两条不同的TCP连接不能拥有4个完全相同的地址组件值(不同连接的部分组件可以拥有相同的值)。

TCP客户端和服务器通过TCP套接字接口进行通信流程:
服务器:创建新的套接字,将套接字绑定到端口80上,允许套接字进行连接,等待连接
客户端:获取IP地址和端口号,创建新的套接字,连接到服务器IP:port上
服务器:通知应用程序有连接到来,开始读取请求
客户端:连接成功,发送HTTP请求,等待HTTP响应
服务器:处理HTTP请求报文,回送HTTP响应,关闭连接
客户端:处理HTTP响应,关闭连接
HTTP权威指南自学总结

4.2TCP性能

1.HTTP事务的时延
TCP网络时延的大小取决于硬件速度、网络和服务器的负载,请求和响应报文的尺寸,以及客户端和服务器之间的距离。
2.TCP连接的握手时延
3.延迟确认
由于因特网自身无法确保可靠的分组传输,所以TCP实现了自己的确认机制来确保数据的成功传输。
4.TCP慢启动
TCP连接会随着时间进行自我调谐,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度,这种调谐被称为TCP慢启动,用于防止因特网的突然过载和拥塞。
TCP慢启动限制了一个TCP端点在任意时刻可以传输的分组数。发送一个分组,等待确认,再发送两个分组,等待确认,可以发送四个分组,以此类推。
5.Nagle算法与TCP_NODELAY
Nagle算法试图在发送一个分组之前,将大量TCP数据绑定在一起,以提高网络效率。
Nagle算法鼓励发送全尺寸的段,只有当所有其他分组都被确认之后,Nagle算法才允许发送非全尺寸的分组,如果其他分组仍然在传输中,就将那部分数据缓存起来,只有当挂起分组被确认,或者缓存中积累了足够发送一个全尺寸分组的数据时,才会将缓存的数据发送出去。小的HTTP报文可能无法填满一个分组,可能会因为等待那些永远不会到来的额外数据而产生时延。
6.TIME_WAIT时延和端口耗尽
TIME_WAIT端口耗尽是很严重的性能问题,会影响到性能基准,但在现实中相对较少出现。

最常见的TCP相关时延:
TCP连接建立握手
TCP慢启动拥塞控制
数据聚集的Nagle算法
用于捎带确认的TCP延迟确认算法
TIME_WAIT时延和端口耗尽

TCP建立连接三次握手:
1.请求新的TCP连接时,客户端要向服务器发送一个小的TCP分组。这个分组中设置了一个特殊的SYN标记,说明这是一个连接请求
2.如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个TCP分组,这个分组中的SYN和ACK标记都被置位,说明连接请求已被接受。
3.最后,客户端向服务器发送一条确认信息,通知它连接已成功建立。

4.3HTTP连接处理

提高HTTP的连接性能的方法:
并行连接:通过多条TCP连接发起并发的HTTP请求
持久连接:重用TCP连接,以消除连接及关闭时延
管道化连接:通过共享的TCP连接发起并发的HTTP请求
复用的连接:交替传送请求和响应报文。

4.4并行连接

HTTP允许客户端打开多条连接,并行地执行多个HTTP事务。
并行连接可能会提高页面的加载速度
并行连接不一定更快
并行连接可能让人感觉更快一些

并行连接缺点:
每个事务都会打开/关闭一条新的连接,会耗费时间和带宽
由于TCP慢启动特性的存在,每条新连接的性能都会有所降低
可打开的并行连接数量实际上是有限的

4.5持久连接

在事务处理结束之后仍然保持在打开状态的TCP连接被称为持久连接。非持久连接会在每个事务结束之后关闭,
持久连接会在不同事务之间保持打开状态,直到客户端或服务器决定将其关闭为止。
持久连接与并行连接配合使用可能是最高效的方式。

4.6管道化连接

在响应到达之前,可以将多条请求放入队列。
所有HTTP客户端、服务器或代理都可以在任意时刻关闭一条TCP传输连接。