• HTTP (Hyper Text Transfer Protocol),译为超文本传输协议

    • 是互联网中应用最广泛的应用层协议之一
    • 设计HHTP最初的目的是:提供一种发布和接受HTML页面的方法,由URI来标识具体的资源
    • 后面用HTTP来传递的数据格式不仅仅是HTML,应用非常广泛

      版本

  • 1991年,HTTP/0.9

    • 只支持GET请求方法获取文本数据(比如HTML文档),且不支持请求头、响应头等,无法向服务器传递太多信息
  • 1996年,HTTP/1.0
    • 支持POST、HEAD等请求方法,支持请求头、响应头等,支持更多种数据类型(不再局限于文本数据)
    • 浏览器的每次请求都需要与服务器建立一个TCP连接,请求处理完成后立即断开TCP连接
  • 1997年,HTTP/1.1(最经典、使用最广泛的版本)
    • 支持PUT、DELETE等请求方法
    • 采用持久连接(Connection:keep-alive),多个请求可以共用同一个TCP连接
  • 2015年,HTTP/2.0
  • 2018年,HTTP/3.0

    报文格式

    image.png
    image.png

    请求方法

  • GET: 常用于读取的操作,请求参数直接拼接在URL的后面(浏览器对URL是有长度限制的)

  • POST: 常用于添加、修改、删除的操作,请求参数可以放到请求体中(没有大小限制)
  • HEAD: 请求得到与GET请求相同的响应,但没有响应体
    • 使用场景举例:在下载一个大文件前,先获取其大小,再决定是否要下载,以此可以节约带宽资源
  • OPTIONS: 用于获取目的资源所支持的通信选项,比如服务器支持的请求方法
    • OPTIONS * HTTP/1.1
  • PUT: 用于对已存在的资源进行整体覆盖
  • PATCH: 用于对资源进行部分修改(资源不存在,会创建新的资源)
  • DELETE: 用于删除指定的资源
  • TRACE: 请求服务器回显其收到的请求信息,主要用于HTTP请求的测试或诊断
  • CONNECT:

    • 可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道(tunnel)
    • 可以用来访问采用了SSL(HTTPS)协议的站点

      头部字段 (Header Field)

  • 头部字段可以分为4种类型

    • 请求头字段(Request Header Fields)
      • 有关要获取的资源或客户端本身信息的消息头
    • 响应头字段(Response Header Fields)
      • 有关响应的补充信息,比如服务器本身(名称和版本等)的消息头
    • 实体头字段(Entity Header Fields)
      • 有关实体主体的更多信息,比如主体长度(Content-Length)或其MIME类型
    • 通用头字段(General Header Fields)
      • 同时适用于请求和响应消息,但与消息主体无关的消息头

        请求头字段

        image.png
        image.png
        image.png

        响应头字段

        image.png
        image.png
        image.png

        状态码(Status Code)

  • 状态码指指示HTTP请求是否已成功完成

  • 状态码可以分为5类

    • 信息响应:100 ~ 199
    • 成功响应:200 ~ 299
    • 重定向:300 ~ 399
    • 客户端错误:400 ~ 499
    • 服务器错误:500 ~ 599

      常见状态码

  • 100 Continue

    • 请求的初始部分已经被服务器收到,并且没有被服务器拒绝。客户端应该继续发送剩余的请求,如果请求已经完成,就忽略这个响应
    • 允许客户端发送带请求体的请求前,判断服务器是否愿意接收请求(服务器通过请求头判断)
    • 在某些情况下,如果服务器在不看请求体就拒绝请求时,客户端就发送请求体是不恰当的或低效的
  • 200 OK : 请求成功
  • 302 Found: 请求的资源被暂时的移动到了由Location头部指的URI上
  • 304 Not Modified:说明无需再次传输请求的内容,也就是说可以使用缓存的内容
  • 400 Bad Request:由于语法无效,服务器无法理解该请求
  • 401 Unauthorized:由于缺乏目标资源要求的身份验证凭证
  • 403 Forbidden:服务器端有能力处理该请求,但是拒绝授权访问
  • 404 Not Found:服务器端无法找到所请求的资源
  • 405 Method Not Allowed:服务器禁止了使用当前HTTP方法的请求
  • 406 Not Acceptable:服务器无法提供与Accept-Charse以及Accept-Language指定的值相匹配的响应
  • 408 Request Timeout:服务器想要将没有在使用的连接关闭
    • 一些服务器会在空闲连接上发送此信息,即便是在客户端没有发送任何请求的情况下
  • 500 Internal Server Error:所请求的服务器遇到意外的情况并阻止其执行请求
  • 501 Not Implemented:请求的方法不被服务器支持,因此无法被处理
    • 服务器必须支持的方法(即不会返回这个状态码的方法)只有GET和HEAD
  • 502 Bad Gateway: 作为网关或代理角色的服务器,从上游服务器(如tomcat)中接收到的响应是无效的
  • 503 Service Unavailable:服务器尚未处于可以接收请求的状态

    • 通常造成这种情况的原因是由于服务器停机维护或者已超载

      form提交 - 常用属性

  • action:请求的URI

  • method:请求方法(GET、POST)
  • enctype:POST请求时,请求体的编码方式

    • application/x-www-form-urlencoded(默认值)
      • 用&分隔参数,用=分隔键和值,字符用URL编码方式进行编码
    • multipart/form-data
      • 文件上传时必须使用这种编码方式

        代理服务器(Proxy )

  • 特点

    • 本身不产生内容
    • 处于中间位置转发上下游的请求和响应
      • 面向下游的客户端:它是服务器
      • 面向上游的服务器:它是客户端

