3、网络协议基础:HTTP/HTTPS、WebSocket、TCP/UDP在行情传输中的应用
聊行情传输,绕不开网络协议。
我刚开始做行情接入那会儿,总觉得协议这东西是网络工程师该操心的。直到有一次,我负责的行情程序在开盘瞬间直接卡死——数据量太大,HTTP轮询根本扛不住。嗯,从那以后,我再也不敢小看协议选型了。
3.1 先搞清楚:行情数据到底长什么样?
行情数据有几个特点,决定了它不能用「通用方案」随便搞:
- 高频:A股快照行情每3秒推送一次,期货甚至每秒多次
- 低延迟:量化交易要求微秒级延迟,慢一毫秒可能亏几万
- 数据量大:全市场5000多只股票,每只几十个字段,每秒数据量惊人
- 可靠性要求高:丢一笔数据,你的K线图可能就画错了
说白了,行情传输就是要在「快」和「稳」之间找平衡。不同场景,选不同协议。
3.2 HTTP/HTTPS:最熟悉,但别乱用
HTTP大家都熟。请求-响应模型,简单直观。但用在行情上,有个致命问题——它是「拉」模式。
什么意思?客户端得主动去问服务器:「有数据吗?」服务器才回答:「有,给你。」
你想想看,如果每秒问一次,延迟就是1秒。如果每秒问10次,服务器压力大,而且大部分请求都是空响应——浪费带宽。
适用场景:
- 盘后数据查询(历史K线、财务数据)
- 非实时行情(比如日终结算价)
- 低频API调用(比如每分钟查一次指数)
我个人习惯,HTTP只用来拿「不着急」的数据。比如每天早上开盘前,用HTTP拉一次全市场股票列表。实时行情?别用HTTP,会出事。
避坑指南:我曾经见过一个团队,用HTTPS轮询做实时行情,结果开盘瞬间并发请求把服务器打挂了。HTTPS的TLS握手本身就有开销,高频轮询简直是灾难。记住:实时行情别用HTTP/HTTPS做推送。
3.3 WebSocket:实时行情的「主力军」
WebSocket解决了HTTP的核心痛点——它是「推」模式。
客户端和服务器建立一条长连接,服务器有数据就直接推过来。客户端不用问,数据自己来。
为什么适合行情?
- 全双工通信:服务器可以随时推送,延迟低
- 头部开销小:建立连接后,数据传输只需要少量帧头,比HTTP省带宽
- 支持二进制:可以直接传Protobuf编码的行情数据,解析快
我建议,大部分行情接入场景优先考虑WebSocket。尤其是股票快照、期货Tick、数字货币深度数据,WebSocket几乎是标配。
实战经验:我在做某券商行情网关时,WebSocket连接数一度达到10万+。要注意几个点:
- 心跳机制必须做,防止连接假死
- 重连策略要带指数退避,别一断就连,把服务器冲垮
- 数据压缩建议用gzip或snappy,能省30%-50%带宽
// WebSocket行情订阅示例(伪代码)
ws = new WebSocket("wss://quote.example.com/market")
ws.onopen = function() {
// 订阅股票代码
ws.send(JSON.stringify({
"action": "subscribe",
"codes": ["000001.SZ", "600036.SH"]
}))
}
ws.onmessage = function(data) {
// 解析行情数据
quote = parseQuote(data)
updateUI(quote)
}
3.4 TCP vs UDP:底层协议的抉择
WebSocket和HTTP都是应用层协议,底层跑的是TCP或UDP。那TCP和UDP本身在行情传输中怎么选?
| 特性 | TCP | UDP |
|---|---|---|
| 可靠性 | 保证不丢包、有序 | 不保证,可能丢包乱序 |
| 延迟 | 较高(重传、拥塞控制) | 极低(无确认机制) |
| 适用场景 | WebSocket、HTTP、FTP | 实时音视频、游戏、部分行情 |
| 行情应用 | 大部分行情API | 极速行情、Level-2深度 |
说白了,TCP稳但慢,UDP快但可能丢。行情传输怎么选?
我个人经验:
- 90%的场景用TCP:WebSocket、HTTP都基于TCP,够用
- 极速场景用UDP:比如期货公司的CTP极速行情,延迟要求微秒级,TCP的拥塞控制反而成了瓶颈
- UDP要自己处理丢包:如果选UDP,必须在应用层做序列号、重传、去重逻辑
核心结论:
- 普通行情接入 → WebSocket(基于TCP)
- 历史数据查询 → HTTP/HTTPS
- 极速行情(微秒级) → 自定义UDP协议
3.5 一张图看懂协议选型
下面这张图,是我自己总结的行情协议选型决策流程。每次做新项目,我都会拿出来对照一下。
3.6 实战中的协议组合
实际项目中,很少只用一种协议。我做过的一个典型行情系统是这样的:
- WebSocket:接收实时快照行情,延迟50ms以内
- UDP组播:接收Level-2逐笔成交,延迟1ms以内
- HTTP:每天早上拉一次股票列表、除权除息数据
- TCP长连接:内部数据分发,保证不丢包
你看,不同协议各司其职。关键是要搞清楚:你的场景到底需要多快?能容忍丢包吗?数据量有多大?
我的建议:
刚开始做行情接入,别一上来就搞UDP。先用WebSocket跑通,等延迟确实成为瓶颈了,再考虑优化。我见过太多人为了追求极致性能,把系统搞复杂了,结果稳定性反而下降。
记住:先跑通,再优化。
嗯,协议基础就聊到这儿。下一节我们聊聊具体怎么用代码实现行情接入,到时候我会拿真实项目中的代码片段来讲。