网络编程 – HTTP/HTTPS协议详解
HTTP协议概述
HTTP(HyperText Transfer Protocol,超文本传输协议)是Web通信的基础协议,它定义了客户端(如Web浏览器)与服务器之间的请求-响应通信格式和规则。HTTP基于TCP/IP协议栈,其中HTTP1.0、HTTP1.1、HTTP2.0都是基于TCP实现,HTTP3.0则基于UDP实现。
HTTP协议的核心作用是传输数据,包括HTML文档、图片、视频、JSON等多种格式。它采用客户端-服务器模型,通过统一资源标识符(URL)定位和访问网络资源。
HTTP协议的工作过程
当我们在浏览器中输入一个URL并按下回车时,浏览器会向该URL对应的服务器发送一个HTTP请求。服务器收到请求后,会根据请求的URL和方法,执行相应的操作,并返回一个HTTP响应。
什么是URL
URL(Uniform Resource Locator,统一资源定位符)是互联网上资源的地址,用于定位和访问网络上的资源。它由多个部分组成,格式为:
协议://主机名[:端口号]/路径[?查询字符串][#锚点]
示例:
https://www.wikipedia.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types?version=20251219#常见的MIME类型
└─────┘└────────────────┘└────────────────────────────────────────────┘└────────────────┘└────────────┘
协议 主机名 路径 查询参数 锚点
示例:https://
定义:规定客户端与服务器通信的规则,常见协议包括:
- http://(超文本传输协议,不安全)
- https://(加密的 HTTP 协议,默认端口 443)
- ftp://(文件传输协议)
作用:
- 决定数据传输的安全性(如 HTTPS 用于在线支付)。
- 浏览器根据协议选择对应的解析方式(如 HTTP 解析网页,FTP 下载文件)。
示例:www.wikipedia.org
定义:标识资源所在的服务器,通常由三部分组成:
- 子域名:www(万维网服务,可替换为blog、api等)。
- 主域名:wikipedia(网站核心标识)。
- 顶级域名(TLD):.org(非营利组织,其他如.com、.cn)。
补充:
- 主机名可直接使用 IP 地址(如192.168.1.1),但域名更易记忆。
- 子域名可用于区分业务模块(如api.example.com用于接口服务)。
- 主机名后面的端口号(如:8080)可选,默认端口为80(HTTP)或443(HTTPS)。
示例:/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types
定义:资源在服务器上的具体位置,类似文件系统的目录结构。
结构解析:
- /zh-CN:语言版本(中文)。
- /docs/Web/HTTP:文档分类(Web 技术 → HTTP 协议)。
- /Basics_of_HTTP/MIME_types:具体文档名称。
作用:
- 帮助服务器定位资源(如 HTML 文件、API 接口)。
- 设计清晰的路径可提升 SEO(如使用关键词而非随机字符)。
示例:?version=20251219
定义:以?开头的键值对,用于向服务器传递附加信息。
解析:
- version=20251219:请求文档的 2025 年 12 月 19 日版本。
扩展场景:
- 电商搜索:?q=羽绒服&sort=sale-desc(关键词 “羽绒服”,按销量降序)。
- 分页参数:?page=2(获取第二页结果)。 编码规则:
- 非 ASCII 字符需 URL 编码(如 “人工智能”→%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD)。
- 保留字符(如&、=)需转义(&→%26,=→%3D)。
示例:#常见的MIME类型
定义:以#开头的标识符,用于定位页面内的特定位置。
作用:
- 直接跳转到文档中的某个标题(如 HTML 元素的id=“常见的MIME类型”)。
- 锚点不会发送到服务器,仅在客户端生效。
扩展特性:
- 文本片段(Text Fragments):#:~:text=MIME%E7%B1%BB%E5%9E%8B%E7%9A%84%E6%A0%BC%E5%BC%8F%E4%B8%BA可高亮显示包含 “MIME 类型的格式为” 的段落。
- 移动端适配:锚点常用于单页应用(SPA)的路由切换(如 React Router)。
HTTP请求结构
HTTP请求是客户端向服务器发送的请求消息,由请求行、请求头和请求体三部分组成,格式遵循严格规范,确保客户端和服务器能正确解析和处理。

