HTTP 起源
HTTP
是由蒂姆·伯纳斯-李(TimBerners—Lee
)于1989年在欧洲核子研究组织(CERN
)所发起
其中最著名的是 1999 年 6 月公布的 RFC 2616,定义了 HTTP
协议中现今广泛使用的一个版本——HTTP 1.1
HTTP 是什么
全称:超文本传输协议(HyperText Transfer Protocol
)
概念:HTTP
是一种能够获取像 HTML
、图片等网络资源的通讯协议(protocol
)。它是在 web
上进行数据交换的基础,是一种 client-server
协议
HTTP
——因特网的多媒体信使 ——《HTTP权威指南》。
HTTP
在因特网的角色:充当一个信使的角色,干的就是一个跑腿的活,在客户端和服务端之间传递信息,但我们又不能缺少它。HTTP
协议是应用层的协议,是与前端开发最息息相关的协议。平时我们遇到的 HTTP
请求、 HTTP
缓存、Cookies
、跨域等其实都跟 HTTP
息息相关
HTTP 的基础特性
-
可拓展协议。
HTTP 1.0
出现的HTTP headers
让协议拓展变得更加的容易。只要服务端和客户端就headers
达成语义一致,新功能就可以被轻松的加入进来 -
HTTP
是无状态的、有会话的。在同一个连接中,两个执行成功的HTTP
请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互,比如在一个电商网站里,用户把某个商品加入到购物车,切换一个页面后再次添加了商品,这两次添加商品的请求之间没有关联,浏览器无法知道用户最终选择了哪些商品。而使用HTTP
的头部扩展,HTTP Cookies
就可以解决这个问题。把Cookies
添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。 -
HTTP
与连接。通过TCP
,或者TLS
——加密的TCP
连接来发送,理论上任何可靠的传输协议都可以使用。连接是传输层控制的,这从根本上来讲不是HTTP
的范畴。
也就是说,HTTP
依赖于面向连接的 TCP
进行消息传递,但连接并不是必须的。只需要它是可靠的,或不丢失消息的(至少返回错误)。
HTTP/1.0
默认为每一对 HTTP
请求/响应都打开一个单独的 TCP
连接。当需要连续发起多个请求时,这种模式比多个请求共享同一个 TCP
链接更低效。为此,HTTP 1.1
持久连接的概念,底层 TCP
连接可以通过 connection
头部实现。但 HTTP 1.1
在连接上也是不完美的,后面我们会提到。
基于 HTTP 的组件系统
HTTP
的组件系统包括客户端、web
服务器和代理
客户端:user-agent
浏览器,特殊比如是工程师使用的程序,以及 Web
开发人员调试应用程序
Web服务端
由 Web Server
来服务并提供客户端所请求的文档。每一个发送到服务器的请求,都会被服务器处理并返回一个消息,也就是 response
代理(Proxies)
在浏览器和服务器之间,有很多计算机和其他设备转发了 HTTP
消息。它们可能出现在传输层、网络层和物理层上,对于 HTTP
应用层而言就是透明的
有如下的一些作用
- 缓存
- 过滤(像防病毒扫描、家长控制)
- 负载均衡
- 认证(对不同的资源进行权限控制)
- 日志管理
HTTP 报文组成
HTTP 有两种类型的消息:
- 请求——由客户端发送用来触发一个服务器上的动作
- 响应——来自服务器端的应答
HTTP
消息由采用 ASCII
编码的多行文本构成的。在 HTTP/1.1
以及更早的版本中,这些消息通过连接公开的发送。在 HTTP2.0
中,消息被分到了多个 HTTP
帧中。通过配置文件(用于代理服务器或者服务器),API
(用于浏览器)或者其他接口提供 HTTP
消息
典型的 HTTP 会话
-
建立连接
在客户端-服务器协议中,连接是由客户端发起建立的。在HTTP
中打开连接意味着在底层传输层启动连接,通常是TCP
。使用TCP
时,HTTP
服务器的默认端口号是80
,另外还有8000
和8080
也很常用 -
发送客户端请求
-
服务器响应请求
HTTP 请求和响应
HTTP 请求和响应都包括起始行(start line
)、请求头(HTTP Headers
)、空行(empty line
)以及 body
部分,如下图所示:
- 起始行。
请求的起始行:请求方法、请求Path
和HTTP
版本号
响应的起始行:HTTP
版本号、响应状态码以及状态文本描述
下面详细说下请求 Path
,请求路径(Path
)有以下几种:
1)一个绝对路径,末尾跟上一个 ' ? ' 和查询字符串。这是最常见的形式,称为 原始形式 (origin form
),被 GET
,POST
,HEAD
和 OPTIONS
方法所使用
POST / HTTP/1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
2)一个完整的 URL
。主要在使用 GET
方法连接到代理的时候使用
GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
3)由域名和可选端口(以':'为前缀)组成的 URL
的 authority component
,称为 authority form
。仅在使用 CONNECT
建立 HTTP
隧道时才使用
CONNECT developer.mozilla.org:80 HTTP/1.1
4)星号形式 (asterisk form
),一个简单的星号('*'),配合 OPTIONS
方法使用,代表整个服务器。
OPTIONS * HTTP/1.1