HTTP(Hypertext Transfer Protocol超文本传输协议)是一个用于传输超媒体文档(例如 HTML)的应用层协议。它主要是为Web 浏览器与 Web 服务器之间的通信。
HTTP 遵循经典的客户端-服务端(C/S)模型,客户端(Requests,如浏览器)打开一个连接以发出请求,然后等待直到收到服务器端(Responses)响应。
参考文档
客户端:user-agent
user-agent 就是任何能够为用户发起行为的工具。这个角色通常都是由浏览器、移动应用等来扮演。浏览器来负责发送HTTP请求,并进一步解析HTTP返回的消息,以向用户提供明确的响应。
服务器端:Server
Server提供客户端所请求的文档、数据等。Server只是虚拟意义上代表一个机器:它可以是共享负载(负载均衡)的一组服务器组成的计算机集群,也可以是一种复杂的软件,通过向其他计算机(如缓存,数据库服务器,电子商务服务器 ...)发起请求来获取部分或全部资源。
代理:Proxies
在浏览器和服务器之间,有许多计算机和其他设备转发了HTTP消息。它们大多数在传输层、网路层、数据链路层和物理层上,对HTTP应用层是透明的【会影响应用层】。还有一部分是表现在应用层上的,被称为代理(Proxies)。代理(Proxies)既可以表现得透明,又可以不透明(“改变请求”会通过它们)。代理主要有如下几种作用:
- 缓存(可以是公开的也可以是私有的,像浏览器的缓存)
- 过滤(像反病毒扫描,家长控制...)
- 负载均衡(让多个服务器服务不同的请求)
- 认证(对不同资源进行权限管理)
- 日志记录(允许存储历史信息)
HTTP的特点:
-
HTTP是无连接的:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
如果我们需要保持长连接,可以使用websocket进行实现。
在客户端(通常指浏览器)与服务器能够交互(客户端发起请求,服务器返回响应)之前,必须在这两者间建立一个 TCP 连接,打开一个 TCP 连接需要多次往返交换消息(因此耗时)。HTTP/1.0 默认为每一对 HTTP 请求/响应都打开一个单独的 TCP 连接。HTTP/1.1 中TCP连接可以通过Connection头部来进行控制,即多个HTTP请求复用同一个TCP连接。 HTTP/2则发展得更远,通过在一个连接复用消息的方式来让这个连接始终保持为暖连接。
HTTP依赖面向连接的TCP进行消息传递。
HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
-
HTTP是无状态的:在同一个连接中,两个执行成功的请求之间是没有关系的。HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。
【无状态的好处】
1.每次连接传输的数据量小
2.不需要前面之前的状态获取消息时,响应速度快
3.如果需要状态保持,我们可以使用HTTP的头部扩展——HTTP Cookies解决无状态这个特征。把Cookies添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。
HTTP流
当http流水线启动时,后续请求都可以不用等待第一个请求的成功响应就能被发送。
第一步:打开或重用一个TCP连接【TCP连接被用来发送一条或多条请求,以及接受响应消息】
第二步:发送一个HTTP报文
第三步:读取服务端返回的报文信息
第四步:关闭TCP连接或为后续请求重用连接。
HTTP报文
HTTP/1.1以及更早的HTTP协议报文都是语义可读的。在HTTP/2中,对这些报文进行压缩,嵌入到了一个新的二进制结构,帧。
有两种HTTP报文类型:请求与响应,每种都有其特定的格式。
请求报文的格式
一、请求行:
内容 | 解释 |
---|---|
请求方法 | 如GET、POST、PUT、DELETE、HEAD、OPTIONS |
请求路径 | 获取资源的路径。该Path中没有protocol(http://)、domain(127.0.0.1)、port(80) |
HTTP协议版本号 | HTTP的协议版本号常用的HTTP/1.0、HTTP/1.1、HTTP/2 |
二、请求头:
内容 | 解释 |
---|---|
HTTP headers | 为服务端表达其他信息的header信息,如Host、content-type等信息 |
三、空行:
四、请求数据:
内容 | 解释 |
---|---|
数据的格式 | 常见的数据格式有文本、json等 |
响应报文的格式
状态行:
内容 | 解释 |
---|---|
HTTP协议版本 | HTTP的协议版本号常用的HTTP/1.0、HTTP/1.1、HTTP/2 |
状态码 | 来告知对应请求执行成功或失败,以及失败的原因。常见的状态码有:200、304、404、500 |
状态信息 | 是对状态码的描述信息,可以由服务端自行设定。 |
消息报头:
内容 | 解释 |
---|---|
HTTP headers | 与请求类类似 |
空行:
响应数据:
内容 | 解释 |
---|---|
数据的格式 | 常见的数据格式有文本、json、图片等 |
基于HTTP的APIs
客户端向服务端发起请求,服务端被动发送数据。
XMLHttpRequest
作用:XMLHttpRequest(XHR)对象可用于在user_agent和服务器之间交互数据。
介绍:通过XMLHttpRequest可以在不刷新页面的情况下请求特定的URL,获取数据。这允许页面在不影响用户操作的情况下,更新页面的局部内容。
Fetch API
作用:Fetch API提供了一个获取资源的接口(包括跨域请求)