Eli*_*rey 22 javascript p2p node.js webrtc
给定一个公共IP地址(对等体A)和许多其他公共IP地址列表(IPv4和IPv6地址的混合),最简单的方法是将对等体A匹配n
最近对等体的IP地址而不使用对等体手动ping对方进行延迟基准测试?
我认为这可以使用BGP和一堆复杂的查询(也许涉及OSPF),但我希望可能有一个解决方案或库可以让它像下面的理论函数调用一样简单.
// `peer` is a single IP address. `peer_list` is a list of IP addresses
// get the 5 nearest peers (ordered) to `peer` from `peer_list`
nearest_peers = get_nearest_ips(peer, peer_list, 5);
Run Code Online (Sandbox Code Playgroud)
我应该只使用MaxMind的GeoIP数据库+ Haversine/Vincenty的本地实例,还是通过库(在需要时使用适当的缓存)来实现这一点是否可行?
看起来这种代码可能存在于开源的任播路由实现中,尽管我还没能找到适合这种用例的任何东西.
解决方案或建议的库不必在node.js上工作 - 任何语言都可以.
Abd*_*dın 10
安装https://github.com/runk/node-maxmind
从http://dev.maxmind.com/geoip/geoip2/geolite2/下载'GeoLite2-City.mmdb'
var maxmind = require('maxmind');
var lookup = maxmind.open('./GeoLite2-City.mmdb');
/**/
var peers = [
'31.193.128.0', // UK
'23.112.0.0', // USA
'5.24.0.0', // Turkey
'196.203.0.0', // Tunisia
'77.243.64.0' // Malta
];
var peerLocations = {};
peers.forEach(function(peer) {
var tmp = lookup.get(peer);
if (!tmp || !tmp.location) {
throw new Error('Unable to get initial peer location: ' + peer);
}
peerLocations[peer] = tmp.location;
});
/**/
var testIp = '84.17.64.0'; // Turkey
// 84.17.64.0 // Turkey
// 37.219.0.0 // Finland
// 5.39.0.0 // France
// 37.75.32.0 // Malta
// 5.2.96.0 // UK
// 15.0.0.0 // USA
// 41.224.0.0 // Tunisia
console.log( findClosestPeer(testIp, 3) );
function findClosestPeer(ip, len) {
var ipData = lookup.get(ip);
var distances = [];
if (ipData && ipData.location) {
Object.keys(peerLocations).forEach(function(key) {
var peer = peerLocations[key];
var distance = getDistanceFromLatLonInKM(ipData.location.latitude, ipData.location.longitude,
peer.latitude, peer.longitude);
distances.push({ip: key, distance: distance});
});
}
// 0 ... 9
distances.sort(function(a, b) {
return a.distance - b.distance;
});
return len > 1 ? distances.slice(0, len)
: distances.shift();
}
/* http://stackoverflow.com/a/21279990/605399 */
function getDistanceFromLatLonInKM(lat1, lon1, lat2, lon2) {
var R = 6371; // Radius of the earth in km
var dLat = deg2rad(lat2 - lat1); // deg2rad below
var dLon = deg2rad(lon2 - lon1);
var a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2)
;
var c = 2 * Math.atan2( Math.sqrt(a), Math.sqrt(1 - a) );
var d = R * c; // Distance in km
return d;
}
function deg2rad(deg) {
return deg * ( Math.PI / 180 );
}
Run Code Online (Sandbox Code Playgroud)
在我阅读时,您的问题比您的 Javascript / WebRTC 用例更普遍。
比如:“给定一个 P2P 网络和一个知道所有连接对等点的中央服务器,这是最好的指标,而不是可以用来配对它们?”。
=> 配对两个任意节点的好指标是它们之间的跳跃距离。问题是该值无法计算(您只能猜测 ISP 路由器将在节点之间选择哪条路径)。
那如何近似呢?
1. 使用地理距离作为跳跃距离的近似值
在这种情况下,您就大功告成了。使用任何“ip to latlng”服务就完成了。
2.尝试通过映射互联网来猜测真实的跳跃距离
我找到了一篇关于该主题的论文,可能对你有用。你不妨挖掘一下他们的参考资料来检索以前关于同一主题的论文:
估计任意主机对之间的跳跃距离 http://nowak.ece.wisc.edu/infocom09.pdf
摘要 — 建立清晰及时的 Internet 拓扑图会受到许多因素的影响,包括基础设施的庞大规模和动态特性。在本文中,我们描述了一种用于估计 Internet 拓扑的一个重要特征的方法 - 任意终端主机对之间的跳距。我们的目标是开发一种精确、可扩展、及时且不需要大量测量基础设施的成对跳距离估计方法。我们的方法基于部署一小组地标节点,这些节点在彼此之间使用类似 traceroute 的探针来建立一组准确的成对跳跃距离。地标节点还配置为从被动监控的网络数据包流量中收集源 IP 地址和 TTL 值。我们开发了一种新颖的多维缩放算法,该算法可应用于被动和主动测量,以生成所有观察到的源主机地址的成对跳跃距离估计。然后增强基本算法以通过 BGP 路由信息考虑源主机的自治系统成员资格。我们使用一组合成网络拓扑来研究我们的估计算法的能力。结果表明,我们的方法可以在一系列网络规模和配置以及具有里程碑意义的基础设施规模上生成高度准确的成对跳距离估计。然后增强基本算法以通过 BGP 路由信息考虑源主机的自治系统成员资格。我们使用一组合成网络拓扑来研究我们的估计算法的能力。结果表明,我们的方法可以在一系列网络规模和配置以及具有里程碑意义的基础设施规模上生成高度准确的成对跳距离估计。然后增强基本算法以通过 BGP 路由信息考虑源主机的自治系统成员资格。我们使用一组合成网络拓扑来研究我们的估计算法的能力。结果表明,我们的方法可以在一系列网络规模和配置以及具有里程碑意义的基础设施规模上生成高度准确的成对跳距离估计。
归档时间: |
|
查看次数: |
1062 次 |
最近记录: |