初识 HTTP 协议| 青训营笔记
这是我参加「第五届青训营」伴学笔记活动的第5天
HTTP
什么是 HTTP
HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol)
什么是超文本
在互联网早期的时候,输入的信息只能保存在本地,无法和其他电脑进行交互。保存的信息通常都以文本即简单字符的形式存在,文本是一种能够被计算机解析的有意义的二进制数据包。而随着互联网的高速发展,两台电脑之间能够进行数据的传输后,人们不满足只能在两台电脑之间传输文字,还想要传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转,那么文本的语义就被扩大了,这种语义扩大后的文本就被称为超文本(Hypertext)。
什么是传输
两台计算机之间会形成互联关系进行通信,存储的超文本会被解析成为二进制数据包,由传输载体(例如同轴电缆,电话线,光缆)负责把二进制数据包由计算机终端传输到另一个终端的过程称为传输(transfer)。
通常把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方。请求方和应答方可以进行互换,请求方也可以作为应答方接受数据,应答方也可以作为请求方请求数据。
什么是协议
网络协议就是网络中(包括互联网)传递、管理信息的一些规范。如同人与人之间相互交流是需要遵循一定的规矩一样,计算机之间的相互通信需要共同遵守一定的规则,这些规则就称为网络协议。
没有网络协议的互联网是混乱的,就和人类社会一样,人不能想怎么样就怎么样,你的行为约束是受到法律的约束的;那么互联网中的端系统也不能自己想发什么发什么,也是需要受到通信协议约束的。
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
HTTP 的特点
- 应用层协议,基于 TCP 协议
- 简单可扩展
- 无状态协议
协议分析
HTTP/0.9
- 单行协议
- 相应只有 HTML 文档
原型版本,功能简陋,只有一个命令GET,服务器只能回应HTML格式字符串,不能回应别的格式
HTTP/1.0
- 构建可扩展性
- 增加了 Header
- 有了状态码
- 支持多种文档类型
支持 cache,MIME,method,每个 TCP 连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接,引入了 POST 命令和 HEAD 命令头信息是 ASCII 码,后面数据可为任何格式。服务器回应时会告诉客户端,数据是什么格式,即 Content-Type 字段的作用。这些数据类型总称为 MIME 多用途互联网邮件扩展,每个值包括一级类型和二级类型,预定义的类型,也可自定义类型,常见 Content-Type 值:text/xml image/jpeg audio/mp3
HTTP/1.1
- 标准化协议
- 链接复用
- 缓存
- 内容协商
引入了持久连接(persistent connection),即 TCP 连接默认不关闭,可以被多个请求复用,不用声明 Connection: keep-alive。对于同一个域名,大多数浏览器允许同时建立 6 个持久连接,引入了管道机制,即在同一个 TCP 连接里,客户端可以同时发送多个请求,进一步改进了 HTTP 协议的效率,
新增方法:PUT、PATCH、OPTIONS、DELETE
HTTP/1.0和HTTP/1.1的区别
缓存处理:在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略,例如 Etag 等更多可供选择的缓存头来控制缓存策略带宽优化及网络连接的使用:HTTP1.0 中,存在一些浪费带宽的现象,例如:客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),方便了开发者自由的选择以便于充分利用带宽和连接错误通知的管理:在 HTTP1.1 中新增 24 个状态响应码,如 409(Conflict)表示请求的资源与资源当前状态冲突;410(Gone)表示服务器上的某个资源被永久性的删除Host 头处理:在 HTTP1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个 IP 地址。HTTP1.1 的请求消息和响应消息都应支持 Host 头域,且请求消息中如果没有 Host 头域会报告一个错误(400 Bad Request)长连接:HTTP 1.1 支持持久连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟,在 HTTP1.1 中默认开启 Connection: keep-alive,弥补了HTTP1.0 每次请求都要创建连接的缺点
HTTP/2.0
二进制协议:头信息和数据体都是二进制,称为头信息帧和数据帧压缩 header:引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度服务器推送:HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)- 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了"队头堵塞",此双向的实时通信称为多工(Multiplexing)
HTTP 报文
常用请求头
| 字段 | 描述 |
|---|---|
| Accept | 接受类型,表示浏览器支持的MIME类型 |
| Content-Type | 客户端发送出实体内容的类型 |
| Cache-Control | 指定请求和响应遵守的缓存机制 |
| If-Modified-Since | 对应服务端的Last-Modified,用来匹配文件是否变动,只能精确到1s之内 |
| Expires | 缓存控制,在这个时间内不会请求,直接使用缓存,服务端时间 |
| If-None-Match | 对应服务端到ETag,用来匹配文件内容是否改变 |
| Cookie | 同域访问时会自动带上 |
| Referer | 该页面的来源URL |
| Origin | 最初的请求是从哪里发起的,Origin比Referer更尊重隐私 |
| User-Agent | 用户客户端一些必要信息,如UA头部等 |
常用响应头
| 字段 | 描述 |
|---|---|
| Content-Type | 服务端发送出实体内容的类型 |
| Cache-Control | 指定请求和响应遵守的缓存机制 |
| Last-Modified | 请求资源的最后修改时间 |
| Expires | 应该在什么时候认为文档已经过期,从而不再缓存它 |
| Max-age | 客户端的本地资源应该缓存多少秒,开启了Cache-Control有效 |
| ETag | 资源的特定版本的标识符,类似指纹 |
| Set-Cookie | 设置和页面关联的Cookie,服务端通过这个头部把Cookie传给客户端 |
| Server | 服务器的一些相关信息 |
| Access-Control-Allow-Origin | 服务端允许的请求Origin头部,如* |
状态码
| HTTP 状态码 | 说明 |
|---|---|
| 100 | 继续。 |
| 101 | 切换协议。 |
| 200 | 确定。客户端请求已成功。 |
| 201 | 已创建。 |
| 204 | 无内容。 |
| 301 | 已永久移动。此请求和之后所有的请求都应该转到指定的 URI。 |
| 302 | 对象已移动。对于基于表单的身份验证,此消息通常表示为“对象已移动”。请求的资源临时驻留在不同的 URI。由于重定向有时可能会改变,客户端将来在请求时应该继续使用 RequestURI。只有在 CacheControl 或 Expires 标题字段中指示,此响应才能够缓存。 |
| 304 | 未修改。客户端请求的文档已在其缓存中,文档自缓存以来尚未被修改过。客户端使用文档的缓存副本,而不从服务器下载文档。 |
| 400 | 错误的请求。 |
| 401 | 访问被拒绝。IIS 定义了几个不同的401错误,用于指示更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示。 |
| 403 | 服务器拒绝请求。可以理解为没有权限访问此网站,服务器能够收到请求但拒绝提供服务。 |
| 404 | 服务器找不到请求的网页。例如,访问网站中不存在的页面,或者原有页面被移走或删除,则可能会出现该状态码。 |
| 500 | 内部服务器错误。很多服务器端错误都可能导致此错误消息。事件查看器日志包含更详细的错误原因。此外,您可以禁用友好 HTTP 错误消息以便收到详细的错误说明。 |
| 502 | Web 服务器作为网关或代理服务器时,从上游服务器收到了无效响应。此类错误一般与服务器本身有关(与请求无关)。 |
| 503 | 目前服务器无法使用,一般是因为服务器超载或停止维护。 |
| 504 | 网关超时。 |
缓存
强制缓存
强缓存是指在指定时间内(缓存未失效的情况下),客户端将不再发送请求给服务端,而是通过缓存的方式从事先存储的内存或磁盘中获取信息;
-
Expires,时间戳
-
Cache-Control
-
可缓存性
- no-cache:协商缓存验证
- no-store:不使用任何缓存
-
到期
- max-age:单位秒,存储的最大周期,相对于请求的时间
-
重新验证*重新加载
- must-revalidate:一旦资源过期,在成功原始服务器验证之前,不能使用
-
协商缓存
协商缓存是指在使用本地缓存之前,需要向服务端发起一次GET请求,与之协商当前浏览器保存的数据信息是否过期,通常采用请求资源修改的最后一次时间戳来进行判断,如果未过期服务端返回304,客户端直接中缓存中读取数据,如果已过期,服务端返回最新的数据信息;
- Etag/If-None-Match:资源特定版本的标识,类似于指纹
- Last-Modified/If-Modified-Since:最后修改时间
cookie
| 键值对 | 描述 |
|---|---|
| Name=value | 各种cookie的名称和值 |
| Expire=Date | Cookie的有效期,缺省时Cookie仅在浏览器关闭之前有效 |
| Path=Path | 限制指定Cookie的发送范围的文件目录,默认为当前 |
| Domain=domain | 限制Cookie生效的域名,默认为创建Cookie的服务域名 |
| secure | 仅在HTTPS安全链接时,才可以发送Cookie |
| HttpOnly | JS脚本无法获取Cookie |
| SameSite=[None|Strict|Lax] | None同站、跨站请求都可发送;Strict仅在同站发送;Lax允许与顶级导航一起发送,并将与第三方网站发起的GET请求一起发送 |