HTTP(超文本传输协议),是一个用于传输超媒体文档的应用层协议。
HTTP是为 Web 浏览器与 Web 服务器之间的通信而设计的。
HTTP 遵循经典的客户端—服务端模型,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。
HTTP是无状态协议,服务器不会在两个请求之间保留任何数据(状态)
随之HTTP不断的扩展,还可以用来传输图片、视频或者向服务端发送信息
HTTP 还可以用来获取文档的部分内容,以便按需更新 Web 页面
客户端与服务端之间通过交换一个个独立的消息(而非数据流)进行通信。
HTTP请求由一个实体,即用户代理(user agent),或是一个可以代表它的代理方(proxy) 发出
每个请求都会被发送到一个服务端,它会处理这个请求并提供一个称作响应的回复。
客户端和服务端之前可以有很多的代理实体,履行不同作用
当客户端想要和服务端——不管是最终的服务端还是中间的代理——进行信息交互时,过程表现为下面几步:
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: zh
HTTP/1.1 200 OK
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>…(此处是所请求网页的 29769 字节)
客户端:用户代理
用户代理是任何能够代表用户行为的工具。例如:浏览器。
Web 服务端
Web 服务端负责提供客户端所请求的文档。服务端可以表现为仅有一台机器,实际可以是共享负载的一组服务器集群(负载均衡)或是其他类型的软件(如缓存、数据库服务、电商服务等),按需完整或部分地生成文档。
一个服务器可以不仅仅只有一台机器,而多个服务端软件实例也可部署在同一台机器上。利用 HTTP/1.1 和 Host 标头,它们甚至可以共用同一个 IP 地址。
代理
在浏览器和服务器之间参与传递 HTTP 消息的实体称为代理。代理可以是透明的,即转发它们收到的请求并不做任何修改,也可以表现得不透明,将它传递给服务端之前使用一些手段修改这个请求
HTTP性质
HTTP 控制的常见特性
HTTP 报文
HTTP/1.1 以及更早的 HTTP 协议报文都是语义可读的。在 HTTP/2 中,这些报文被嵌入到了一个新的二进制结构,帧。帧允许实现很多优化,比如报文标头的压缩以及多路复用。即使只有原始 HTTP 报文的一部分以 HTTP/2 发送出来,每条报文的语义依旧不变,客户端会重组原始 HTTP/1.1 请求。因此用 HTTP/1.1 格式来理解 HTTP/2 报文仍旧有效。
请求报文组成
响应报文
浏览器发送 HTTP API
服务端向客户端发送 HTTP API
总结
HTTP 是一种简单、易用、具有可扩展性的协议,其客户端—服务器模式的结构,加上能够增加标头的能力,使得 HTTP 随 Web 中不断扩展的能力一起发展。
为了提高性能,HTTP/2 将 HTTP 报文嵌入到帧中,但是报文的基本结构自 HTTP/1.0 起仍保持不变。会话流依旧简单,通过一个简单的 HTTP 消息监视器就可以查看和纠错。