请求行
请求行是HTTP请求的第一行,包含三个字段:请求方法、URL和HTTP版本,它们之间用空格分隔,行末以CRLF(\\r\\n)结束。格式为:
请求方法 URL HTTP版本\\r\\n
示例:
GET /index.html HTTP/1.1\\r\\n
- 请求方法:定义了客户端对服务器资源的操作类型,如GET、POST、PUT、DELETE等
- URL:统一资源定位符,指定了请求的资源路径
- HTTP版本:表示客户端使用的HTTP协议版本,如HTTP/1.1、HTTP/2等
请求头
请求头由多个字段组成,每个字段包含名称和值,格式为字段名: 值,行末以CRLF(\\r\\n)结束。请求头提供了客户端的相关信息、请求的附加条件以及客户端的偏好设置。
常见请求头及其详细说明:
| Host | 指定请求的主机名和端口号,用于虚拟主机配置 | Host: www.example.com:8080 |
| User-Agent | 客户端的浏览器信息和操作系统信息 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 |
| Accept | 客户端能接受的媒体类型,按优先级排序 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 |
| Accept-Language | 客户端能接受的语言,按优先级排序 | Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 |
| Accept-Encoding | 客户端能接受的编码方式,如gzip、deflate等 | Accept-Encoding: gzip, deflate, br |
| Referer | 包含当前请求页面的来源URL,用于追踪流量来源 | Referer: https://www.google.com/ |
| Cookie | 客户端保存的Cookie信息,用于保持会话状态 | Cookie: session_id=abc123; user_id=456 |
| Content-Type | 请求体的媒体类型,用于POST、PUT等方法 | Content-Type: application/json |
| Content-Length | 请求体的长度,单位为字节 | Content-Length: 128 |
| Connection | 控制连接的持久性,如Keep-Alive表示持久连接 | Connection: Keep-Alive |
| Authorization | 用于身份认证,如Basic认证或Bearer令牌 | Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9… |
| Cache-Control | 控制请求的缓存行为 | Cache-Control: no-cache, no-store |
| Origin | 表示请求的来源站点,用于CORS(跨域资源共享) | Origin: https://www.example.com |
| If-None-Match | 与ETag配合使用,用于缓存验证 | If-None-Match: "abc123" |
| If-Modified-Since | 与Last-Modified配合使用,用于缓存验证 | If-Modified-Since: Tue, 15 Nov 2022 12:45:26 GMT |
请求体
请求体包含客户端要发送给服务器的数据,通常用于POST、PUT、PATCH等方法。请求体的格式由Content-Type头字段指定,常见的格式包括:
- application/x-www-form-urlencoded:表单数据,如key1=value1&key2=value2
- multipart/form-data:用于文件上传,支持二进制数据
- application/json:JSON格式的数据,如{"name": "test", "value": "123"}
- text/plain:纯文本数据
- application/xml:XML格式的数据
请求体与请求头之间用一个空行(CRLF)分隔,示例:
POST /api/users HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 33
{"name": "test", "email": "test@example.com"}
HTTP响应结构
服务器接收到HTTP请求后,会返回HTTP响应,同样由状态行、响应头和响应体三部分组成。

