比特币P2P网络IP分布

最近看了几天的bitcoin的代码,主要从网络通信部分着手开始看的,对于一个三年多没有写过C++代码的人来说,看其中的消息序列化反序列化代码,只有一句卧艹感叹,遂拾起多年未写过的C++,来写点东西。

既然是看到了比特币的P2P网络,何不把这个网络上的IP全部搞下来,看看这些IP都分布在哪里,于是查看了下比特币的网络通信协议:两个节点建立连接后,发起连接者发送version命令,接受者响应verack命令并发送version命令,发起者响应verack命令,如下图:

20180512170431878.png

如果把verackversion画在一起,就和TCP的三步握手一样了。交换完这几个协议命令之后,两个节点的连接就完全建立好了,可以发送其他的一些协议命令了。看了文档,没有主动获取对端相邻节点的协议命令,只有一个addr命令来主动告知对端与本节点相连的节点IP。

先写个demo再说,很简单,从DNS seed获取IP节点,建立连接,处理完握手之后不发送任何信息,只接受消息,打印出接收到的命令,在一大串的命令之后,收到了期盼的addr命令,bingo!

心里大致有了一个流程图,从DNS seed中获取IP地址放入IP种子集合中,创建一个kqueue(linux上是epoll),不断从IP种子集合中拿出一些IP,创建TCP连接,并开始监听读写事件,只要收到addr协议命令后,就从消息中取出IP地址放入IP种子集合中。

真是说起来容易,做起来难,而且还三年多没写过C++了,最后总算是能够稳定的跑起来了。进过四天的连续执行,已经获取到了7.6W+个IP地址:


tornado写了个web服务,通过ip获取地理位置信息,并做了点可视化:

2018-08-13 10-01-37屏幕截图.png

我大天朝果然牛批!占比25%左右!

还可以查看其它国家的具体分布,代码已经放在全球最大男性交友网站了,https://github.com/lt90s/BitcoinNetwork,求星星~~~

你可能感兴趣的:(比特币P2P网络IP分布)