暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Tendermint - P2P数据传输细节

星想法 2018-09-11
827

最近发现Tendermint的P2P网络传输的性能比较差,仔细看了看P2P数据传输的细节实现。MConnection是整个数据传输的核心数据结构,在同一个网络链接的基础上抽象出不同的传输通道(Channel)。每个Channel,对应于Tendermint设计中需要网络交互的模块(比如说mempool,consensus等等)。

MConnection,Channel以及网络链接(connection)的组织关系示意如下:

1)数据传输

通过MConnection的Send函数可以向指定的Channel传输数据。这些数据暂存在Channel内部的chan中。暂存完数据后,通过send chan通知sendRoutine:需要数据发送。sendRoutine遍历所有Channel中的数据,把数据进行打包组装成msgPacket(注意msgPacket的payload默认最大是1024字节)。sendRoutine按照Channel的优先级,将不同Channel中的msgPacket发送到Writer中。MConnection中有一个Flush计时器(100ms)。在Flush计时器超时时,调用Writer的Flush函数把数据真正发送到网络。

特别指出的是:sendRoutine有流控设置,发送数据的最大速度默认不超过512KB/s。

2)数据接收

相对于数据传输,数据接收简单一些。recvRoutine不停的从Reader(网络)接收数据,分析出packet的ChannelID和payload,并将payload存储到不同的Channel中。一旦一个Channel接收到数据后,会调用该Channel的回调函数处理数据。 recvRoutine也存在流控设置,接收数据的最大速度默认不超过512KB/s。


文章转载自星想法,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论