参考MDN/HTTP
HTTP是Hyper Text Transfer Protocol(超文本传输协议),是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型,本质是一个无状态的协议,但是使用cookies可以创建有状态的会话。
HTTP是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议)。它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说,请求通常是由像浏览器这样的接受方发起的。
HTTP分为三部分:请求行、首部、实体(内容)
请求行包括了 请求方法 + URL + 协议版本
首部包括 请求首部和响应首部
1、HTTP1.0、HTTP1.1、HTTP2.0
- HTTP1.0: 由于 HTTP/0.9 协议的应用十分有限,浏览器和服务器迅速扩展内容使其用途更广:
- 协议版本信息现在会随着每个请求发送(HTTP/1.0被追加到了GET行)。
- 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更 新或使用本地缓存)。
- 引入了HTTP头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。
- 在新HTTP头的帮助下,具备了传输除纯文本HTML文件以外其他类型文档的能力(感谢Content-Type头)。
- HTTP1.1: HTTP/1.1 消除了大量歧义内容并引入了多项改进:
- 连接可以复用,节省了多次打开TCP连接加载网页文档资源的时间。
- 增加管线化技术,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。
- 支持响应分块。
- 引入额外的缓存控制机制。
- 引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换。
- 感谢Host头,能够使不同域名配置在同一个IP地址的服务器上。
- HTTP2.0: HTTP/2在HTTP/1.1有几处基本的不同:
- HTTP/2是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。
- 这是一个复用协议。并行的请求能在同一个链接中处理,移除了HTTP/1.x中顺序和阻塞的约束。
- 压缩了headers。因为headers在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。
- 其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。
2、HTTP首部
1. 常用头部
-
cache-control: 控制缓存行为
– 可设置的参数:public:表示任何缓存都可以缓存响应;private:表示响应仅供单个用户使用,不得由共享高速缓存存储;no-cache:强制缓存在发布缓存副本之前将请求提交到源服务器以进行验证。等 -
connection:连接的性质,如keep-alive
– connection = keep-alive的意义:
HTTP是基于TCP的,每一个HTTP请求都要进行三次握手。如果一个页面对同一个域名有多个请求,就会频繁的建立和断开连接,所以HTTP1.0中出现了keep-alive,用于建立长连接。 -
user-Agent:用户的信息
-
date:报文建立的时间
2. 常用请求首部
-
Accept : 能正确接收的媒体类型
-
Accept-XX(Accept-Charset/Accept-Encoding/Accept-Language):能正确接收的xx
-
Expect :期待服务端的指定行文
-
If-Match :两端资源标记比较
-
If-Modified-Since : 比较时间 未修改返回304 Not Modified
-
If-None-Match :比较标记 未修改返回304 Not Modified
3. 常用响应首部
- Location: 定向到某个location
- Server: 服务器的名称
- Age: 响应存在的时间
- Accept-Ranges: 可接受的范围类型
4.常见实体首部
- Content-Type: 内容媒体类型
- Expires: 内容过期时间
- Last_modified: 内容最后修改时间
- Allow: 资源正确的请求方式
3、HTTP请求方法(Request Methods)
方法名 | 用途 |
---|---|
GET | GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据. |
POST | POST方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用. |
PUT | PUT方法用请求有效载荷替换目标资源的所有当前表示。 |
HEAD | HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体. |
DELETE | DELETE方法删除指定的资源。 |
OPTIONS | OPTIONS方法用于描述目标资源的通信选项。 |
TRACE | TRACE方法沿着到目标资源的路径执行一个消息环回测试。 |
CONNECT | CONNECT方法建立一个到由目标资源标识的服务器的隧道。 |
PATCH | PATCH方法用于对资源应用部分修改。 |
GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
4、状态码
1XX: 通知
100 Continue 客户端应重新发请求
101 Switching Protocols 改用协议 http换到https或者http1.1换到2.0之类
2XX:成功
200 OK 操作成功
201 Created按照客户端请求创建了一个新资源
202 Accepted 请求无法或不被实时处理
204 No Content 请求成功,但是报文不含实体的主体部分
No Content可能的情况:
1.服务器拒绝请求返回
2.Get资源存在但表示是空的
205 Reset Content 请求成功,但是报文不含实体主体部分,要求客户端重置内容
204和205的区别在于205要求了重置
206 Partial Content 进行范围请求
3XX:重定向
301 Moved Permanently永久性重定向,资源已经被分配到了新的URL
302 Found 临时重定向,资源临时分配了URL 实际上发部分客户端把它当成303处理
303 See Other 表示资源存在另一个URL。应用Get获取资源
307 Temporary Redirect 临时重定向,资源临时分配了URL,但是希望客户端能够保持方法不变请求新地址(解决302被当成303处理的问题)
304 Not Modified 允许访问资源,但实体主体为空(客户端已经有此数据,不需要再次发送)
4XX:客户端错误
400 Bad Request 请求报文语法错误
401 Unauthorized 发送的请求需要通过验证,客户端试图对一个受保护的资源操作但没有认证证书
403 Forbidden 请求资源存在但被拒绝,常用于一个资源只允许在特定时间段内访问(如果不想透露可以谎报404)
404 Not Found 找不到请求的资源
405 Method Not Allowed 不支持的请求方法,比如只支持Get,但是收到了Post请求
5XX:服务端错误
500 Internal Server Error 执行请求时发生错误(处理异常)
501 Not Implemented 不支持此请求方法(和405区别在于,405是访问的资源不支持,而501表示服务器不能操作此方法)
502 Bad Gateway 代理与上行服务器之间出现问题
503 Service Unavailable 服务器暂时处于超负荷或者维护中