自学教程 从零学编程

HTTP 协议

一、HTTP 是什么

HTTP(HyperText Transfer Protocol,超文本传输协议),是应用层协议,基于TCP。
默认端口 80。
HTTP 是万维网(Web)的基础协议,浏览器和Web服务器之间传输网页、图片、JS、CSS、接口数据都使用HTTP。

简单理解:浏览器(客户端)向服务器发送请求,服务器返回响应,一问一答。
注意:HTTP是明文传输,不加密;加密版本为HTTPS(HTTP+TLS),端口443。

二、HTTP 核心特点

  1. 请求-响应模型:客户端主动发起请求,服务器被动返回响应;
  2. 无状态:服务器不会记住上一次客户端是谁,每次请求相互独立。>

解决无状态:Cookie、Session、Token;

  1. 无连接(HTTP/1.1之前):一次请求响应完成就断开TCP连接;HTTP/1.1默认支持长连接(Keep-Alive),复用TCP连接;
  2. 明文传输:请求、响应全部裸奔,中间人可以抓包查看和篡改内容;
  3. 基于文本:报文是可读的文本格式。

版本区分:

  • HTTP/1.0:短连接,一次请求一次连接;
  • HTTP/1.1:默认长连接、管道化、缓存、Host头(现在最广泛使用);
  • HTTP/2:二进制、多路复用、头部压缩;
  • HTTP/3:基于QUIC(UDP)。

三、HTTP 请求报文结构

由四部分组成:请求行、请求头、空行、请求体

GET /index.html HTTP/1.1          # 请求行
Host: www.example.com             # 请求头
User-Agent: Mozilla/5.0
Accept: text/html
                                  # 空行(必须)
【请求体,POST/PUT等方法才有】
  1. 请求行:请求方法 + 请求资源路径 + HTTP版本
  2. 请求头(Header):键值对,描述客户端信息、资源类型、Cookie等
  3. 空行:用来分隔头部和请求体
  4. 请求体(Body):POST、PUT携带提交的数据;GET没有请求体

常用请求方法

方法含义是否有请求体
GET获取资源,查询数据一般不使用body
POST提交数据,新增资源✅有body
PUT全量更新资源✅有body
DELETE删除资源可选
HEAD只获取响应头,不要响应体无
OPTIONS查询服务器支持哪些方法可选

RESTful风格就是利用这几个方法表达资源操作语义。

四、HTTP 响应报文结构

状态行、响应头、空行、响应体

HTTP/1.1 200 OK                   # 状态行
Server: nginx
Content-Type: text/html
Content-Length: 1024
                                  # 空行
<html>...</html>                  # 响应体(网页内容)
  • 状态行:HTTP版本 + 状态码 + 描述短语
  • 响应头:服务器返回的元信息(资源类型、缓存策略、Cookie等)
  • 响应体:网页、图片、JSON接口返回数据

常见状态码分类

  • 1xx 信息类:继续处理
  • 2xx 成功
    • 200 OK:成功
    • 201 Created:创建成功
  • 3xx 重定向
    • 301 Moved Permanently:永久重定向
    • 302 Found:临时重定向
    • 304 Not Modified:资源未修改,使用本地缓存
  • 4xx 客户端错误
    • 400 Bad Request:请求报文错误
    • 401 Unauthorized:未认证
    • 403 Forbidden:权限拒绝
    • 404 Not Found:资源不存在
  • 5xx 服务端错误
    • 500 Internal Server Error:服务器内部错误
    • 502 Bad Gateway:网关错误
    • 503 Service Unavailable:服务不可用

五、重要请求头与响应头示例

请求头

  • Host:目标主机域名(HTTP1.1强制)
  • User-Agent:客户端浏览器/设备标识
  • Cookie:携带Cookie信息
  • Accept:客户端可接收的数据类型
  • Referer:从哪个页面跳转过来

响应头

  • Content-Type:响应体MIME类型(text/html、application/json、image/png)
  • Content-Length:响应体字节长度
  • Set-Cookie:服务器下发Cookie给浏览器
  • Cache-Control:缓存控制
  • Location:重定向地址(301/302使用)

六、无状态问题与解决方案

HTTP本身无状态:服务器无法区分两次请求是不是同一个用户。
解决方案:

  1. Cookie:保存在浏览器本地,每次请求自动携带发给服务器;
  2. Session:服务端存储用户会话信息,Cookie存放SessionID;
  3. Token(JWT等):令牌放在请求头Authorization,适合前后端分离、APP接口。

七、HTTP长连接 Keep-Alive

HTTP/1.1 默认开启Keep-Alive。

  • 一次TCP连接,可以连续发送多个HTTP请求;
  • 不用每次请求都新建、断开TCP连接,减少三次握手、四次挥手开销;
  • 超过超时时间,服务器自动关闭TCP连接。

注意:长连接是TCP连接复用,不是HTTP协议本身保持会话状态。

八、HTTP缓存简单理解

浏览器会缓存静态资源(图片、js、css),减少重复请求:

  • 协商缓存:Last-Modified / ETag,服务器对比资源是否更新,返回304;
  • 强缓存:Cache-Control: max-age,有效期内直接使用本地缓存,不访问服务器。

九、HTTP vs HTTPS

项目HTTPHTTPS
端口80443
加密❌明文✅TLS加密
安全性低,可抓包篡改高,防窃听、防篡改、身份校验
底层TCPTCP+TLS

HTTPS并不是新协议,是HTTP跑在TLS加密通道之上。

十、小结

  1. HTTP应用层TCP协议,80端口,Web网页与API接口基础;
  2. 一问一答请求响应模型,无状态,靠Cookie/Session/Token记录用户;
  3. 报文分为请求报文、响应报文,文本格式;
  4. HTTP1.1支持Keep-Alive长连接,复用TCP;
  5. 状态码用来表达请求结果;HTTP明文不安全,生产环境推荐HTTPS。

思考题:HTTP是无状态,Keep-Alive是长连接,这两个概念有什么区别,不要混淆?

标签:

0 条笔记