HTTP协议
HTTP协议
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是万维网(WWW)数据通信的基础,主要用于在客户端(如浏览器)和服务器之间传输超文本(如HTML)和其他资源
-
HTTP的基本概念
- 客户端-服务器模型:HTTP采用客户端-服务器模型,客户端发起请求,服务器响应请求。
- 无状态协议:HTTP是无状态协议,每个请求都是独立的,服务器不会保留之前请求的信息。
- 请求-响应模型:客户端发送一个HTTP请求,服务器返回一个HTTP响应。
-
HTTP的版本
- HTTP/0.9:最初的版本,只支持GET方法,响应只能是HTML格式。
- HTTP/1.0:增加了更多的方法(如POST、HEAD),支持多种内容类型(如文本、图像等),引入了HTTP头字段。
- HTTP/1.1:引入了持久连接、管道化、分块传输编码等特性,是目前广泛使用的版本。
- HTTP/2:引入了二进制帧、多路复用、头部压缩等特性,提高了性能。
- HTTP/3:基于QUIC协议,进一步优化了性能和安全性。
-
HTTP请求方法
- GET:请求指定的资源。
- POST:向指定资源提交数据进行处理请求(如提交表单或上传文件)。
- PUT:替换指定的资源。
- DELETE:删除指定的资源。
-
HTTP状态码
- 1xx(信息性状态码):请求已被接收,继续处理。
- 2xx(成功状态码):请求已成功被服务器接收、理解、并接受。
- 200 OK:请求成功。
- 201 Created:请求已被实现,且创建了新的资源。
- 3xx(重定向状态码):需要客户端采取进一步的操作来完成请求。
- 301 Moved Permanently:资源已永久移动到新位置。
- 302 Found:资源临时从不同的URI响应请求。
- 4xx(客户端错误状态码):客户端可能出错,妨碍了服务器的处理。
- 400 Bad Request:请求无效。
- 404 Not Found:请求的资源未找到。
- 5xx(服务器错误状态码):服务器在处理请求时发生错误。
- 500 Internal Server Error:服务器内部错误。
- 503 Service Unavailable:服务器暂时不可用。
HTTP消息格式
HTTP消息都由以下部分组成:
- 起始行(Start Line)
- 头部字段(Headers)
- 空行(Empty Line)
- 消息体(Body,可选)
起始行
请求消息的起始行称为请求行(Request Line),格式如下
<方法> <请求目标> <HTTP版本>
GET /index.html HTTP/1.1
- 方法:表示客户端希望服务器执行的操作,如
GET、POST、PUT等。 - 请求目标:通常是资源的路径(URI),例如
/index.html。 - HTTP版本:使用的HTTP协议版本,如
HTTP/1.1。
响应消息的起始行称为状态行(Status Line),格式如下:
<HTTP版本> <状态码> <状态文本>
HTTP/1.1 200 OK
- HTTP版本:服务器使用的HTTP协议版本,如
HTTP/1.1。 - 状态码:表示请求的处理结果,如
200、404等。 - 状态文本:对状态码的简短描述,如
OK、Not Found。
头部字段
头部字段是键值对的形式,用于传递额外的元信息。每个头部字段占一行,格式为:
<字段名>: <字段值>
头部字段可以分为以下几类:
-
通用头部:适用于请求和响应,如
Cache-Control、Connection。 -
请求头部:仅用于请求,如
User-Agent、Accept。 -
响应头部:仅用于响应,如
Server、Content-Type。 -
实体头部:描述消息体的信息,如
Content-Length、Content-Encoding。Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html Content-Length: 123 Content-Type: application/json
空行
头部字段结束后,必须有一个空行(即两个连续的换行符 \r\n),用于分隔头部和消息体。
消息体(Body)
消息体是可选的,用于传输实际的数据。在请求中,消息体通常用于提交表单数据或上传文件;在响应中,消息体通常包含请求的资源(如HTML页面、JSON数据等)。
- 消息体的格式由
Content-Type头部字段指定,如text/html、application/json。 - 消息体的大小由
Content-Length头部字段指定。
注意事项
- 换行符:HTTP消息中的每一行必须以
\r\n(回车+换行)结束。 - 大小写敏感:方法名和头部字段名是大小写敏感的,通常方法名大写,头部字段名首字母大写。
- 消息体可选:并非所有请求或响应都需要消息体,例如
GET请求通常没有消息体。 - 分块传输:当消息体长度未知时,可以使用
Transfer-Encoding: chunked,将消息体分块传输。

浙公网安备 33010602011771号