繁体   English   中英

WebRTC:匹配最近的同行

[英]WebRTC: Matching up nearest peers

给定单个公共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);

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

看起来这种代码可能存在于开源的任播路由实现中,尽管我还没能找到适合这种用例的任何东西。

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

安装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 );
}

当我读到它时,你的问题比你的Javascript / WebRTC用例更通用。

关于这样的事情:“给定一个P2P网络,以及一个了解所有连接对等体的中央服务器,这是可以用来配对它们的最佳指标吗?”。

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

那怎么近似呢?

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

在那种情况下,你已经完成了很多工作。 使用任何“ip to latlng”服务,你就完成了。

2.尝试通过映射互联网来猜测实际的跳距

我找到了一篇关于这个主题的论文,可能对你有用。 你不妨在他们的参考资料上挖掘一下,找回以前关于同一主题的论文:

估计任意主机对之间的跳距 http://nowak.ece.wisc.edu/infocom09.pdf

摘要 - 由于基础设施的庞大规模和动态性等诸多因素,建立清晰及时的互联网拓扑图像变得复杂。 在本文中,我们描述了一种估计Internet拓扑的重要特征的方法 - 任意端对端之间的跳距。 我们的目标是开发一种精确,可扩展,及时且不需要重要测量基础设施的成对跳距离估计方法。 我们的方法基于部署一小组标志性节点,这些节点在彼此之间使用类似跟踪路由的探测器来建立一组精确的成对跳跃距离。 地标节点还被配置为从被动监视的网络分组流量收集源IP地址和TTL值。 我们开发了一种新颖的多维缩放算法,该算法可应用于无源和有源测量,以生成所有观察到的源主机地址的成对跳距估计。 然后增强基本算法以通过BGP路由信息考虑源主机的自治系统成员资格。 我们使用一组合成网络拓扑来研究我们的估计算法的功能。 结果表明,我们的方法可以在一系列网络规模和配置以及具有里程碑意义的基础设施规模上生成高度精确的成对跳距估计。

查找最近对等点的最简单方法是向每个对等方发送一个echo请求,并测量获取响应所需的时间,如ping。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM