关于Http协议的发展历史。
最初版本的 HTTP
协议并没有版本号,后来它的版本号被定位在 0.9 以区分后来的版本。
GET /mypage.html
<html>
这是一个非常简单的 HTML 页面
</html>
GET
,且一旦连接到服务器,协议、服务器、端口号这些都不是必须的。html
格式。可以参照 RFC 1945来核实本文的内容。一个典型的HTTP 1.0
请求
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
一个包含图片的页面
<IMG SRC="/myimage.gif">
</HTML>
GET POST HEAD
请求方法HTTP
标头用于传输元数据Content-Type
字段传输其他文档类型发布在HTTP1.0
的下一年,修订并消除了诸多歧义。也是目前最流行的HTTP
版本。最近一次修订的相关文档RFC 7235。
GET /static/img/header-background.png HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/zh-CN/docs/Glossary/Simple_header
200 OK
Age: 9578461
Cache-Control: public, max-age=315360000
Connection: keep-alive
Content-Length: 3077
Content-Type: image/png
Date: Thu, 31 Mar 2016 13:34:46 GMT
Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT
Server: Apache
(image content of 3077 bytes)
****
TCP
连接中,客户端可以同时发送多个请求。或者说,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。 206(Partial Content)
用于支持断点续传Cache-control
: 用于指定缓存策略Etag / IF-None-Match
用于执行cache
效验Etag
效验没有时间戳不一致的问题,但同时对服务器的运算能力提出更高的要求Host
标头 HTTP1.0
中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname
)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers
),并且它们共享一个 IP 地址。HTTP1.1
的请求消息和响应消息都应支持Host
头域,且请求消息中如果没有 Host 头域会报告一个错误(400 Bad Request
)。有了Host
字段,就可以将请求发往同一台服务器上的不同网站,为虚拟主机的兴起打下了基础。Connection: keep-alive
,即 TCP 连接默认不关闭,可以被多个请求复用。队头阻塞 HTTP/1.1 的持久连接和管道机制允许复用 TCP 连接,在一个 TCP 连接中,也可以同时发送多个请求,但是所有的数据通信都是按次序完成的,服务器只有处理完一个回应,才会处理下一个回应。比如客户端需要 A、B 两个资源,管道机制允许浏览器同时发出 A 请求和 B 请求,但服务器还是按照顺序,先回应 A 请求,完成后再回应 B 请求,这样如果前面的回应特别慢,后面就会有很多请求排队等着,这称为“队头阻塞(Head-of-line blocking)”