上一篇
http协议网络编程
- 行业动态
- 2025-04-30
- 2624
HTTP协议基于请求-响应模型,通过Socket实现客户端与服务器间的通信,依赖TCP/IP协议栈
HTTP协议网络编程详解
HTTP基础
HTTP(HyperText Transfer Protocol)是应用层协议,基于TCP/IP,用于客户端与服务器之间的超媒体传输,核心特点:
- 无状态:每个请求独立,服务器不保存上下文。
- 请求-响应模型:客户端发起请求,服务器返回响应。
- 文本协议:报文为纯文本格式,可读性强。
- 版本差异:HTTP/1.0(无持久连接)、HTTP/1.1(默认持久连接)、HTTP/2(多路复用)。
HTTP请求/响应报文结构
请求报文
组成部分 | 说明 |
---|---|
请求行 | 方法 URL 版本 (如:GET /index.html HTTP/1.1 ) |
请求头 | 键值对(如:Host: example.com 、User-Agent: Chrome ) |
空行 | 分隔头部与请求体(` |
`) | |
请求体 | 携带数据(如:POST表单数据) |
响应报文
组成部分 | 说明 |
---|---|
状态行 | 版本 状态码 原因短语 (如:HTTP/1.1 200 OK ) |
响应头 | 键值对(如:Content-Type: text/html ) |
空行 | 分隔头部与响应体(` |
`) | |
响应体 | 返回的数据(如:HTML页面) |
常用HTTP请求方法
方法 | 用途 | 是否安全 | 是否幂等 |
---|---|---|---|
GET | 获取资源 | 安全(无副作用) | 是(多次执行结果相同) |
POST | 提交数据 | 非安全 | 否(会新增资源) |
PUT | 更新资源 | 非安全 | 是(覆盖资源) |
DELETE | 删除资源 | 非安全 | 是(多次删除结果相同) |
HEAD | 获取资源元信息 | 安全 | 是 |
HTTP状态码分类
类别 | 范围 | 含义 | 示例 |
---|---|---|---|
1xx | 100-199 | 信息响应 | 101 Switching Protocols |
2xx | 200-299 | 成功 | 200 OK、201 Created |
3xx | 300-399 | 重定向 | 301 Moved Permanently、302 Found |
4xx | 400-499 | 客户端错误 | 400 Bad Request、404 Not Found |
5xx | 500-599 | 服务器错误 | 500 Internal Server Error、503 Service Unavailable |
HTTP头部字段
通用头部
字段 | 说明 |
---|---|
Date | 报文创建时间 |
Via | 代理服务器信息 |
Cache-Control | 缓存策略 |
请求头
字段 | 说明 |
---|---|
Host | 目标服务器域名(必需) |
User-Agent | 客户端信息 |
Accept | 支持的响应内容类型 |
Content-Type | 请求体MIME类型(POST时必需) |
响应头
字段 | 说明 |
---|---|
Content-Type | 响应体MIME类型 |
Content-Length | 响应体长度 |
Set-Cookie | 设置Cookie |
HTTP网络编程实践
Python示例(使用requests
库)
import requests # 发送GET请求 response = requests.get("https://example.com") print(response.status_code) # 输出状态码 print(response.text) # 输出响应体 # 发送POST请求 data = {"username": "test", "password": "123"} response = requests.post("https://example.com/login", data=data) print(response.json()) # 解析JSON响应体
Java示例(使用HttpURLConnection
)
import java.net.HttpURLConnection; import java.net.URL; URL url = new URL("https://example.com"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); int responseCode = conn.getResponseCode(); // 获取状态码 String response = new String(conn.getInputStream().readAllBytes()); // 读取响应体
持久连接与管道化
HTTP/1.0:默认关闭连接,每次请求需重新建立TCP连接。
HTTP/1.1:默认持久连接(
Connection: keep-alive
),可复用同一连接发送多个请求。管道化(Pipelining):在持久连接中连续发送多个请求,无需等待前一个响应。
GET /a HTTP/1.1 Host: example.com GET /b HTTP/1.1 Host: example.com
Cookie与Session管理
- Cookie:服务器通过
Set-Cookie
头设置,客户端自动携带。- 例:
Set-Cookie: sessionid=abc123; Expires=Wed, 01 Jan 2024 00:00:00 GMT
- 例:
- Session:通过Cookie或URL重写(如
JSESSIONID
)标识会话。 - 常见属性:
Expires
/Max-Age
:过期时间。Secure
:仅HTTPS传输。HttpOnly
:禁止JavaScript访问。
HTTPS与安全
- HTTPS:HTTP + SSL/TLS加密,默认端口443。
- 工作流程:
- 客户端发送
ClientHello
请求证书。 - 服务器返回公钥证书。
- 客户端验证证书并生成对称密钥,用公钥加密后发送。
- 双方使用对称密钥加密通信。
- 客户端发送
- 安全增强:
HSTS
:强制HTTPS连接。CSP
:限制资源加载来源。
相关问题与解答
问题1:GET和POST方法的核心区别是什么?
解答:
| 对比项 | GET | POST |
|——————|—————————-|——————————|
| 参数位置 | URL中(?key=value
) | 请求体中(body
) |
| 安全性 | 敏感数据暴露在URL中 | 相对安全(但仍需加密) |
| 幂等性 | 是(多次执行结果相同) | 否(可能新增资源) |
| 缓存性 | 可缓存(浏览器可能缓存) | 通常不缓存 |
| 长度限制 | URL长度受限(约2048字符) | 无限制(依赖服务器配置) |
问题2:HTTP状态码301和302有什么区别?
解答:
| 状态码 | 含义 | 行为 |
|————|——————————|——————————|
| 301 | 永久重定向 | 浏览器会跳转并缓存新地址,后续直接访问新地址。 |
| 302 | 临时重定向 | 浏览器仅跳转一次,仍使用原地址。 |
- 示例:
- 301:网站永久迁移(如
example.com → www.example.com
)。 - 302:临时活动跳转(如
- 301:网站永久迁移(如