Skip to main content

2.http扩展知识

如何使HTTP变得有状态

HTTP是无状态协议,即每次请求都是独立的,服务器不会保存客户端的状态信息。为了实现有状态的通信,常用的方式包括:

  • 使用Cookie: 通过在客户端存储标识符,服务器可以识别用户。这样,通过在请求头中携带Cookie,可以实现跨请求的状态保持。
  • 使用Session: 在服务器端维护会话信息,通过客户端携带的标识符关联不同请求。Session通常基于Cookie实现。

HTTP协议实现分片下载

分片下载(Range Requests)允许客户端请求资源的一部分。客户端可以通过在请求头中添加 Range字段来指定需要的范围,服务器返回相应的部分数据。

示例:

GET /path/to/file HTTP/1.1
Range: bytes=0-499

HTTP协议实现防盗链

防盗链是通过检查请求中的 Referer字段实现的。Referer字段包含了请求的来源页面的URL。服务器可以检查这个字段,如果来源不在允许的范围内,则拒绝提供资源。

示例:

GET /path/to/protected/resource HTTP/1.1
Referer: http://alloweddomain.com

304返回码的判断

304 Not Modified状态码表示请求的资源在上次请求之后没有被修改过。客户端可以通过在请求头中添加 If-Modified-Since字段,携带上次获取资源的时间戳。服务器比较资源的修改时间与这个时间戳,如果未发生修改,则返回304。

示例:

GET /path/to/resource HTTP/1.1
If-Modified-Since: Sat, 29 Jan 2022 12:00:00 GMT

服务器会比较资源的修改时间与 If-Modified-Since字段,如果未修改,则返回304。这样,客户端就知道可以使用本地缓存,减少带宽的消耗。

http返回码各代表什么?

  • 1xx(信息性状态码):
    • 100 Continue: 服务器已收到请求的初始部分,客户端应继续请求。
    • 101 Switching Protocols: 服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端切换协议。
  • 2xx(成功状态码):
    • 200 OK: 请求成功。
    • 201 Created: 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立。
    • 204 No Content: 服务器成功处理了请求,但没有返回任何内容。
  • 3xx(重定向状态码):
    • 301 Moved Permanently: 被请求的资源已永久移动到新位置。
    • 302 Found: 被请求的资源在临时位置。
    • 304 Not Modified: 资源未被修改,可以使用缓存的版本。
  • 4xx(客户端错误状态码):
    • 400 Bad Request: 服务器未能理解请求。
    • 401 Unauthorized: 请求要求身份验证。
    • 403 Forbidden: 服务器理解请求,但拒绝执行。
    • 404 Not Found: 请求的资源不存在。
  • 5xx(服务器错误状态码):
    • 500 Internal Server Error: 服务器遇到不可预知的情况,导致无法完成请求。
    • 502 Bad Gateway: 作为网关或代理的服务器收到上游服务器无效的响应。
    • 503 Service Unavailable: 服务器当前无法处理请求。

301,302,307,308状态码区别

301 Moved Permanently (永久重定向) :

  • 这意味着请求的资源已被永久移动到新的URL。
  • 浏览器会自动将请求重定向到新的URL,并且将来的请求也会直接发送到新的URL上。
  • 通常用于当网站改变了URL结构,但资源仍然可用。

302 Found (临时重定向) :

  • 表示请求的资源已被临时移动到另一个URL。
  • 浏览器会自动将请求重定向到新的URL,但以后的请求不一定会发送到同一个URL。
  • 常用于临时性重定向,比如网站维护或暂时性更改。

307 Temporary Redirect (临时重定向) :

  • 与302状态码类似,也表示请求的资源临时移动到了新的URL。
  • 不同之处在于,307状态码要求浏览器保留原始的请求方法(如GET或POST)进行重定向,而不会改变。
  • 这使得用户代理可以保持原始请求的方法和请求体,而不会因为重定向而改变。

308 Permanent Redirect (永久重定向) :

  • 与301状态码类似,表示请求的资源永久性地移动到了新的URL。
  • 与307状态码类似,要求浏览器保留原始请求的方法进行重定向。
  • 这个状态码是HTTP/1.1的新加入,与301的主要区别在于要求保持请求方法不变。

总结:

  • 301和308状态码表示永久重定向。
  • 302和307状态码表示临时重定向。
  • 307和308状态码要求保留原始请求的方法,而302状态码则不做要求。

HTTP 1.0、HTTP 1.1 和 HTTP/2.0 区别

HTTP 1.0 和 HTTP 1.1 的区别:

  1. 持久连接:
    • HTTP 1.0默认是非持久连接的,每次请求/响应都需要建立一个新的连接。
    • HTTP 1.1默认是持久连接的,一个连接可以被多个请求/响应共享,减少了连接建立的开销。
  2. 管道化(Pipeline):
    • HTTP 1.0 不支持管道化,即一个连接上同一时刻只能处理一个请求。
    • HTTP 1.1 支持管道化,允许在一个连接上并行发送多个请求,提高了性能。
  3. Host 头:
    • HTTP 1.0 不支持 Host 头,因此无法在同一台服务器上托管多个域名。
    • HTTP 1.1 引入 Host 头,可以根据 Host 头字段的值在同一台服务器上托管多个域名。

HTTP/2.0 的主要变化或优势:

  1. 多路复用(Multiplexing):
    • HTTP/2 支持多路复用,允许在一个连接上同时传输多个请求和响应,解决了HTTP 1.x中的队头阻塞问题,提高了并发性能。
  2. 头部压缩:
    • HTTP/2 使用 HPACK 算法对请求和响应头进行压缩,减少了数据传输的大小,降低了延迟。
  3. 二进制分帧:
    • HTTP/2 使用二进制格式对数据进行分帧传输,取代了 HTTP 1.x 的文本格式,提高了传输效率。
  4. 优先级和依赖:
    • HTTP/2 允许客户端指定请求的优先级,服务器可以根据优先级进行处理。还引入了依赖机制,允许客户端表达请求之间的依赖关系。
  5. 流量控制:
    • HTTP/2 支持流量控制,允许客户端和服务器通过窗口控制来管理流量,防止过载。

https://www.zhihu.com/question/642272225