HTTP实用指南|青训营笔记
这是我参与「第四届青训营」笔记创作活动的的第7天
初识HTTP
什么是HTTP
- 超文本传输协议
- 应用层协议,基于TCP协议
- 请求与响应
- 简单可扩展
- 无状态
HTTP工作方式
- 客户端向服务端发送一段请求报文,服务端收到后,返回响应报文,客户端对响应内容渲染后进行展示
对于HTTP是一种无状态连接的理解
-
无状态与无连接
- 无连接
每次连接只处理一个请求,服务端处理完客户端一次请求,等到客户端作出回应之后便断开连接;无连接的维度是连接
- 无状态
是指服务端对于客户端每次发送的请求都认为它是一个新的请求,上一次会话和下一次会话没有联系;无状态的维度是请求
- 持久连接
持久连接,本质上是客户端与服务器通信的时候,建立一个持久化的TCP连接,这个连接不会随着请求结束而关闭,通常会保持连接一段时间。
-
http是基于tcp的,而从http1.1开始默认使用持久连接;在这个连接过程中,客户端可以向服务端发送多次请求,但是各个请求之间的并没有什么联系;
协议分析
报文是什么
- 报文是在 HTTP 应用程序之间发送的数据块。这些数据块以一些文本的元信息 (meta 标签中的信息) 开头,描述了报文的内容及含义。
- 由 3 部分组成:对报文进行描述的「起始行」、包含属性的「首部(Header) 」以及可选的、包含数据的「主体(body) 」
报文格式
- 请求报文格式
<method> <path> <HTTP version>//起始行
<headers>//首部
<entity-body>//主体
复制代码
- 响应报文格式
<HTTP version> <status code> <reason-phrase>
<headers>
<entity-body>
复制代码
- 各部分介绍:
- 方法 (method) 客户端希望服务器对资源执行的动作,常见的方法有 Get、Post、HEAD 等。
- 请求路径 (path) 请求的 URL 描述了要对哪个资源执行这个方法,是给服务器看的。
- HTTP 版本(HTTP version)
- 状态码(status code) 不同状态码对应不同的响应状态
- 原因短句(reason-phrase) 对状态码进行简单的描述。
- 首部(headers) 包含许多键值对,是对响应数据的一些格式信息。
Method(请求方法)
Get
- 最常见的请求方式
- 指定请求路径,向服务器请求资源
- 只获取资源,不对服务器数据进行修改
- 不发送 body
Post
- 用户增加或者修改资源
- 包含 body,发送给服务器的内容写在 body 里面
Put
- 用于修改资源
- 包含 body,发送给服务器的内容写在 body 里面
DELETE
- 用于删除资源
- 不发送 body
HEAD
- HEAD 与GET的使用方式完全相同。
- 区别在于HEAD 请求的返回响应中没有Body
- 用途:比如下载需求,返回的 Headers 中有下载内容的大小,可以用于显示进度。
分类
- safe:安全的,不会修改服务器的数据的方法 如:GET,HEAD,OPTIONS
- 幂等的: 同样的请求被执行一次或多次,效果是一样的,服务器的状态也是一样的,所有的safe方法都是幂等的
状态码
-
状态码是对结果进行类型化的描述的,比如「请求成功」、「内容未找到」等。 主要分为 5 类。
-
1xx:指示信息,表示请求已接收,正在处理
-
2xx:成功,表示指示已被成功接收
- 200 OK:客户端请求成功
-
3xx:重定向,要完成请求必须进行进一步操作
- 302:重新跳转
-
4xx:客户端错误
- 404:请求资源不存在
-
5xx:服务器错误
头部
- 首部包含多个请求头,是用来描述消息的元数据(meta data)。
- 通用首部 => 提供了与报文相关的最基本的信息
- 请求首部 => 只在请求报文中有意义的首部
- 响应首部 => 只在响应报文中有意义的首部
- body 首部 => 描述 body 的首部
cookie
详细cookie知识参考本文章: 聊一聊session和cookie
发展
HTTP/2概述(更快,更稳定,更安全)
-
帧(Frame):HTTP/2的最小通信单位,每个帧都包含帧头,至少也会标识出当前帧所在的数据流
-
消息:与逻辑请求或响应消息对应的完整的一系列帧
-
数据流:已建立的连接内的双向字节流
-
HTTP/2的特点
- 连接都是永久的,且仅需要每个来源一个链接
- 流控制:阻止发送方向接收方发送大量数据的机制
- 服务器主动推送
-
HTTPS:
- 在HTTP的基础上,经过TSL/SSL加密