Skip to main content

HTTP 协议概述

HTTP 概述

HTTP(HyperText Transfer Protocol)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是万维网(WWW)的数据通信的基础。

  • 它是一个应用层协议,基于 TCP 协议。
  • 请求响应。
  • 简单可扩展。
  • 无状态。

🔔 HTTP采用TCP服务

  • 客户发起一个与服务器的TCP连接(建立套接字), 端口号为80
  • 服务器接受客户的TCP连接
  • 在浏览器(HTTP客户端)与Web服务器(HTTP服务器server)交换HTTP报文(应用层协议报文)
  • TCP连接关闭
    HTTP是无状态的 服务器并不维护关于客户的任何信息

⚠ 什么是无状态协议

常见的许多七层协议实际上是有状态的,例如SMTP协议,它的第一条消息必须是HELO,用来握手,在HELO发送之前其他任何命令都是不能发送的;接下来一般要进行AUTH阶段,用来验证用户名和密码;接下来可以发送邮件数据;最后,通过QUT命令退出。可以看到,在整个传输层上,通信的双方是必须要时刻记住当前连接的状态的,因为不同的状态下能接受的命令是不同的;另外,之前的命令传输的某些数据也必须要记住,可能会对后面的命令产生影响。这种就叫做有状态的协议。

相反,为什么说HTTP是无状态的协议呢?因为它的每个请求都是完全独立的,每个请求包含了处理这个请求所需的完整的数据,发送请求不涉及到状态变更.

HTTP 请求报文

HTTP 请求报文由三部分组成:请求行、请求头、请求体。

请求行

请求行包含了请求方法、请求 URL 和 HTTP 版本。

  • 请求方法:GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT
  • 请求 URL:请求资源的 URL
  • HTTP 版本:HTTP/1.1

请求头

请求头包含了请求的附加信息,例如:客户端信息、请求内容类型、请求内容长度、Cookie 等。

请求体

请求体包含了请求的内容,例如:表单数据、JSON 数据、XML 数据等。

一个请求报文的示例如下:

GET / HTTP/1.1

Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

HTTP 响应报文

HTTP 响应报文由三部分组成:状态行、响应头、响应体。

状态行

状态行包含了 HTTP 版本、状态码、状态描述。

  • HTTP 版本:HTTP/1.1
  • 状态码:200、404、500
  • 状态描述:OK、Not Found、Internal Server Error

响应头

响应头包含了响应的附加信息,例如:服务器信息、响应内容类型、响应内容长度、Cookie 等。

响应体

响应体包含了响应的内容,例如:HTML 页面、JSON 数据、XML 数据等。

一个响应报文的示例如下:

HTTP/1.1 200 OK

Date: Mon, 21 Jun 2021 08:00:00 GMT
Content-Type: text/html;charset=UTF-8
Content-Length: 11
Connection: keep-alive

Hello World

HTTP 状态码

HTTP 状态码是服务器对客户端请求的响应状态,它由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 1xx:指示信息 - 表示请求已接收,继续处理
  • 2xx:成功 - 表示请求已被成功接收、理解、接受
  • 3xx:重定向 - 要完成请求必须进行更进一步的操作
  • 4xx:客户端错误 - 请求有语法错误或请求无法实现
  • 5xx:服务器端错误 - 服务器未能实现合法的请求

常见的状态码有:

  • 200 OK:客户端请求成功
  • 301 Moved Permanently:永久重定向
  • 302 Found:临时重定向
  • 304 Not Modified:客户端缓存有效
  • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务
  • 404 Not Found:请求资源不存在,eg:输入了错误的 URL
  • 500 Internal Server Error:服务器发生不可预期的错误
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常

HTTP 方法

HTTP 方法是客户端对服务器资源进行操作的一种规范,它定义了客户端可以对服务器上的资源进行哪些操作,HTTP 方法有很多种,常见的有:GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT。

GET

GET 方法用于获取资源,它是最常用的方法,也是默认的方法。GET 方法的请求报文如下:

GET / HTTP/1.1

Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
...

POST

POST 方法用于传输实体主体,它通常用于向服务器提交数据。POST 方法的请求报文如下:

POST / HTTP/1.1

Host: localhost:8080
Connection: keep-alive
Content-Length: 11
Cache-Control: max-age=0
...
Hello World

PUT

PUT 方法用于传输文件,它通常用于上传文件到服务器。

DELETE

DELETE 方法用于删除文件,它通常用于从服务器删除文件。

HEAD 方法用于获取报文首部,它与 GET 方法的唯一区别在于不返回报文主体部分。

OPTIONS

OPTIONS 方法用于查询针对请求 URI 指定的资源支持的方法,它用 * 通配符来表示服务器上的所有资源。

请求头

HTTP 请求头是客户端向服务器发送的附加信息,它由键值对组成,键和值之间用冒号分隔,每个键值对占一行,最后以一个空行结束。常见的请求头有:

  • Accept:客户端能够接收的内容类型
  • Accept-Charset:客户端能够接收的字符集
  • Accept-Encoding:客户端能够接收的编码格式
  • Accept-Language:客户端能够接收的语言
  • Authorization:客户端授权信息
  • Connection:连接的管理
  • Cookie:客户端设置的 Cookie
  • Host:请求资源所在的服务器
  • User-Agent:客户端程序信息
  • Content-Type:请求体的数据类型
  • Cache-Control:缓存的控制
  • If-Modified-Since:如果请求的资源在指定时间之后被修改过,则服务器返回 200 OK,否则返回 304 Not Modified
  • If-None-Match:如果请求的资源的 ETag 和指定的 ETag 相同,则服务器返回 200 OK,否则返回 304 Not Modified
  • Origin:发起请求的源站点

缓存

HTTP 缓存是指客户端缓存服务器返回的资源,下次请求时直接使用缓存,而不是再次向服务器发送请求。缓存可以减少网络带宽的使用,提高响应速度,减轻服务器的负载。

HTTP/2

HTTP/2 是 HTTP 协议的下一代版本,它的主要特点是多路复用、二进制分帧、首部压缩、服务器推送等。它的特点如下:

  • 多路复用:在一个 TCP 连接上可以并行发送多个请求或响应,而不需要按照顺序一一对应。
  • 二进制分帧:HTTP/2 将所有传输的数据分割为更小的消息和帧,并采用二进制格式对它们进行编码,这样做的好处是可以在不同的层之间进行传输,而不需要进行文本解析。
  • 首部压缩:HTTP/2 使用 HPACK 算法对首部进行压缩,减少了首部的大小。
  • 服务器推送:服务器可以主动向客户端推送资源,而不需要客户端发起请求。

HTTPS

HTTPS 是 HTTP 协议的安全版,它使用 SSL/TLS 协议对 HTTP 协议进行加密,从而保证传输的安全。HTTPS 的工作原理如下:

  1. 客户端向服务器发送请求,要求与服务器建立 SSL 连接。
  2. 服务器收到请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
  3. 客户端的浏览器会验证证书的合法性,如果证书受信任,则生成一串随机数(Pre-Master Secret)。
  4. 客户端使用证书中的公钥加密 Pre-Master Secret,并发送给服务器。
  5. 服务器使用自己的私钥解密 Pre-Master Secret,得到客户端生成的随机数。
  6. 服务器和客户端使用随机数来生成用于加密通信的对称密钥。
  7. 服务器和客户端使用对称密钥加密通信。