HTTP 是超文本传输协议,用于传输诸如 HTML 的超媒体文档的协议。
基于 HTTP 的组件系统
HTTP是一个client-server(客户端-服务器)协议:请求通过一个实体被发出,实体也就是用户代理。
简单来说就是三个;
客户端:user-agent
Web服务端
代理(Proxies)
前两个没什么可讲的,第三个在我们进行开发的时候会经常碰到。
代理有如下几种作用:
。缓存(可以是公开的,也可以是私有的,像浏览器缓存)
。过滤(像反病毒扫描,家长控制)
。负载均衡(让多个服务器服务不同的请求)
。认证(对不同资源进行权限管理)
。日志记录(允许存储历史信息)
HTTP 的基本性质
- HTTP 是简单的
- HTTP 是可扩展的
- HTTP 是无状态,有会话的(在同一个连接中,两个执行成功的请求之间是没有关系的。使用HTTP的头部扩展,把Cookies添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。注意,HTTP本质是无状态的,使用Cookies可以创建有状态的会话。)
HTTP 能控制什么
以下是可以被HTTP控制的常见特性。
-
缓存
文档如何缓存能通过HTTP来控制。服务端能告诉代理和客户端哪些文档需要被缓存,缓存多久,而客户端也能够命令中间的缓存代理来忽略存储的文档。 -
开放同源限制
为了网络安全,浏览器强制对Web网站做了分割限制。只有来自于相同来源的网页才能获取网站的全部信息。HTTP 可以通过修改头部来开放这样的限制。 -
认证
基本的认证功能可以通过 HTTP 提供,使用Authenticate
相似的头部即可,或用 HTTP Cookies 来设置指定的会话。 -
代理和隧道
通常情况下,服务器和/或客户端是处于内网的,对外网隐藏真实 IP 地址,因此 HTTP 请求就要通过代理越过这个网络屏障。 -
会话
使用HTTP Cookies 允许你用一个服务端的状态发起请求,这就创建了会话。
HTTP 流
当客户端想要和服务端进行信息交互时(服务端是指最终服务器,或者是一个中间代理),过程表现为下面几步:
- 打开一个TCP连接:TCP连接被用来发送一条或多条请求,以及接受回应消息。客户端可能打开一条新的连接,或重用一个已经存在的连接,或者也可能开几个新的TCP连接连向服务端。
- 发送一个HTTP报文:HTTP报文(在HTTP/2之前)是语义可读的。在HTTP/2中,这些简单的消息被封装在了帧中,这使得报文不能被直接读取,但是原理仍是相同的。
- 读取服务端返回的报文信息
- 关闭连接或者为后续请求重用连接。
HTTP 报文
HTTP 报文有两种类型,请求报文和回应报文。
请求报文
请求报文由以下元素组成:
- 一个HTTP的method(请求方法)
- 要获取资源的路径
- HTTP协议版本号
- 可选的请求首部字段和内容实体
回应报文
回应报文包含的元素:
- HTTP协议版本号
- 一个状态码(status code),来告知对应请求执行成功或失败,以及失败的原因。
- 一个状态信息
- 可选的响应首部字段及实体主体
HTTP是一种简单可扩展的协议,其Client-Server的结构以及轻松扩展头部信息的能力使得HTTP可以和Web共同发展。