1 定义
超文本传输协议,一种用于传输超文本(如网页)的协议,它是互联网上用于传输数据的基本协议之一
- 无连接性: HTTP 是一种无状态协议,每个请求与响应之间没有持续的连接。每个请求都是独立的,服务器不会保留关于之前请求的信息,这使得 HTTP 协议非常简单。
- 文本协议: HTTP 使用文本格式的请求和响应,通常使用 ASCII 编码。这使得它对人类和开发人员来说更容易理解和调试。
- 支持多媒体内容: HTTP 不仅支持传输超文本,还支持传输各种多媒体内容,包括图像、音频和视频。
- 请求-响应模型: 客户端发送请求,服务器返回响应。请求通常包括请求方法(GET、POST、PUT 等)、请求头、请求体和 URL。响应包括响应状态码、响应头和响应体。
- 无状态性: 每个 HTTP 请求都是独立的,服务器不会保留有关客户端的状态信息。如果需要保持状态,通常使用会话(Session)或 Cookie 等机制。
2 方法
- GET:向服务器获取数据,不改变服务器状态
- POST:向服务器提交数据,一般用于创建新资源或者提交表单,可能会改变服务器的状态
- PUT:将指定的数据存储到服务器上,一般用于更新资源或者上传文件
- DELETE:删除服务器上的指定资源
- HEAD:获取报文首部,与GET相比,不返回报文主体部分
- OPTIONS:询问支持的请求方法,用来跨域请求
- CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信
- TRACE:回显服务器收到的请求,主要用于测试或诊断
3 状态码
类别 | 原因 | 描述 |
---|---|---|
1XX | 信息性状态码 | 接受的请求正在处理 |
2XX | 成功状态码 | 请求正常处理完毕 |
3XX | 重定向状态码 | 浏览器需要执行某些特殊处理以正常处理请求 |
4XX | 客户端错误状态码 | 客户端发生错误 |
5XX | 服务器错误状态码 | 服务器本身出错 |
4 报文结构
4.1 请求报文:
请求行:请求方法字段、URL字段、HTTP协议版本字段,使用空格分隔
请求头:由关键字/值组成,每行一对,使用":"分隔
空行
请求体:post put等请求携带的数据
4.2 响应报文:
响应行:由网络协议版本,状态码和状态码的原因短语组成,如HTTP/1.1 200 OK
响应头:响应部首组成
空行
响应体:服务器响应的数据
5 缓存
5.1 强缓存
使用强缓存策略,如果缓存的资源有效,则直接使用缓存资源,不必再向服务器发起请求。
通过响应头信息中的Expires属性和Cache-Control属性设置
- Expires(http1.0):服务器通过该属性来指定资源的过期时间。在过期时间内,该资源可以被缓存使用,不必再向服务器发送请求。
- Cache-Control(http1.1):提供了对资源更精确的控制,拥有多个值。
- public(公共缓存): 表明响应可以被任何缓存(包括私有和共享缓存)保存。
- private(私有缓存): 表示响应是专门为单个用户生成的,不应该被共享缓存存储。
- no-store(禁止缓存): 指示缓存不应存储有关客户端请求或服务器响应的任何内容。
- no-cache(强制确认缓存): 要求缓存在提供响应之前,强制与服务器确认缓存的有效性。
- max-age(最大缓存时间): 指定缓存的最大有效时间,以秒为单位。
- s-maxage(共享缓存最大有效时间): 与max-age类似,但仅适用于共享缓存,如代理服务器。
- must-revalidate(必须重新验证): 表明在资源过期之后,缓存必须向原始服务器发起验证以确保仍然有效。
- proxy-revalidate(代理重新验证): 与must-revalidate类似,但仅适用于共享缓存(代理服务器)。
5.2 协商缓存
如果命中强制缓存,就不用再发起请求,直接使用缓存内容,如果没有命中强制缓存,如果设置了协商缓存,这个协商缓存就会发生作用。
命中协商缓存的两个条件:
- max-age=XXX 过期
- 值为no-cache
使用协商缓存策略时,会先向服务器发送一个请求,如果资源没有发生修改,则返回一个304状态,让浏览器使用本地的缓存副本。如果资源发生了修改,则返回修改后的资源。
通过响应头信息中的Etag属性和Last-Modified属性设置。 - Last-Modified属性指出资源最后一次修改的时间,当浏览器下一次发起请求时,会在请求头添加一个If-Modified-Since的属性,属性值为上一次资源返回时的Last-Modified的值。精确到秒级,如果1s内多次修改会导致缓存命中不准确。
- Etag属性是自愿的唯一标识符,当资源发生改变,这个值也会变化。下一次资源请求时,浏览器会在请求头添加一个If-None-Match属性,这个属性的值是上次返回的资源的Etag的值。服务器收到请求后会根据这个值和当前的Etag进行比较,以此判断资源是否发生改变,是否需要返回资源。
Etag的优先级高于Last-Modified。