标题党了一次,用一个高大上的的题目先吸引各位看官点进来。
其实原理很简单,我们要做的工作只是做一些数据处理并最终生成kml脚本呈现在Google Earth上。
进入正题:
首先数据来源http://www.caida.org .这是一个英特网数据分析的合作组织,数据比较权威,全球很多网络方面的科研数据都来源于此。
而对本文有用的信息在这里:http://www.caida.org/data/internet-topology-data-kit/ 这里面是一些英特网的拓扑信息数据,而且每半年左右都在更新。就从这里获取最新的版本:
进去之后到这个地方:http://data.caida.org/datasets/topology/ark/ipv4/itdk/2011-10/ 如图所示:
数据分为两组,是用不同的工具和探测方式获得的,分别是加入使用kapar和不加入,两组数据的区别在于前者更为详尽,而后者更精确。具体探测原理等可以在caida上找到。
我以不添加kapar工具获取的数据为例子。
数据一共有三个文件,其中以.links结尾的路径数据,以.nodes结尾的是节点路由数据,以.nodes.geo结尾的是地理位置数据。
具体的格式等可以见下面的图:
上图是路径数据的文件截图,第一二列是路径的编号。后面N开头的一串数字路由器的编号,后面如果接有IP地址,则是它在路径上的出口,没有即为该接口数据未被探测到。
于是一行数据就代表了一条网络层的路径,每个带编号的路由器就是位于其上的节点。
上图是地理位置文件截图,每一行列出了每个被探测到的路由器的地理位置信息,包括国家,地区,城市,经纬度等
上图是路由器节点数据文件的截图,每一行标识出了每个路由器上的接口的IP地址。
接下来,进行数据处理。思路是,先从地理位置文件把属于越南的路由器筛选出来。然后把这些路由器代入到路径文件里去查找,选出满足条件的路径。最后把这些路由器和路径写入到KML脚本里,用Google Earth读取即可。
写了一个筛选的小程序,把这个过程泛化了一下,可以实现对任何一个国家拓扑脚本的生成。为了赶进度,代码有点乱。。。看官们勿怪。。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#define MAX_LINE_SIZE 512
#define