image.png

正向代理、反向代理

  • 正向代理:代理的对象是客户端

image.png

  • 反向代理:代理的对象是服务器

image.png

正向代理 - 作用

  • 隐藏客户端身份
  • 绕过防火墙(突破访问限制)
  • Internet访问控制
  • 数据过滤
  • ….

image.png

image.png

抓包工具的原理

  • Fiddler、Charles等抓包工具的原理:在客户端启动了正向代理服务

image.png

  • 需要注意的是

    • Wireshark的原理是:通过底层驱动,拦截网卡上流过的数据

      代理服务器 - 相关的头部字段

  • Via:追加经过的每一台代理服务器的主机名

  • X-Forwarded-For:追加请求方的IP地址
  • X-Real-IP:客户端的真实IP地址

image.png
image.png

CDN

  • CDN
    • 利用最靠近每位用户的服务器
    • 更快更可靠地将音乐、图片、视频等资源文件(一般是静态资源)传递给用户

image.png

CDN - 使用CDN前后

image.png

  • CDN运营商在全国、乃至全球的各个大枢纽城市都建立了机房
    • 部署了大量拥有高存储高带宽的节点,构建了一个跨运营商、跨地域的专用网络
  • 内容所有者向CDN运营商支付费用,CDN将其内容交付给最终用户

    缓存

    image.png

  • 实际上,HTTP的缓存机制远远比上图的流程要复杂

  • 通常会缓存的情况是:GET请求+静态资源
  • Ctrl + F5:可以强制刷新缓存

    缓存 - 响应头

  • Pragma:作用类似于Cache-Control,Http/1.0的产物

  • Expires:缓存的过期时间(GMT格式时间),HTTP/1.0的产物
  • Cache-Control:设置缓存策略
    • no-storage:不缓存数据到本地
    • public:允许用户、代理服务器缓存数据到本地
    • private:只允许用户缓存数据到本地
    • max-age:缓存的有效时间(多长时间不过期),单位秒
    • no-cache:每次需要发请求给服务器询问缓存是否有变化,再来决定如何使用缓存
  • 优先级:Pragma > Cache-Control > Expires
  • Last-Modified: 资源的最后一次修改时间
  • ETag:资源的唯一标识(根据文件内容计算出来的摘要值)
  • 优先级:ETag > Last-Modified

    缓存 - 请求头

  • If-None-Match

    • 如果上一次的响应头中有ETag,就会将ETag的值作为请求头的值
    • 如果服务器发现资源的最新摘要值跟if-None-Match不匹配,就会返回新的资源(200 OK)
    • 否则,就不会返回资源的具体数据(304 Not Modified)
  • If-Modified-Since

    • 如果上一次的响应头中没有ETag,有Last-Modified,就会将Last-Modified的值作为请求头的值
    • 如果服务器发现资源的最后一次修改时间晚于If-Modified-Since,就会返回新的资源(200 Ok)
    • 否则,就不会返回资源的具体数据(304,Not Modified)

      缓存 - Last-Modified VS ETag

  • Last-Modified的缺陷

    • 只能精确到秒级别,如果资源在1秒内被修改了,客户端将无法获取最新的资源数据
    • 如果某些资源被修改了(最后一次修改时间发生了变化),但是内容并没有任何变化
      • 会导致相同数据重复传输,没有使用到缓存
  • ETag可以办到
    • 只要资源的内容没有变化,就不会重复传输资源数据
    • 只要资源的内容发生了变化,就会返回最新的资源数据给客户端

      缓存的使用流程

      image.png