网络相关 - http基础讲解

文章目录

    • [一、HTTP 基础概念](#一、HTTP 基础概念)
      • [1.1 什么是 HTTP?](#1.1 什么是 HTTP?)
    • [二、HTTP 请求方法详解](#二、HTTP 请求方法详解)
    • [三、HTTP 报文结构](#三、HTTP 报文结构)
      • [3.1 请求报文](#3.1 请求报文)
      • [**3.2 响应报文**](#3.2 响应报文)
    • [四、HTTP 头部字段详解](#四、HTTP 头部字段详解)
      • [4.1 内容协商头部](#4.1 内容协商头部)
        • [4.1.1 Accept 相关字段](#4.1.1 Accept 相关字段)
        • [4.1.2 Content-Type 相关字段](#4.1.2 Content-Type 相关字段)
      • [4.2 请求控制头部](#4.2 请求控制头部)
        • [4.2.1 请求来源与目标](#4.2.1 请求来源与目标)
        • [4.2.2 缓存控制](#4.2.2 缓存控制)
        • [4.2.3 连接管理](#4.2.3 连接管理)
      • [4.3 响应控制头部](#4.3 响应控制头部)
        • [4.3.1 重定向与位置](#4.3.1 重定向与位置)
        • [4.3.2 响应缓存](#4.3.2 响应缓存)
        • [4.3.3 CORS 相关](#4.3.3 CORS 相关)
      • [4.4 安全相关头部](#4.4 安全相关头部)
        • [4.4.1 基础安全头](#4.4.1 基础安全头)
        • [4.4.2 内容安全策略(CSP)](#4.4.2 内容安全策略(CSP))
        • [4.4.3 其他安全头](#4.4.3 其他安全头)
      • [4.5 特殊用途头部](#4.5 特殊用途头部)
        • [4.5.1 下载控制](#4.5.1 下载控制)
        • [4.5.2 分块传输](#4.5.2 分块传输)
        • [4.5.3 WebSocket](#4.5.3 WebSocket)
      • [4.6 最佳实践](#4.6 最佳实践)
        • [4.6.1 API 设计推荐头](#4.6.1 API 设计推荐头)
        • [4.6.2 安全头配置示例](#4.6.2 安全头配置示例)
        • [4.6.3 性能优化头](#4.6.3 性能优化头)
    • [五、HTTP 状态码详解](#五、HTTP 状态码详解)
      • [5.1. 1xx(信息响应)](#5.1. 1xx(信息响应))
      • [5.2. 2xx(成功响应)](#5.2. 2xx(成功响应))
      • [5.3. 3xx(重定向)](#5.3. 3xx(重定向))
      • [5.4. 4xx(客户端错误)](#5.4. 4xx(客户端错误))
      • [5.5. 5xx(服务器错误)](#5.5. 5xx(服务器错误))
    • 六、预检请求
      • [6.1 触发预检的 3 种条件](#6.1 触发预检的 3 种条件)
      • [6.2 示例场景](#6.2 示例场景)
      • [6.3 不会触发预检的简单请求](#6.3 不会触发预检的简单请求)

HTTP(HyperText Transfer Protocol)是现代互联网通信的基础协议。无论是浏览网页、调用 API 还是微服务交互,都离不开 HTTP 协议。本文将全面解析 HTTP 协议的各个关键组成部分,包括请求方法、报文结构、头部字段、状态码以及安全策略,帮助开发者深入理解并优化 Web 通信。

一、HTTP 基础概念

1.1 什么是 HTTP?

HTTP 是一种无状态请求-响应 协议,基于 TCP/IP 实现,用于客户端(浏览器、App 等)和服务器之间的通信。

  • 无状态:每个请求相互独立,服务器默认不记录之前的交互(依赖 Cookie/Session 维持状态)
  • 明文传输(HTTPS 会对内容加密)
  • 默认端口:80(HTTP)、443(HTTPS)

二、HTTP 请求方法详解

HTTP 定义了一组请求方法(HTTP Methods)来表明对资源的操作意图:

方法 说明 是否幂等 安全 请求体
GET 获取资源
POST 提交数据
PUT 替换资源
DELETE 删除资源
PATCH 部分更新资源
HEAD 获取响应头
OPTIONS 获取支持的通信选项

关键概念:

  • 幂等性:多次执行相同操作结果一致(如 GET 不会改变资源状态)
  • 安全性:不会修改资源的操作(如 GET、HEAD)

三、HTTP 报文结构

3.1 请求报文

http 复制代码
POST /api/data HTTP/1.1
Host: example.com
Content-Type: application/json
Accept: application/json
Authorization: Bearer xxxxxx

{"name": "John"}
  • 请求行方法 + URL + HTTP版本
  • 请求头:包含元数据(如认证、内容类型等)
  • 空行:分隔头部和主体
  • 请求体:实际传输的数据

3.2 响应报文

http 复制代码
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: max-age=3600

{"status": "success"}
  • 状态行HTTP版本 + 状态码 + 状态文本
  • 响应头:服务器返回的元数据
  • 空行:分隔头部和主体
  • 响应体:返回的实际内容

四、HTTP 头部字段详解

HTTP 头部字段是 HTTP 协议的核心组成部分,它们控制着客户端与服务器之间的通信方式。本文将全面整理 HTTP 协议中所有重要的头部字段,包括请求头、响应头、安全头以及内容协商相关字段。

4.1 内容协商头部

4.1.1 Accept 相关字段
头部字段 说明 示例值 重要参数
Accept 声明客户端可接受的响应内容类型 text/html, application/json q权重值(0-1)
Accept-Charset 可接受的字符编码 utf-8, iso-8859-1
Accept-Encoding 可接受的内容编码(压缩方式) gzip, deflate, br
Accept-Language 可接受的语言 zh-CN, en-US;q=0.9
Accept-Patch 服务器支持的 PATCH 格式 application/json-patch+json

示例:

http 复制代码
Accept: text/html, application/xhtml+xml, application/xml;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN, zh;q=0.9, en;q=0.8
4.1.2 Content-Type 相关字段
头部字段 说明 常见 MIME 类型
Content-Type 实体主体的媒体类型 text/html, application/json
Content-Encoding 内容编码方式 gzip, deflate
Content-Language 内容语言 zh-CN, en-US
Content-Location 返回资源的替代位置 /alternative.html

常见 Content-Type 值:

  • text/plain:纯文本
  • text/html:HTML 文档
  • application/json:JSON 数据
  • application/xml:XML 数据
  • multipart/form-data:文件上传
  • application/x-www-form-urlencoded:表单数据

4.2 请求控制头部

4.2.1 请求来源与目标
头部字段 说明 示例
Host 请求的目标主机 example.com
Origin 请求来源(协议+域名+端口) https://example.com
Referer 请求来源页面 URL https://example.com/page
User-Agent 客户端标识 Mozilla/5.0
4.2.2 缓存控制
头部字段 说明 示例
Cache-Control 缓存指令 no-cache, max-age=3600
If-Modified-Since 条件请求(时间) Wed, 21 Oct 2023 07:28:00 GMT
If-None-Match 条件请求(ETag) "123456"
4.2.3 连接管理
头部字段 说明 示例
Connection 连接控制 keep-alive, close
Upgrade 协议升级 websocket

4.3 响应控制头部

4.3.1 重定向与位置
头部字段 说明 示例
Location 重定向目标 URL /new-location
Refresh 自动刷新/重定向 5; url=/new-page
4.3.2 响应缓存
头部字段 说明 示例
ETag 资源版本标识 "123456"
Last-Modified 最后修改时间 Wed, 21 Oct 2023 07:28:00 GMT
Expires 过期时间 Thu, 01 Dec 2023 16:00:00 GMT
4.3.3 CORS 相关
头部字段 说明 示例
Access-Control-Allow-Origin 允许的源 *, https://example.com
Access-Control-Allow-Methods 允许的方法 GET, POST, PUT
Access-Control-Allow-Headers 允许的头部 Content-Type, Authorization

4.4 安全相关头部

4.4.1 基础安全头
头部字段 说明 推荐值
Strict-Transport-Security 强制 HTTPS max-age=31536000; includeSubDomains
X-Content-Type-Options 禁用 MIME 嗅探 nosniff
X-Frame-Options 防点击劫持 DENY, SAMEORIGIN
4.4.2 内容安全策略(CSP)
http 复制代码
Content-Security-Policy:
  default-src 'self';
  script-src 'self' 'unsafe-inline' cdn.example.com;
  img-src *;
  style-src 'self' 'unsafe-inline'
4.4.3 其他安全头
头部字段 说明 示例
X-XSS-Protection XSS 保护 1; mode=block
Referrer-Policy 控制 Referer 信息 no-referrer-when-downgrade
Feature-Policy 控制浏览器功能 geolocation 'none'

4.5 特殊用途头部

4.5.1 下载控制
头部字段 说明 示例
Content-Disposition 内容处置方式 attachment; filename="file.txt"
4.5.2 分块传输
头部字段 说明 示例
Transfer-Encoding 传输编码 chunked
4.5.3 WebSocket
http 复制代码
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==

4.6 最佳实践

4.6.1 API 设计推荐头
http 复制代码
Accept: application/json
Content-Type: application/json
Cache-Control: no-cache
Authorization: Bearer xxxxxx
4.6.2 安全头配置示例
http 复制代码
Strict-Transport-Security: max-age=31536000
Content-Security-Policy: default-src 'self'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
4.6.3 性能优化头
http 复制代码
Cache-Control: public, max-age=3600
Content-Encoding: gzip
ETag: "123456"

五、HTTP 状态码详解

HTTP 状态码分为 5 大类,用于表示请求的处理结果。

5.1. 1xx(信息响应)

状态码 含义 说明
100 Continue 客户端应继续发送请求
101 Switching Protocols 服务器同意切换协议(如 WebSocket)

5.2. 2xx(成功响应)

状态码 含义 说明
200 OK 请求成功
201 Created 资源创建成功
204 No Content 无返回内容(如 DELETE 请求)

5.3. 3xx(重定向)

状态码 含义 说明
301 Moved Permanently 永久重定向
302 Found 临时重定向
304 Not Modified 资源未修改(缓存生效)

5.4. 4xx(客户端错误)

状态码 含义 说明
400 Bad Request 请求格式错误
401 Unauthorized 未认证
403 Forbidden 无权限
404 Not Found 资源不存在

5.5. 5xx(服务器错误)

状态码 含义 说明
500 Internal Server Error 服务器内部错误
502 Bad Gateway 网关错误
503 Service Unavailable 服务不可用

六、预检请求

浏览器会在以下情况发起预检请求(Preflight Request) ,即自动先发送一个 OPTIONS 请求,确认服务器允许实际请求后再发送正式请求:

6.1 触发预检的 3 种条件

  1. 非简单请求方法

    • 使用 PUTDELETECONNECT 等方法(GETPOSTHEAD 不会触发简单请求
  2. 自定义请求头

    • 包含非安全头部(如 AuthorizationX-Custom-Header 等)
  3. 特殊 Content-Type

    • Content-Type 不是以下三种之一:
      • text/plain
      • multipart/form-data
      • application/x-www-form-urlencoded
    • 例如:application/json 会触发预检

6.2 示例场景

javascript 复制代码
// 会触发预检的请求
fetch("https://api.example.com", {
  method: "PUT", // 非简单方法
  headers: {
    "Content-Type": "application/json", // 非简单Content-Type
    "X-Token": "123" // 自定义头部
  }
});

6.3 不会触发预检的简单请求

javascript 复制代码
// 简单请求(不触发预检)
fetch("https://api.example.com", {
  method: "POST",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded" // 简单Content-Type
  }
});

👉点击进入 我的网站

相关推荐
源远流长jerry10 小时前
TCP 性能管理核心:滑动窗口、流量控制与拥塞控制机制解析
运维·服务器·网络
北方的流星10 小时前
华为交换机MSTP和VRRP综合应用配置
运维·网络·华为
源远流长jerry10 小时前
TCP 可靠传输核心:MSS 分段、重传确认与 RTO 定时器解析
网络·网络协议·tcp/ip
2501_9447114311 小时前
理清 https 的加密逻辑
网络协议·http·https
步步为营DotNet11 小时前
深度剖析.NET 中IConfiguration:灵活配置管理的核心枢纽
前端·网络·.net
源远流长jerry11 小时前
TCP 协议深度指南:历史、设计哲学、报文格式与 tcpdump 抓包实战
网络·网络协议·tcp/ip·http·tcpdump
磊 子11 小时前
第五章:运输层
网络·计算机网络·面试·运输层
阿拉伯柠檬12 小时前
传输层协议TCP(三)
linux·网络·网络协议·tcp/ip·面试
松涛和鸣12 小时前
46、线程邮箱系统(C语言+多线程通信)
linux·c语言·网络·网络协议·tcp/ip·html
2501_9159214312 小时前
iOS App 中 SSL Pinning 场景下代理抓包失效的原因
android·网络协议·ios·小程序·uni-app·iphone·ssl