状态行
状态行包含HTTP版本、状态码和状态描述,格式为:
HTTP版本 状态码 状态描述
示例:
HTTP/1.1 200 OK
响应头
响应头包含服务器的相关信息,每个头字段由名称和值组成,格式与请求头相同。
常见响应头:
- Server:服务器的名称和版本
- Date:响应的日期和时间
- Content-Type:响应体的媒体类型
- Content-Length:响应体的长度
- Content-Encoding:响应体的编码方式
- Set-Cookie:服务器设置的Cookie信息
- Cache-Control:缓存控制策略
- Expires:响应的过期时间
- Last-Modified:资源的最后修改时间
- ETag:资源的实体标签
响应体
响应体包含服务器返回给客户端的数据,通常是HTML、JSON、XML等格式。
HTTP方法
HTTP定义了多种请求方法,用于指定客户端对服务器资源的操作类型。
| GET | 请求获取资源 | 安全 | 幂等 |
| POST | 向服务器提交数据,创建资源 | 不安全 | 非幂等 |
| PUT | 向服务器提交数据,更新资源 | 不安全 | 幂等 |
| DELETE | 请求删除资源 | 不安全 | 幂等 |
| HEAD | 只请求资源的头部信息 | 安全 | 幂等 |
| OPTIONS | 请求服务器支持的HTTP方法 | 安全 | 幂等 |
| PATCH | 部分更新资源 | 不安全 | 非幂等 |
| CONNECT | 建立隧道连接,用于HTTPS | 安全 | 幂等 |
| TRACE | 回显服务器收到的请求,用于诊断 | 安全 | 幂等 |
- 安全:不会修改服务器资源的方法
- 幂等:多次执行相同的请求,结果相同的方法
HTTP的主要特点
HTTP协议具有以下核心特点:
- 请求-响应模型:客户端发送请求,服务器返回响应,通信是单向的
- 无状态性:服务器不保存客户端的状态信息,每个请求都是独立的(通过Cookie、Session等机制可实现状态管理)
- 灵活的数据类型:支持传输任意类型的数据,通过Content-Type头字段标识数据类型
- 可扩展性:可以通过自定义头字段和方法扩展来支持新功能
- 连接管理:
- HTTP/1.0:短连接,每个请求建立新的TCP连接
- HTTP/1.1:引入持久连接(Keep-Alive),允许在一个TCP连接上发送多个请求
- HTTP/2:支持多路复用,在单个TCP连接上并行处理多个请求
- 简单易用:报文格式清晰,易于理解和实现
HTTP状态码
HTTP状态码用于表示服务器对请求的处理结果,分为5个类别:
1xx(信息性状态码)
- 100 Continue:服务器已收到请求头,客户端可以继续发送请求体
- 101 Switching Protocols:服务器同意切换协议
2xx(成功状态码)
- 200 OK:请求成功
- 201 Created:资源创建成功
- 202 Accepted:请求已接受,但尚未处理完成
- 204 No Content:请求成功,但没有响应体
- 206 Partial Content:部分内容请求成功
3xx(重定向状态码)
- 301 Moved Permanently:资源永久移动到新位置
- 302 Found:资源临时移动到新位置
- 303 See Other:重定向到其他资源,使用GET方法获取
- 304 Not Modified:资源未修改,使用缓存
- 307 Temporary Redirect:临时重定向,保持原请求方法
- 308 Permanent Redirect:永久重定向,保持原请求方法
4xx(客户端错误状态码)
- 400 Bad Request:请求语法错误
- 401 Unauthorized:未授权,需要身份验证
- 403 Forbidden:禁止访问该资源
- 404 Not Found:资源不存在
- 405 Method Not Allowed:请求方法不被允许
- 406 Not Acceptable:无法生成客户端可接受的响应
- 408 Request Timeout:请求超时
- 409 Conflict:请求与服务器资源冲突
- 413 Payload Too Large:请求体过大
- 414 URI Too Long:请求URI过长
- 415 Unsupported Media Type:不支持的媒体类型
- 429 Too Many Requests:请求次数过多
5xx(服务器错误状态码)
- 500 Internal Server Error:服务器内部错误
- 501 Not Implemented:服务器不支持该请求方法
- 502 Bad Gateway:网关错误
- 503 Service Unavailable:服务器暂时不可用
- 504 Gateway Timeout:网关超时
- 505 HTTP Version Not Supported:不支持的HTTP版本
HTTP协议虽然简单高效,但由于其明文传输的特性,在安全性方面存在明显不足。为了解决这一问题,HTTPS协议应运而生。
HTTPS协议概述
HTTPS(HyperText Transfer Protocol Secure,超文本传输安全协议)是HTTP的安全版本,通过SSL/TLS协议对HTTP通信进行加密和认证。
HTTPS的主要特点
- 安全性:使用SSL/TLS协议对通信进行加密和认证,防止数据窃听和篡改
- 可靠性:验证服务器的身份,防止中间人攻击
- 完整性:确保数据在传输过程中不被篡改
- 兼容性:基于HTTP协议,与HTTP协议兼容
- 性能:由于加密和解密过程,性能略低于HTTP
HTTPS的工作原理

HTTPS通过SSL/TLS协议实现安全通信,主要包括以下步骤:
SSL/TLS握手过程

