API 握手实现详解
握手机制
什么是握手?
在网络通信中,”握手”指客户端与服务器建立连接前的协商过程,用于:

- 确认通信协议版本
- 交换初始参数(如加密密钥)
- 验证身份合法性
- 建立数据传输通道
常见场景
| 协议类型 | 应用场景 |
|---|---|
| HTTP | RESTful API 请求 |
| WebSocket | 长连接实时通信 |
| TCP/IP | 底层网络连接建立 |
| SSL/TLS | 安全加密通道协商 |
HTTP API 握手流程
基础流程(3次握手)
sequenceDiagram
Client->>+Server: SYN (发起连接)
Server-->>Client: SYN-ACK (确认连接)
Client->>Server: ACK (完成握手) HTTP 请求握手步骤
| 步骤 | 客户端动作 | 服务器动作 | 协议层 |
|---|---|---|---|
| 1 | 创建 TCP 连接 | 监听端口响应 | TCP 层 |
| 2 | 发送 HTTP 请求头 | 解析请求头 | HTTP 层 |
| 3 | 服务器返回状态码 | 建立会话 | HTTP 层 |
代码示例(Python requests 库)
import requests
# 发起GET请求(自动完成TCP和HTTP握手)
response = requests.get("https://api.example.com/data")
print(response.status_code) # 200 表示握手成功 WebSocket 握手流程
升级流程
- 客户端发送 HTTP 请求,包含
Upgrade: websocket头 - 服务器返回 101 Switching Protocols 状态码
- 切换到 WebSocket 帧协议
关键报文结构
| 字段名 | 客户端到服务器 | 服务器到客户端 |
|---|---|---|
Sec-WebSocket-Key | 随机生成的base64字符串 | 保留原值 |
Sec-WebSocket-Accept | 基于Key计算的MD5哈希 | 必须匹配服务器计算值 |
代码示例(JavaScript)
// 客户端握手
const socket = new WebSocket("wss://echo.websocket.org");
socket.onopen = () => {
console.log("握手成功,状态码:", socket.readyState); // 1 表示已连接
}; 安全握手机制(SSL/TLS)
核心步骤
- 客户端Hello:发送支持的加密算法列表
- 服务器Hello:选择加密算法并发送证书
- 密钥交换:生成会话密钥
- 验证证书:客户端校验服务器证书合法性
证书验证要点
| 检查项 | 说明 |
|---|---|
| 有效期 | 证书是否在有效期内 |
| 签发机构 | 是否为可信CA机构 |
| 域名匹配 | 证书域名与访问地址是否一致 |
| 证书链完整性 | 中间证书是否完整 |
代码示例(Node.js)
const https = require("https");
https.get("https://api.example.com/secure", (res) => {
// 自动验证SSL证书
console.log(res.headers);
}); 常见问题与解决方案
握手失败原因
| 错误类型 | 现象 | 解决方法 |
|---|---|---|
| 证书不匹配 | NET::ERR_CERT_COMMON_NAME_INVALID | 检查DNS配置/证书颁发域 |
| 协议不兼容 | HTTP/1.1 426 Upgrade Required | 强制HTTPS或升级协议版本 |
| 跨域问题 | CORS 错误 | 配置服务器CORS策略 |
性能优化建议
- 复用连接:使用HTTP Keep-Alive或WebSocket长连接
- 异步握手:采用非阻塞IO提升响应速度
- 压缩报文:启用TLS压缩或HTTP/2头部压缩
相关问题与解答
Q1:为什么TCP需要三次握手而不是两次?
A:三次握手确保双方既能发送又能接收数据:
- 第一次握手:客户端确认发送能力
- 第二次握手:服务器确认接收能力和发送能力
- 第三次握手:客户端确认接收能力
两次握手无法保证服务器的接收能力,可能导致”半开放”连接。
Q2:如何检测SSL证书是否被篡改?
A:通过以下方式验证:

- 检查证书哈希值是否与颁发时记录一致
- 验证数字签名是否匹配CA公钥
- 使用OCSP实时查询证书状态
- 浏览器地址栏显示”
小伙伴们,上文介绍了“api 握手实现”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复