首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebRTC:匹配最近的对等点

WebRTC:匹配最近的对等点
EN

Stack Overflow用户
提问于 2016-05-26 03:53:19
回答 2查看 3K关注 0票数 26

给定一个公共IP地址(peer A)和许多其他公共IP地址(混合了IPv4和IPv6地址)的列表,那么最简单的方法是将n最近的节点的IP地址与n最近的节点的IP地址匹配,而不让对等点手动地进行延迟基准测试?

我认为这是可能的,使用BGP与一堆复杂的查询(可能涉及OSPF),但我希望可能有一个解决方案或库,这将使它像下面的理论函数调用一样容易。

代码语言:javascript
复制
// `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);

我应该只使用MaxMind的GeoIP数据库+ Haversine/Vincenty的本地实例,还是通过一个库(需要适当的缓存)使用BGP来实现这一点?

这类代码似乎存在于开放源码的任意广播路由实现中,尽管我还没有找到适合这个用例的任何东西。

解决方案或建议的库不需要在node.js上工作-任何语言都可以。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-03 14:49:15

正如我所读到的,您的问题比Javascript / WebRTC用例更为普遍。

有谁会这样说:“给定一个P2P网络,以及一个知道所有连接的对等点的中心服务器,这是最好的衡量标准,而不是可以用来配对它们的标准?”

=>作为配对两个任意节点的好度量,将是它们之间的跳距。问题是这个值无法计算(您只能猜测ISP路由器将在节点之间选择哪条路径)。

那么如何近似呢?

1.使用地理距离作为跳距的近似

那样的话,你差不多就完了。使用任何"ip to latlng“服务,您就完成了。

2.通过映射internet来猜测真正的跳距。

我找到了一篇关于这个问题的论文,这可能对你有用。为了检索以前关于同一主题的论文,您不妨对他们的参考资料进行一点挖掘:

估计任意主机对 http://nowak.ece.wisc.edu/infocom09.pdf之间的跳距 建立一个清晰、及时的互联网拓扑结构是一个复杂的因素,包括庞大的规模和动态性质的基础设施。本文描述了一种估计Internet拓扑结构的重要特征--任意对端主机之间的跳距的方法。我们的目标是开发一种对跳距离估计方法,该方法准确、可扩展、及时,并且不需要重要的测量基础设施。我们的方法基于部署一小部分地标节点,这些节点在彼此之间使用类似traceroute的探针来建立一组精确的成对跳距离。地标节点还被配置为从被动监视的网络分组流量中收集源IP地址和TTL值。我们提出了一种新的多维尺度算法,它既可用于被动测量,也可用于主动测量,从而为所有观测到的源主机地址生成成对的跳距估计。然后通过BGP路由信息对基本算法进行改进,以考虑源主机的自治系统成员关系。我们使用一组综合网络拓扑来研究我们的估计算法的能力。结果表明,该方法能够在一定的网络规模和配置范围内,以及地标基础设施的大小范围内,生成高精度的双跳距离估计。

票数 6
EN

Stack Overflow用户

发布于 2016-06-01 13:39:31

安装https://github.com/runk/node-maxmind

下载“GeoLite2-City.mmdb”,地址:http://dev.maxmind.com/geoip/geoip2/geolite2/

代码语言:javascript
复制
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 );
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37451279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档