初识HTTP协议 | 青训营

137 阅读6分钟

HTTP协议(超文本传输协议)

HTTP协议是一种用于在万维网上交换信息的应用层协议,它基于TCP/IP协议族,支持客户端/服务器模式和请求/响应模式。

协议分析

发展历程

  • HTTP 0.9: 1991年发布,只支持GET方法,没有请求头和响应头,只能传输HTML格式的文本。
  • HTTP 1.0: 1996年发布,增加了POST和HEAD方法,引入了请求头和响应头,支持多种类型的数据传输。
  • HTTP 1.1: 1999年发布,是目前使用最广泛的版本,增加了PUT, DELETE, OPTIONS等方法,支持持久连接和分块传输编码,引入了缓存机制和内容协商机制。
  • HTTP 2: 2015年发布,是对HTTP 1.1的重大改进,采用了二进制格式而不是文本格式,支持多路复用和服务器推送,提高了传输效率和安全性。
  • HTTP 3: 2020年发布草案,是对HTTP 2的进一步优化,基于QUIC协议而不是TCP协议,解决了TCP的队头阻塞问题,提升了网络延迟和拥塞控制。

协议分析 以1.1为例

报文

HTTP报文是由客户端或服务器发送的数据块,分为请求报文和响应报文两种类型。每个报文都由三部分组成:起始行、头部字段和主体部分。

起始行

起始行是报文的第一行,用于描述报文的基本信息。请求报文的起始行包含以下三个部分:

  • Method: 请求方法,表示客户端想要对服务器资源执行的操作。常见的请求方法有GET, POST, HEAD, PUT, DELETE, OPTIONS等。
  • Request-URI: 请求统一资源标识符,表示客户端想要访问的服务器资源的地址。例如http://www.example.com/index.html
  • HTTP-Version: 请求使用的HTTP版本号。例如HTTP/1.1

响应报文的起始行包含以下三个部分:

  • HTTP-Version: 响应使用的HTTP版本号。例如HTTP/1.1
  • Status-Code: 响应状态码,表示服务器对请求的处理结果。常见的状态码有200(成功), 404(未找到), 500(服务器错误)等。
  • Reason-Phrase: 响应原因短语,表示状态码的简短描述。例如OK, Not Found, Internal Server Error等。
头部字段

头部字段是报文中的一系列键值对,用于描述报文的元数据信息。每个头部字段由一个字段名和一个字段值组成,中间用冒号分隔。头部字段可以分为通用头部字段、请求头部字段、响应头部字段和实体头部字段四种类型。

常用的请求头部字段有:

  • Host: 请求的目标主机名或IP地址。例如Host: www.example.com
  • User-Agent: 请求发送者的浏览器或操作系统信息。例如User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
  • Accept: 请求接受的内容类型。例如Accept: text/html, application/json, image/png
  • Accept-Language: 请求接受的语言类型。例如Accept-Language: en-US, zh-CN, ja-JP
  • Accept-Encoding: 请求接受的编码方式。例如Accept-Encoding: gzip, deflate, br
  • Cookie: 请求携带的客户端保存的键值对数据。例如Cookie: name=alice; age=18; gender=female

常用的响应头部字段有:

  • Server: 响应发送者的服务器软件信息。例如Server: Apache/2.4.46 (Win64) OpenSSL/1.1.1g PHP/7.4.9
  • Date: 响应发送的日期和时间。例如Date: Tue, 08 Aug 2023 10:53:08 GMT
  • Content-Type: 响应的内容类型。例如Content-Type: text/html; charset=UTF-8
  • Content-Length: 响应的内容长度,单位为字节。例如Content-Length: 1024
  • Content-Encoding: 响应的内容编码方式。例如Content-Encoding: gzip
  • Set-Cookie: 响应设置的客户端保存的键值对数据。例如Set-Cookie: session_id=1234567890; expires=Wed, 09 Aug 2023 10:53:08 GMT; path=/; domain=www.example.com; secure; httponly
主体部分

主体部分是报文中的可选部分,用于传输请求或响应的实际内容。主体部分可以是任意类型的数据,如HTML文本,JSON对象,图片文件等。主体部分的长度和类型由头部字段中的Content-Length和Content-Type指定。

RESTful API

RESTful API是一种基于HTTP协议的接口设计风格,它遵循REST(Representational State Transfer)原则,即表述性状态转移。RESTful API的核心思想是将服务器上的资源抽象为统一资源标识符(URI),并通过HTTP方法对资源进行增删改查等操作,从而实现客户端和服务器之间的状态转移。

RESTful API具有以下特点:

  • 资源和URI之间存在一一对应的关系,每个资源都有一个唯一的URI来标识。例如,http://www.example.com/users/1表示用户编号为1的资源。
  • HTTP方法和资源操作之间存在一一对应的关系,每个操作都使用一个合适的HTTP方法来执行。常见的HTTP方法和操作有GET(获取资源),POST(创建资源),PUT(更新资源),DELETE(删除资源),OPTIONS(查询资源支持的方法)等。
  • HTTP状态码和资源操作结果之间存在一一对应的关系,每个结果都使用一个合适的HTTP状态码来表示。常见的HTTP状态码和结果有200(成功),201(已创建),204(无内容),400(错误请求),401(未授权),403(禁止访问),404(未找到),500(服务器错误)等。
  • HTTP响应主体和资源表述之间存在一一对应的关系,每个表述都使用一个合适的内容类型来表示。常见的内容类型有text/html, application/json, image/png等。

HTTP/2 概述

HTTP/2是HTTP协议的第二个主要版本,它在HTTP 1.1的基础上进行了重大改进,旨在提高Web性能和用户体验。

HTTP/2具有以下特点:

  • 二进制格式: HTTP/2采用了二进制格式而不是文本格式来传输报文,使得报文更紧凑、更高效、更易解析。
  • 多路复用: HTTP/2支持在同一个TCP连接上同时传输多个报文,避免了HTTP 1.1中由于单个报文阻塞导致其他报文延迟的问题。
  • 头部压缩: HTTP/2使用HPACK算法- 头部压缩: HTTP/2使用HPACK算法对头部字段进行压缩,减少了报文的大小和冗余,提高了传输效率。
  • 服务器推送: HTTP/2支持服务器主动向客户端推送资源,避免了客户端多次请求的开销,提升了用户体验。
  • 流控制和优先级: HTTP/2支持对每个报文流进行流量控制和优先级设置,使得服务器可以根据客户端的需求和网络状况灵活地分配带宽和资源。

HTTPS 概述

HTTPS是HTTP协议的安全版本,它在HTTP协议的基础上增加了SSL/TLS协议的支持,实现了报文的加密、身份认证和完整性保护。

HTTPS具有以下特点:

  • 加密: HTTPS使用对称加密或非对称加密算法对报文进行加密,防止报文被第三方窃听或篡改。
  • 认证: HTTPS使用数字证书和数字签名对服务器和客户端进行身份认证,防止报文被第三方伪造或重放。
  • 完整性: HTTPS使用消息摘要或消息验证码对报文进行完整性校验,确保报文在传输过程中没有被修改或损坏。