这是我参与「第五届青训营 」笔记创作活动的第5天。
初始HTTP
超文本传输协议,也叫HTTP
它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的 Web 文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。
客户端和服务端通过交换各自的消息(与数据流正好相反)进行交互。由像浏览器这样的客户端发出的消息叫做请求(request),被服务端响应的消息叫做响应(response)。
HTTP 被设计于 20 世纪 90 年代初期,是一种可扩展的协议。它是应用层的协议,通过 TCP,或者是 TLS——加密的 TCP 连接来发送,理论上任何可靠的传输协议都可以使用。因为其良好的扩展性,时至今日,它不仅被用来传输超文本文档,还用来传输图片、视频或者向服务器发送如 HTML 表单这样的信息。HTTP 还可以根据网页需求,仅获取部分 Web 文档内容更新网页。
主要由三种组装,浏览器也叫客户端,发起请求,服务器接收请求,并给出响应,Server 不一定是一台机器,但一个机器上可以装载的众多 Servers。在 HTTP/1.1 和 Host 标头中,它们甚至可以共享同一个 IP 地址。代理,由于 Web 栈层次结构的原因,它们大多都出现在传输层、网络层和物理层上,对于 HTTP 应用层而言就是透明的,虽然它们可能会对应用层性能有重要影响。还有一部分是表现在应用层上的,被称为代理(Proxy)。代理既可以表现得透明,又可以不透明(“改变请求”会通过它们)。代理主要有如下几种作用:
- 缓存(可以是公开的也可以是私有的,像浏览器的缓存)
- 过滤(像反病毒扫描,家长控制...)
- 负载均衡(让多个服务器服务不同的请求)
- 认证(对不同资源进行权限管理)
- 日志记录(允许存储历史信息) HTTP 依赖于面向连接的 TCP 进行消息传递,但连接并不是必须的。 一般请求:
- 一个 HTTP 的请求方法,经常是由一个动词像
GET、POST或者一个名词像OPTIONS、HEAD来定义客户端的动作行为。通常客户端的操作都是获取资源(GET 方法)或者发送 HTML 表单(POST 方法),虽然在一些情况下也会有其他操作。 - 要获取的资源的路径,通常是上下文中就很明显的元素资源的 URL,它没有 protocol(
http://),domain(developer.mozilla.org),或是 TCP 的 port (en-US)(HTTP 一般在 80 端口)。 - HTTP 协议版本号。
- 为服务端表达其他信息的可选标头。
- 对于一些像 POST 这样的方法,报文的主体(body)就包含了发送的资源,这与响应报文的主体类似。
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
读取
- HTTP 协议版本号。
- 一个状态码(状态码(status code)),来告知对应请求执行成功或失败,以及失败的原因。
- 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
- HTTP 标头,与请求标头类似。
- 可选项,比起请求报文,响应报文中更常见地包含获取资源的主体。
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)