最近在看《图解 HTTP》。全书以图解的形式生动形象的讲解了 HTTP 协议。本文是根据该书整理的笔记,方便以后回顾。
HTTP 又称超文本传输协议(HTTP,HyperText Transfer Protocol)。
HTTP 是互联网上应用最为广泛的一种网络协议,用于从万维网(WWW)服务器传输超文本到本地浏览器。所有的 www 文件都必须遵守这个标准。
设计 HTTP 最初的目的是为了提供一种发布和接收 html 页面的方法。
1960 年美国人
构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext), 这成为了 HTTP 超文本传输协议标准架构的发展根基。
- Ted Nelson
组织协调万维网协会(World Wide web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的 RFC,其中著名的
- Ted Nelson
定义了
- RFC 2616
。
- HTTP/1.1
HTTP 的历史:
- HTTP/0.9已过时。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息。
- HTTP/1.0这是第一个在通讯中指定版本号的HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。
- HTTP/1.1当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。
TCP/IP 是为了解决全世界计算机互联问题而出现的通信协议。早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple 和 Microsoft 都有各自的网络协议,互不兼容。虽然互联网协议包含了上百种协议标准,但是最重要的两个协议是 TCP 和 IP 协议,所以,大家把互联网的协议简称 TCP/IP 协议。
TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。
在 TCP/IP 中包含一系列用于处理数据通信的协议:
通信的时候,双方必须知道对方的标识。互联网上每个计算机的唯一标识就是 IP 地址,类似 123.123.123.123。如果一台计算机同时接入到两个或更多的网络,比如路由器,它就会有两个或多个 IP 地址,所以,IP 地址对应的实际上是计算机的网络接口,通常是网卡。
IP 协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过 IP 包发送出去。由于互联网链路复杂,两台计算机之间经常有多条线路,因此,路由器就负责决定如何把一个 IP 包转发出去。IP 包的特点是按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。
TCP 协议则是建立在 IP 协议之上的。TCP 协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP 协议会通过握手建立连接,然后,对每个 IP 包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。
许多常用的更高级的协议都是建立在 TCP 协议基础上的,比如用于浏览器的 HTTP 协议、发送邮件的 SMTP 协议等。
HTTP 协议工作于客户端 - 服务端架构为上。
请求 URI 的方式有多种:
1) 完整的 URI:
- GET http: //52fhy.com/index.html HTTP/1.1
2) 分开写:
- GET /index.html HTTP/1.1
- Host: 52fhy.com
3) 除此之外,如果不是对服务器上的资源进行访问,而是对服务器本身发起请求,可以用
来代替 URI:
- *
- OPTIONS * HTTP/1.1
方法 | 说明 |
---|---|
GET | 获取资源 |
POST | 传输实体主体 |
PUT | 传输文件 |
HEAD | 获得报文首部 |
DELETE | 删除文件 |
OPTIONS | 询问服务器支持的方法 |
TRACE | 追踪路径 |
CONNECT | 要求用隧道协议连接代理 |
LINK | 建立和资源的联系 |
UNLINK | 断开连接关系 |
用于 HTTP 协议交互的信息称为
。HTTP 报文本质上是字符串文本。
- HTTP报文
根据请求的端来区分,HTTP 报文可以分为
(客户端的 HTTP 报文)和
- 请求报文
(服务器端的 HTTP 报文)。
- 响应报文
根据报文结构,HTTP 报文可以分为
和
- 报文首部
。通常,不一定有报文主体。但报文首部是必须的。
- 报文主体
- 报文首部
- (空行 CR+LF,即回车换行)
- 报文主体
示例(报文主体为空):
- GET /index.html HTTP/1.1
- Host: 52fhy.com
- Connection: keep-alive
请求报文格式:
GET 请求:
- GET /path HTTP/1.1
- Header1: Value1
- Header2: Value2
- Header3: Value3
POST 请求:
- POST /path HTTP/1.1
- Header1: Value1
- Header2: Value2
- Header3: Value3
- body data goes here...
报文首部和报文主体通过
(Python 里是
- CR+LF
) 来分隔的。
- \r\n\r\n
响应报文格式:
- HTTP/1.1 200 OK
- Header1: Value1
- Header2: Value2
- Header3: Value3
- body data goes here...
HTTP 响应如果包含 body,也是通过
(Python 里是
- CR+LF
) 来分隔的。
- \r\n\r\n
请求报文和响应报文的内容由以下几部分组成:
,包含用于请求的方法、请求的 URI 和协议版本;
- GET /path HTTP/1.1
,包含协议版本、响应结果的状态码、状态码说明;
- HTTP/1.1 200 OK
等。
- Cookie
HTTP 在传输时可以通过编码来提升传输速率。编码的工作会消耗更多的 CPU 等资源。
内容编码:
用于将报文主体进行压缩。内容编码后的实体由客户端接收并负责解码。
常用的内容编码:gzip、compress、deflate、identity(不进行编码)。
分块传输编码:
在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。
HTTP 状态码负责表示客户端请求的返回结果、标记服务端的处理是否正常、通知出现的错误等工作。
借助状态码,我们可以知道服务器端是正常处理了请求,还是出错了。
状态码由 3 位数字和英文原因短语组成。
状态码有 5 种类别:
类别 | 说明 | 原因短语 |
---|---|---|
1XX | 信息性状态码 | 接收的请求正在处理 |
2XX | 成功状态码 | 请求正常 |
3XX | 重定向状态码 | 需要进行附加状态以完成请求 |
4XX | 客户端错误状态码 | 服务端无法处理请求 |
5XX | 服务端错误状态码 | 服务端处理请求出错 |
只要遵守状态码类别的定义,即使改变 RFC2616 中定义的状态码,或服务器自行创建状态码都没有问题。
仅记录在 RFC2616 中的状态码就有 40 种,再加上 WebDAV 和附加 HTTP 状态码(RFC6585),数量达 60 余种。但常用的就 14 种:200,204,206,301,302,303,304,307,400,401,403,404,500,503。详细定义见下面描述。
- 100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
- 101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
- 200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
- 201 (已创建) 请求成功并且服务器创建了新的资源。
- 202 (已接受) 服务器已接受请求,但尚未处理。
- 203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
- 204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
- 205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
- 206 (部分内容) 服务器成功处理了部分 GET 请求。
- 300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
- 301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
- 302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
- 303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
- 304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
- 305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
- 307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
- 400 (错误请求) 服务器不理解请求的语法。
- 401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
- 403 (禁止) 服务器拒绝请求。
- 404 (未找到) 服务器找不到请求的网页。
- 405 (方法禁用) 禁用请求中指定的方法。
- 406 (不接受) 无法使用请求的内容特性响应请求的网页。
- 407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
- 408 (请求超时) 服务器等候请求时发生超时。
- 409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
- 410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
- 411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
- 412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
- 413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
- 414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
- 415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
- 416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
- 417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。
- 500 (服务器内部错误) 服务器遇到错误,无法完成请求。
- 501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
- 502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
- 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
- 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
- 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
来源: http://www.cnblogs.com/52fhy/p/6426569.html