2016-05-26 3 views
22

Учитывая единый общедоступный IP-адрес (одноранговый узел A) и список многих других общедоступных IP-адресов (сочетание адресов IPv4 и IPv6), что является самым простым способом сопоставления одноранговых сетей адреса ближайших сверстников n, не имея сверстников вручную пинговать друг друга для латентного бенчмаркинга?WebRTC: сопоставление ближайших сверстников

Я думаю, что это возможно с использованием 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); 

Должен ли я просто использовать локальный экземпляр базы данных GeoIP MaxMind в + Haversine/Vincenty, или это практично использовать BGP через библиотеку (при правильном кэшировании, где это необходимо) для достижения этой цели?

Похоже, что этот вид кода может существовать в реализации anycast routing с открытым исходным кодом, хотя я не смог найти ничего, что бы соответствовало этому варианту использования.

Решение или предлагаемая библиотека не должна работать на node.js - любой язык в порядке.

+0

Я предполагаю, что список IP-адресов является внешним IP-адресом. Я бы использовал базу данных GeoIP от MaxMind, чтобы получить координаты каждого IP-адреса, а затем использовать формулу Хаверсина для определения кратчайшего местоположения. Вероятно, узким местом будет время отклика от MaxMind (пример <400 мс), но я также обнаружил, что они продают вам базу данных GeoIP для размещения ее в помещениях, если это необходимо. https://www.maxmind.com/ru/geoip2-databases – spicyramen

+0

@spicyramen Да, если я не могу понять, как это сделать в BGP, локальная версия MaxMind db является моей альтернативной альтернативой. –

ответ

3

Как я прочитал, ваш вопрос является более общим, чем ваш JavaScript/WebRTC использования.

Кто-нибудь вроде: «Учитывая сеть P2P и центральный сервер, который знает все подключенные одноранговые узлы, что является лучшим показателем, чем можно использовать для их объединения?».

=> Как хорошая метрика для пары двух произвольных узлов будет расстоянием между ними. Проблема в том, что это значение невозможно вычислить (вы можете только догадываться, какой путь маршрутизаторы ISP будут выбирать между узлами).

Как ориентировать его тогда?

1. Использование географического расстояния в качестве приближения к хмель расстояние,

В этом случае, вы очень много сделали. Используйте любую услугу «ip to latlng», и все готово.

2. Попробуйте угадать реальное расстояние хмеля, отображая интернет

Я нашел документ по этому вопросу, которые могли бы быть полезными для вас.Вы могли бы также выкопать немного на их ссылку, чтобы получить предыдущие статьи по этой же теме:

Сметы Hop Расстояние между произвольным хостом паром http://nowak.ece.wisc.edu/infocom09.pdf

Аннотация - Создание четкой и своевременной картиной Интернета топология сложна многими факторами, включая обширный размер и динамичный характер инфраструктуры. В этой статье мы опишем методологию оценки важного признака топологии Интернета - расстояние между точками между произвольными парами конечных хостов. Наша цель - разработать подход к оценке расстояния между точками , который является точным, масштабируемым, своевременным и не требует значительной измерительной инфраструктуры. Наша методология основана на развертывании небольшого набора ориентированных узлов , которые используют traceroute-подобные зонды между собой до , устанавливают набор точных парных расстояний. Знаки также сконфигурированы для сбора IP-адресов источника и значений TTL TTL от пассивно контролируемого сетевого пакетного трафика. Мы разрабатываем новый многомерный алгоритм масштабирования, который может быть применен как к пассивным, так и к активным измерениям , для определения парных оценок расстояния для всех наблюдаемых адресов источника хоста . Базовый алгоритм затем увеличивается до , рассматривая автономное членство в системе исходных хостов через Информация о маршрутизации BGP. Мы изучаем возможности наших алгоритмов оценки с использованием набора синтетических сетевых топологий. Результаты показывают, что наш метод может генерировать высокоточные оценки расстояний между точками в диапазоне и конфигурациях и ориентировочных инфраструктурных размеров.

+0

Спасибо за ссылку на эту бумагу. Это именно то, что я ищу! –

2

Самый простой способ найти ближайших сверстников должен был бы отправить каждому из сверстников запрос эха и измерить время, необходимое для получения ответа, например, ping.

9

Установите https://github.com/runk/node-maxmind

Скачать 'GeoLite2-City.mmdb' от: http://dev.maxmind.com/geoip/geoip2/geolite2/

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); 
} 
Смежные вопросы