SSL/TLS握手是HTTPS建立安全连接的关键过程,主要包括以下步骤:
HTTP与HTTPS对比
HTTP和HTTPS是Web通信的两种核心协议,它们在安全性、性能和使用场景上存在显著差异。以下是两者的详细对比:
| 安全性 | 明文传输,不安全 | 加密传输,安全 | HTTP使用明文传输数据,容易被窃听和篡改;HTTPS通过SSL/TLS加密数据,提供端到端安全保障 |
| 默认端口 | 80 | 443 | HTTP默认使用80端口,HTTPS默认使用443端口 |
| 协议基础 | 基于TCP/IP | 基于TCP/IP + SSL/TLS | HTTPS是在HTTP基础上添加了SSL/TLS加密层 |
| 证书要求 | 不需要 | 需要数字证书 | HTTPS服务器需要安装由可信CA签发的数字证书,用于身份认证 |
| 性能 | 高 | 略低(加密解密开销) | HTTPS的加密解密过程会带来一定性能开销,但现代优化已将影响降至最低 |
| 资源消耗 | 低 | 高(CPU和内存开销) | HTTPS需要更多的CPU资源进行加密解密运算 |
| 搜索引擎排名 | 无特殊优势 | 有明显优势 | 搜索引擎(如Google)优先收录HTTPS网站,并给予更高排名 |
| 浏览器标识 | 显示"http://",无特殊标识 | 显示"https://"和安全锁图标 | 浏览器通过不同的标识帮助用户识别网站的安全状态 |
| 数据完整性 | 无保障 | 有保障 | HTTPS通过MAC或哈希算法确保数据完整性,防止数据被篡改 |
| 身份认证 | 无 | 有 | HTTPS通过数字证书验证服务器身份,防止中间人攻击 |
| 部署成本 | 低 | 高 | HTTPS需要购买和管理数字证书,增加了部署成本 |
| 适用场景 | 非敏感数据传输 | 敏感数据传输 | HTTP适用于静态资源访问等非敏感场景;HTTPS适用于登录、支付、个人信息等敏感场景 |
HTTP版本演进
HTTP协议经历了多次版本迭代,每一次演进都带来了性能和功能的提升:
HTTP/0.9 – 简单的文本传输协议
- 发布于1991年,是HTTP的最初版本
- 只支持GET方法,用于获取HTML文档
- 无版本号,无请求头和响应头
- 响应只包含HTML内容,没有其他类型的数据
HTTP/1.0 – 功能扩展
- 发布于1996年(RFC 1945)
- 引入了版本号、请求头和响应头
- 支持多种HTTP方法(GET、POST、HEAD)
- 支持多种数据类型(HTML、图片、视频等)
- 采用短连接,每个请求都需要建立新的TCP连接
HTTP/1.1 – 持久连接和管道化
- 发布于1999年(RFC 2616),是目前使用最广泛的HTTP版本
- 引入了持久连接(Keep-Alive),允许在一个TCP连接上发送多个请求
- 支持管道化(Pipelining),允许客户端在收到前一个响应前发送多个请求
- 支持虚拟主机(Host头字段),允许一个服务器托管多个域名
- 支持分块传输编码(Chunked Transfer Encoding),允许服务器分块发送响应
- 引入了更多HTTP方法(PUT、DELETE、OPTIONS、TRACE、CONNECT)
- 改进了缓存机制,增加了缓存控制头字段
HTTP/2 – 二进制分帧和多路复用
- 发布于2015年(RFC 7540)
- 基于二进制分帧,取代了HTTP/1.x的文本格式,提高了传输效率和解析速度
- 多路复用:通过将每个请求-响应拆分为独立的二进制帧,在单个TCP连接上并行处理多个请求-响应,解决了HTTP/1.1中的队头阻塞问题
- 服务器推送(Server Push):允许服务器主动向客户端推送资源,无需客户端请求,减少了请求延迟
- 头部压缩:使用HPACK算法压缩HTTP头部,减少重复头部数据的传输量
- 请求优先级:允许客户端指定请求的优先级,服务器可根据优先级调整响应顺序
HTTP/3 – 基于QUIC的新一代协议
- 发布于2022年(RFC 9113)
- 基于QUIC协议:基于UDP协议实现,解决了TCP协议的队头阻塞问题,同时保留了TCP的可靠性
- 0-RTT连接建立:允许客户端在第一次连接时就发送请求数据,减少了连接建立延迟
- 连接迁移:支持客户端在网络切换(如Wi-Fi到移动网络)时保持连接,无需重新建立连接
- 更高效的拥塞控制:采用BBR等现代拥塞控制算法,提高了在高延迟、高丢包网络环境下的性能
- 保持HTTP/2特性:保留了HTTP/2的多路复用、头部压缩等核心特性
HTTP版本的演进反映了Web应用对性能、安全性和功能的不断追求。从HTTP/1.1到HTTP/2再到HTTP/3,每一次版本升级都带来了显著的性能提升,尤其是在高并发场景下。
HTTP常见应用场景
- Web浏览:浏览器与Web服务器之间的通信
- API服务:RESTful API、GraphQL API等
- 文件下载:通过HTTP协议下载文件
- 表单提交:用户通过表单提交数据
- Cookie和Session管理:用户身份认证和状态管理
- 缓存机制:提高网页加载速度
HTTP编程示例(Python)
使用requests库发送HTTP请求
import requests
# 发送GET请求
response = requests.get('https://www.example.com')
print(f"状态码:{response.status_code}")
print(f"响应头:{response.headers}")
print(f"响应体:{response.text}")
# 发送带参数的GET请求
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://www.example.com/get', params=params)
print(f"请求URL:{response.url}")
# 发送POST请求
headers = {'Content-Type': 'application/json'}
data = {'name': 'test', 'value': '123'}
response = requests.post('https://www.example.com/post', json=data, headers=headers)
# 发送带Cookie的请求
cookies = {'session_id': '123456'}
response = requests.get('https://www.example.com', cookies=cookies)
# 发送带认证的请求
response = requests.get('https://www.example.com', auth=('username', 'password'))
使用http.server模块创建简单的HTTP服务器
from http.server import HTTPServer, BaseHTTPRequestHandler
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b'<html><body><h1>Hello, World!</h1></body></html>')
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
self.wfile.write(b'Received POST data: ' + post_data)
def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f'Starting HTTP server on port {port}…')
httpd.serve_forever()
if __name__ == '__main__':
run()
网硕互联帮助中心






评论前必须登录!
注册