网络协议基础:TCP与UDP对比、多播技术原理、PTP精确时间协议、网络延迟优化基础

做行情系统这些年,我最大的感触就是——网络协议选型,直接决定了你的系统能跑多快。说白了,这就是地基。地基没打好,上层再优化也白搭。

今天咱们聊聊网络协议这块的几个核心点。嗯,我尽量用实战中踩过的坑来帮你理解。

TCP vs UDP:一个稳如老狗,一个快如闪电

先问个问题:你发一条行情数据,是希望它一定到,还是希望它快到?

TCP 和 UDP 的差别,本质上就是这两个目标的取舍。

特性 TCP UDP
连接方式 面向连接(三次握手) 无连接
可靠性 保证送达,自动重传 不保证送达
有序性 保证数据包顺序 不保证顺序
头部开销 20-60 字节 8 字节
延迟 较高(ACK 确认机制) 极低
适用场景 交易指令、订单确认 行情广播、实时数据

我个人习惯,在行情系统中,UDP 是主力。为什么?因为行情数据是“丢了就丢了”的——你想想看,下一秒的行情又来了,你非要重传上一秒的,反而会阻塞后面的数据。

核心原则:TCP 用于“必须到达”的控制流,UDP 用于“越快越好”的数据流。

我在项目中遇到过一件事:某次用 TCP 推行情,结果网络抖动导致 TCP 窗口收缩,所有行情都堵在缓冲区里。等网络恢复,行情已经过期了。从那以后,我坚决把行情推送切到了 UDP。

多播技术原理:一份数据,喂饱所有人

单播就像你挨个给每个人发消息,广播就像你在广场上大喊。多播呢?它只对“订阅了”的人喊。

多播的核心是 IGMP(Internet Group Management Protocol)。客户端加入一个多播组,交换机就知道要把数据复制给谁。

// 多播接收端示例(C语言伪代码)
int sock = socket(AF_INET, SOCK_DGRAM, 0);
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.1"); // 多播组地址
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

这里有个坑:多播地址范围是 224.0.0.0 到 239.255.255.255。但 224.0.0.0/24 是保留的,别乱用。

注意:多播依赖网络设备支持。我曾经在某个机房发现交换机没开 IGMP Snooping,结果多播变成了广播,整个网络都被行情数据淹没了。嗯,那场面……

多播的好处很明显:不管你有 10 个还是 1000 个订阅者,发送端只需要发一份数据。网络层帮你复制。这在行情系统中简直是天赐良机。

PTP精确时间协议:让所有机器对表

做高频交易,时间就是金钱。如果你的机器比交易所慢 1 微秒,你的订单可能就排到后面去了。

NTP 的精度在毫秒级,对于行情系统来说,不够。PTP(IEEE 1588)可以把精度做到亚微秒级。

PTP 的原理其实不复杂:主时钟发一个 Sync 消息,从时钟记录到达时间。然后主时钟再发一个 Follow_Up 消息,告诉从时钟“我刚才发 Sync 的时间是 T1”。从时钟再发 Delay_Req,主时钟回复 Delay_Resp。这样来回一算,延迟和偏移就都出来了。

// PTP 时间同步计算(简化版)
offset = (t2 - t1 - (t4 - t3)) / 2;
delay = (t2 - t1 + (t4 - t3)) / 2;

其中 t1 是主时钟发 Sync 的时间,t2 是从时钟收到 Sync 的时间,t3 是从时钟发 Delay_Req 的时间,t4 是主时钟收到 Delay_Req 的时间。

实战建议:PTP 需要硬件支持。如果你的网卡不支持硬件时间戳,精度会大打折扣。我建议直接上支持 PTP 的专用网卡,比如 Solarflare 或 Mellanox 的。

我记得有一次,我们系统的时间偏差一直在 10 微秒左右波动。查了半天,发现是交换机没配置 PTP 透明时钟。配置完之后,偏差直接降到了 200 纳秒以内。

网络延迟优化基础:从硬件到软件

网络延迟优化,说白了就是让数据包从 A 到 B 的时间尽可能短。我把它分成几个层面:

  • 硬件层面:用万兆甚至 25G/100G 网卡,减少物理传输时间。用低延迟交换机,比如 Arista 或 Cisco Nexus 系列。
  • 驱动层面:用 DPDK(Data Plane Development Kit)绕过内核协议栈。用户态直接操作网卡,省掉中断和上下文切换。
  • 协议层面:用 UDP 代替 TCP,减少 ACK 和重传开销。用多播代替单播,减少发送端负载。
  • 应用层面:用内存映射(mmap)代替 read/write,减少数据拷贝。用零拷贝技术,让数据直接从网卡到应用缓冲区。

一句话总结:延迟优化的本质,就是减少“不必要”的操作。每一次数据拷贝、每一次中断、每一次上下文切换,都是延迟的敌人。

我曾经优化过一个行情系统,从 50 微秒降到了 5 微秒。怎么做到的?其实就是把上面这些点一个一个抠。嗯,没有银弹,只有细节。

极速行情系统网络协议知识体系 TCP vs UDP TCP:可靠、有序、高延迟 UDP:不可靠、无序、低延迟 行情系统首选UDP 多播技术 IGMP协议 组播地址管理 交换机IGMP Snooping PTP精确时间协议 IEEE 1588标准 亚微秒级精度 硬件时间戳支持 延迟优化基础 硬件:万兆网卡 驱动:DPDK 应用:零拷贝 核心目标:在保证数据可用性的前提下,最小化端到端延迟 UDP + 多播 + PTP + DPDK = 极速行情系统的网络基石

好了,这一章的内容就到这里。网络协议这块,说白了就是理解取舍。TCP 和 UDP 的取舍,单播和多播的取舍,精度和成本的取舍。理解了这些,你就能在行情系统的网络层面做出正确的选择。