HTTP学习总结

0. Intro

  • 不断更新有关HTTP的学习

1. HTTP 基本概念

  • HTTP:HyperText Transfer Protocol / 超文本传输协议
  • 双向协议,因为可以传输,允许中间中转和传输
  • 状态码
    • 1xx:提示信息,协议处理中间状态,还需要后续处理
    • 2xx:成功,报文已经被正确处理
      • 206: Partial Content: 分块下载和断点续传,表示响应返回的body不是全部资源
    • 3xx:重定向,需要客户端重新请求
      • 301: Moved Permanently,永久重定向,资源不存在
      • 302: Found,临时重定向
      • 304: Not Modified,缓存重定向
    • 4xx:客户端错误,报文有误,服务器无法处理
      • 403: Forbidden: 服务器禁止访问资源
      • 404: Not Found
    • 5xx: 客户端请求报文正确,服务端处理错误
      • 501: Not Implemented,客户端请求的功能不支持
      • 502: Bad Gateway,常常是网关或代理出错
  • 常见字段
    • Host: 服务器域名
    • Content-Length: 本次回应数据长度
    • Connection: 常要求客户端要求TCP持久连接
    • Content-Type: 服务端响应的时候告诉客户端,数据格式

      Content-Type: text/html; charset=utf-8

    • Accept: 客户端声明自己接受的数据格式

      Accept: / 表示接受任何格式

    • Content-Encoding: 说明数据压缩方式,服务端返回的数据使用什么压缩格式
    • Accept-Encoding: 客户端能接受的压缩方式

2. GET & POST

  • 安全和幂等
    • 安全是指,请求方法不会破坏服务器上的安全
    • 幂等是指,多次执行相同的操作,结果都是相同的
    • Get是安全且幂等的
    • Post是不安全且不幂等的,会修改服务器上的资源,多次提交会创建多个资源

3. HTTP/1.1特性

  • 优点: 简单,灵活,易扩展,应用广泛,跨平台
    • 简单: header + body / header 中也是key-value的形式
    • 灵活&易扩展: 可自定义和扩充协议里犯法,URl/URI,状态码,头字段
    • 应用广泛&跨平台
  • 缺点: 无状态,明文传输,不安全

    • 无状态: 解决方案较简单的是cookie,写入cookie来控制客户端的状态
    • 明文传输: 信息裸奔
    • 不安全: 明文,内容可能被窃听 / 不验证通信方身份,可能被伪装 / 无法验证报文完整性,可能被篡改
  • HTTP协议基于TCP/IP,使用请求-应答通信模式

    • 长连接: HTTP/1.1提出长连接的通信方式,减少TCP重复创建的开销
    • 长连接使的pipeline成为可能,减少整体的响应时间,但是服务器还是按照顺序执行,可能会造成队头阻塞
    • 队头阻塞

4. HTTP & HTTPS

  • 区别
    • HTTPS在TCP&HTTP网络层之间加入了SSL/TLS安全协议,报文能够加密传输
    • HTTPS在三次握手之后,还需要进行SSL/TLS握手的过程
    • HTTP端口是80,HTTPS端口是443
    • HTTPS需要申请数字证书,保证服务器的身份可信

  • 如何解决问题?

    • 混合加密: 实现信息的机密性
    • 摘要算法: 实现完整性
    • 数字证书: 解决了冒充的风险
  • 混合加密

    • 采用对称加密和非对称加密结合的混合加密
    • 建立前通过非对称加密生成会话密钥
    • 在通信过程中全部使用对称加密,加密明文数据

    • 对称加密,使用一个密钥,运算速度快

    • 非对称加密,使用公钥和私钥
  • 摘要算法

  • 数字证书
  • SSL/TLS协议基本流程

    • 客户端向服务端索要公钥
    • 双方协商生产会话密钥
    • 采用会话密钥进行加密通信
  • 握手阶段涉及4次通信

    • clientHello
      • 客户端向服务端发起加密通信请求
    • ServerHello
      • 服务器回应client
      • 返回服务器的数字证书
    • 客户端回应
      • 确认服务器证书的真实性
      • 从数字证书取出服务器中的公钥
    • 服务器回应



5. Http/1.1 HTTP/2 HTTP/3演变

  • HTTP/1.1 & HTTP/1 提高了什么?
    • TCP长连接
    • 支持pipeline
    • 性能瓶颈
      • header未压缩,头部信息越多延迟越大
      • 冗长的首部
      • 队头阻塞
      • 无请求优先级控制
      • 请求只能从客户端发起,服务器被动响应
  • HTTP/2 提高了什么?

    • 协议基于HTTPS,安全性是得到保障的
    • 相对于HTTP/1.1的改进
      • 头部压缩: HPACK算法,客户端和服务器同事维护一张表,所有字段都会存入这个表,生成索引号,以后就不发送同样的字段,只发送索引号,hash表
      • 二进制格式: 报文从纯文本格式修改为二进制格式,头信息和数据体都是二进制的,统称为帧,头信息帧和数据帧
      • 数据流: 数据包不是按照顺序发送,每个数据流都有独一无二的编号,客户端数据流是奇数,服务器发出的数据流是偶数,客户端可以指定数据流的优先级
      • 多路复用: 移除串行请求
      • 服务器推送: 服务器也可以主动向客户端发送消息,Cache Push
  • HTTP/2有什么缺陷? HTTP/23 提高了什么?

    • 缺陷:

      • TCP协议不知道有多少HTTP请求
      • 一旦丢包,会触发TCP的重传机制,所有的HTTP请求都必须等待丢了包的回传,形成阻塞
    • HTTP/3改善

      • 由于丢包问题,是出于TCP传输层的问题,所以HTTP/3把HTTP下层的TCP协议改成了UDP
      • UDP不可靠传输,基于UDP的QUIC协议可以实现类似TCP的可靠性传输
      • QUIC当某个流发生丢包时,只会阻塞这个流,其它流不会受到影响
      • TLS升级为1.3
      • 头部压缩算法为QPack
      • HTTPS要建立一个连接需要六次交互,TCP建立连接3次握手,然后是TLS/1.3的三次握手,QUIC直接把以往的TCP和TLS/1.3的6次交互合并成了3次,减少了交互次数
      • QUIC 是一个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复用的协议

7.零碎知识点

7.1 URL&URI

URI = Universal Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串

URL = Universal Resource Locator 统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocol、host、port、path、parameter、anchor

URN = Universal Resource Name 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。

URI,URL&URN的超集

  • 一个资源可以有多个URI

  • 组成

    schema, user information, host, port, path, query, fragment


8. 参考