第二章:网络协议基础——TCP/IP协议栈回顾、UDP与TCP的选择、组播技术原理
各位同学好,我是老张。今天咱们聊聊行情快照系统最底层的支撑——网络协议。说实话,很多做量化的人把精力都花在策略上,忽略了网络层。但我见过太多人,策略写得漂亮,一到实盘就卡在数据接收上。嗯,这章咱们就把地基打牢。
2.1 TCP/IP协议栈回顾——你每天都在用,但未必真懂
先快速过一遍TCP/IP协议栈。说白了,它就是一套让不同设备能互相通信的规则。从上到下分四层:应用层、传输层、网络层、网络接口层。
我习惯把协议栈比作寄快递:
- 应用层:你填写的快递单(HTTP、FTP、WebSocket等)
- 传输层:快递公司的运输方案(TCP可靠但慢,UDP快但可能丢件)
- 网络层:快递分拣中心的路由规划(IP协议负责寻址)
- 网络接口层:快递员实际送货的交通工具(以太网、Wi-Fi等)
做行情系统时,我们最关心的是传输层。为什么?因为交易所的行情数据对时效性要求极高,而传输层的选择直接决定了你能多快拿到数据。
核心要点:行情快照系统通常跳过应用层,直接在传输层做文章。很多交易所的行情协议都是基于UDP或组播的,目的就是减少协议栈开销。
2.2 UDP与TCP的选择——快还是稳,这是个问题
TCP和UDP的区别,老生常谈了。但我还是想用实战经验来讲。
TCP:面向连接、可靠、有序。你想想看,它要三次握手建立连接,数据丢了还要重传,接收方还要确认。这一套下来,延迟就上去了。我在项目中遇到过,用TCP接收行情,高峰期延迟能到几十毫秒。对于高频交易来说,这简直是灾难。
UDP:无连接、不可靠、无序。发出去就不管了,速度快得飞起。但问题来了——丢包怎么办?行情数据丢了,你拿到的快照就不完整。
那到底怎么选?我个人的经验是:
| 场景 | 推荐协议 | 原因 |
|---|---|---|
| 历史行情回放 | TCP | 数据完整性优先,延迟不敏感 |
| 实时行情快照 | UDP | 低延迟优先,允许少量丢包 |
| 订单簿增量更新 | UDP + 序列号校验 | 快且能检测丢包,必要时请求重传 |
| 交易指令发送 | TCP | 必须可靠,不能丢单 |
我的小技巧:做行情系统时,我习惯用UDP接收快照,但每个数据包带一个递增的序列号。接收端检测到序列号不连续,就知道丢包了,然后通过一个单独的TCP通道请求重传。这样既保证了速度,又解决了可靠性问题。
2.3 组播(Multicast)技术原理——交易所的“广播神器”
好了,重点来了。为什么交易所都用组播?
你想想看,一个交易所可能有上千个用户同时订阅行情。如果用单播(Unicast),交易所要给每个用户单独发一份数据。服务器压力大,网络带宽也扛不住。如果用广播(Broadcast),数据会发给所有人,包括那些不需要的人,浪费资源。
组播就不一样了。它像是一个“订阅-发布”模式:
- 交易所把数据发到一个组播地址(比如 233.0.0.1:8888)
- 只有订阅了这个地址的用户才能收到数据
- 网络设备(路由器、交换机)会自动复制数据包,只发给有需要的端口
我曾经在搭建行情系统时,第一次用组播就踩了坑。交换机没配置IGMP Snooping,结果组播流量变成了广播,整个网络都堵了。嗯,这个教训挺深刻的。
组播的核心组件
- 组播组地址:D类IP地址(224.0.0.0 ~ 239.255.255.255),用于标识一个组播会话
- IGMP协议:主机用来告诉路由器“我要加入这个组”
- 组播路由协议:PIM、DVMRP等,负责在路由器之间传递组播流量
组播在行情系统中的应用
大多数交易所的行情快照都走组播。比如:
- 上交所的行情系统使用UDP组播
- 深交所的行情系统也基于组播
- 一些期货交易所同样采用组播方案
为什么?因为组播能做到“一次发送,多点接收”,网络效率极高。而且组播基于UDP,延迟很低。
避坑指南:我曾经在项目中遇到组播丢包严重的问题。排查后发现是交换机的组播流量限速没调好。记住,组播虽然高效,但网络设备需要正确配置。IGMP Snooping、组播组管理、流量整形,一个都不能少。
2.4 本章知识体系总览
下面这张图是我自己画的,把本章的核心逻辑串起来了。你看一眼就能明白:
从这张图你能看到,我们的核心路径是:协议栈 → 传输层选择(TCP vs UDP)→ 组播技术 → 具体应用场景。每一步都有明确的取舍和考量。
2.5 实战中的一些碎碎念
最后,我想分享几个实战中的小经验:
- 别迷信“UDP一定比TCP快”。在局域网环境下,两者差距不大。但跨网络、跨机房时,UDP的优势就出来了。
- 组播地址别乱用。224.0.0.0 ~ 224.0.0.255是保留地址,用于路由协议。建议用233.0.0.0/8这个范围的地址,这是专门给用户用的。
- 一定要做丢包检测。不管用UDP还是组播,都要在应用层做序列号校验。我见过有人裸用UDP,数据丢了都不知道。
- 网络设备配置要提前测试。交换机、路由器的组播相关配置(IGMP、PIM、流量整形)一定要在开发环境验证过,别等到上线才发现。
一句话总结:行情快照系统选UDP组播,不是因为它完美,而是因为它最适合。速度快、效率高、可扩展。代价是你要自己处理丢包和乱序。但做量化嘛,本来就是和不确定性打交道。
好了,这章就到这里。下一章咱们会深入组播的编程实现,手写一个组播接收器。到时候你会看到,代码其实没几行,但背后的原理很重要。
公众号:蓝海资料掘金营,微信deep3321