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 一张图看懂协议选型

下面这张图,是我自己总结的行情协议选型决策流程。每次做新项目,我都会拿出来对照一下。

行情传输协议选型决策图 行情数据需要传输 是否实时? HTTP/HTTPS 延迟要求? 毫秒级 WebSocket 微秒级 自定义UDP 说明: • HTTP/HTTPS:适合历史数据、盘后查询、低频API • WebSocket:实时行情主力,股票快照、期货Tick、数字货币深度 • 自定义UDP:极速行情场景,需自行处理丢包、乱序、重传 • TCP是基础:WebSocket和HTTP都基于TCP,稳定可靠 • 记住:没有银弹,根据场景选协议

3.6 实战中的协议组合

实际项目中,很少只用一种协议。我做过的一个典型行情系统是这样的:

  • WebSocket:接收实时快照行情,延迟50ms以内
  • UDP组播:接收Level-2逐笔成交,延迟1ms以内
  • HTTP:每天早上拉一次股票列表、除权除息数据
  • TCP长连接:内部数据分发,保证不丢包

你看,不同协议各司其职。关键是要搞清楚:你的场景到底需要多快?能容忍丢包吗?数据量有多大?

我的建议

刚开始做行情接入,别一上来就搞UDP。先用WebSocket跑通,等延迟确实成为瓶颈了,再考虑优化。我见过太多人为了追求极致性能,把系统搞复杂了,结果稳定性反而下降。

记住:先跑通,再优化。

嗯,协议基础就聊到这儿。下一节我们聊聊具体怎么用代码实现行情接入,到时候我会拿真实项目中的代码片段来讲。


专注资料整理