HTTP概述

HTTP 概述

HTTP 是一种网络通讯协议(protocol)。它是 Web 数据交换的基础,是一种 client-server 协议(C/S架构),也就是说,请求(request)由客户端(浏览器)发起,服务端接收,并返回响应(response)。

HTTP 被设计于 20 世纪 90 年代初期,是一种可扩展的协议。它是应用层的协议,通过 TCP连接来发送。

基于 HTTP 的组件系统

HTTP 是一个 client-server 协议:请求通过一个实体被发出,实体也就是用户代理。大多数情况下,这个用户代理都是指浏览器。

每一个发送到服务器的请求,都会被服务器处理并返回一个消息,也就是response。在这个请求与响应之间,还有许许多多的被称为 代理 的实体,他们的作用与表现各不相同,比如有些是网关,还有些是 cache 等。

实际上,在一个浏览器和处理请求的服务器之间,还有路由器、调制解调器等许多计算机。由于 Web 的层次设计,那些在网络层和传输层的细节都被隐藏起来了。HTTP 位于最上层的应用层。虽然底层对于分析网络问题非常重要,但是大多都跟对 HTTP 的描述不相干。

客户端 user-agent

user-agent 是用户发起请求的工具(一般是浏览器),然后服务器会返回响应,客户端再去解析响应的内容

Web 服务端

响应请求(接受请求并返回响应),一般由一台或者多台服务器组成,当然一台服务器也可以充当多个服务的服务端

代理 proxy

在服务端和客户端之间的 网络层、传输层和物理层上的设备,获取您应该很熟悉VPN吧,那是一种正向代理设备,另外,有些网站会为了实现负载均衡而使用反向代理,这些就是所谓的代理

代理的作用:

  • 缓存
  • 过滤
  • 负载均衡
  • 认证
  • 日志记录

HTTP 的基本性质

  • HTTP 是简单的(HTTP 报文是容易读懂的)
  • HTTP 是可扩展的(HTTP标头(header)让协议扩展变得非常容易)
  • HTTP 是无状态,有会话的(HTTP不会记录上次请求的信息,但是可以通过创建Cookie来实现有状态的会话)
  • HTTP 和 连接(HTTP不要求其底层的传输协议是面向连接的,只需要它是可靠的,TCP是面向连接且稳定的,所以HTTP/2及之前都是用的是TCP作为底层传输层协议,UDP是不面向连接的协议,并且也不够可靠,但如果能从算法上解决可靠性问题,那么UDP同样可以作为HTTP的传输层协议,恰巧在HTTP/3中,正是使用的UDP协议来进行传输的。并且因为UDP没有复杂的连接过程,所以UDP比TCP拥有更好的性能)

HTTP 流

当客户端想要和服务端进行信息交互时,过程有以下几步:

  1. 打开一个TCP连接:客户端可以打开一个新的连接或者重用已经存在的连接
  2. 发送一个HTTP报文:HTTP/2之前的报文是可读的,在HTTP/2 中,报文被封装在了帧中,这使得报文不能被直接读取,但是原理仍然相同
    GET / HTTP/1.1
    Host: developer.mozilla.org
    Accept-Language: fr
  3. 读取服务端返回的报文信息:
    HTTP/1.1 200 OK
    Date: Sat, 09 Oct 2010 14:28:02 GMT
    Server: Apache
    Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
    ETag: "51142bc1-7449-479b075b2891b"
    Accept-Ranges: bytes
    Content-Length: 29769
    Content-Type: text/html

    <!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
  4. 关闭连接或者为后续请求重用连接

当HTTP流启动后,后去请求都可以不用等待第一个请求响应就抢先发送,但是因为网络环境的复杂,老旧软件与现代软件共存,导致这很难实现。因此,HTTP流 被更加优秀的HTTP/2的帧取代

HTTP 报文

HTTP/1.1 以及更早的 HTTP 协议报文都是语义可读的。在 HTTP/2 中,这些报文被嵌入到了一个新的二进制结构,帧。帧允许实现很多优化,比如报文标头的压缩以及多路复用。即使只有原始 HTTP 报文的一部分以 HTTP/2 发送出来,每条报文的语义依旧不变,客户端会重组原始 HTTP/1.1 请求。因此用 HTTP/1.1 格式来理解 HTTP/2 报文仍旧有效。

HTTP 有两种报文类型:请求 与 响应

请求

请求报文由以下元素组成:

  • 请求方法:GET、POST、PUT等
  • 路径:与URL中的路径相同(http://example.com/path)
  • 协议版本号
  • 标头:标识报文的一些信息
  • 主体:像POST等需要发送资源的请求方法就会有报文主体

响应

响应报文由以下元素组成:

  • 协议版本号
  • 状态码:表示请求的状态(成功或者失败或者其他等状态)
  • 状态信息
  • 标头:与请求报文表头类似
  • 可选项(主体):与请求报文的主题一样,用来包含一些资源文件