把话挑明了说, 在区块链节点之间进行数据传递的进程中, 存在于众多底层协议之中的是UDP这一种网络传输协议。当一个新的区块被生成之际, 该系统需要同步向数百个节点推送信息, 倘若采用TCP那样的包含握手确认步骤的方案的话, 光是处理排队这一件事情就足以使人耗费大量的时间与精力了。

至于UDP这种协议则是不去关心数据包是否最终送达这一结果的, 只要数据被发送出去之后便立即完成当前的任务, 这种机制具有速度快的一面属性, 但与此同时也会带来丢失数据包的情况发生并且这部分损失需要由发送方自行承担。

搞区块链P2P通信,UDP跟TCP到底啥区别?给你掰扯明白

以太坊的devp2p以及IPFS的libp2p, 在早期的时候主要采用的是TCP协议。后来QUIC还有UDP打洞技术被搞起来了, 这就把延迟给压下去了。那么代价是什么?

代价就是要在应用层自己进行重传和排序。UDP把可靠性全甩给你了, 但是节点的数据是不能缺失的。所以现在实际运行的,其实是类似"UDP加上自研确认”这样的混搭方案。

我经历过一个因为坑而导致的情况, 就是节点是跨越不同运营商的, 结果UDP数据包包在经过中间设备的时候被QoS机制给降低了优先级, 这样一来丢包的数量就一下子冲高到了七八个百分点那么高, 最后只能被迫硬生生地塞进去一条TCP通道作为备用手段在使用。

不要只是看着文档上写明了“支持UDP”这几个字就觉得可以完全没事了, 实际的网络环境才是真正说了算的那个老板, 最终的决定权还是在它那里握着。