2016-05-26 25 views
22

Dato un singolo indirizzo IP pubblico (peer A) e un elenco di molti altri indirizzi IP pubblici (una combinazione di indirizzi IPv4 e IPv6), qual è il modo più semplice per abbinare il peer A l'IP indirizzi degli equivalenti n senza che i peer eseguano manualmente il ping l'un l'altro per il benchmarking della latenza?WebRTC: corrispondenza tra pari più vicini

Penso che questo sia possibile utilizzando BGP con una serie di query complicate (e forse qualcosa che coinvolge OSPF), ma speravo che potesse esserci una soluzione o una libreria che avrebbe reso semplice la chiamata teorica funzionale di seguito .

// `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); 

Devo solo utilizzare un'istanza locale del database di GeoIP MaxMind + Haversine/Vincenty, o è pratico da usare BGP attraverso una libreria (con una corretta caching ove necessario) per raggiungere questo obiettivo?

Sembra che questo tipo di codice possa esistere in un'implementazione di instradamento anycast open source, sebbene non sia stato possibile trovare nulla che si adatti a questo caso d'uso.

La soluzione o la libreria suggerita non devono funzionare su node.js - qualsiasi lingua va bene.

+0

Presumo che l'elenco di IP siano indirizzi IP esterni. Vorrei utilizzare il database GeoIP di MaxMind per ottenere le coordinate di ogni IP e quindi utilizzare la formula di Haversine per determinare la posizione più breve. Probabilmente il collo di bottiglia sarebbe il tempo di risposta da MaxMind (Esempio <400 ms) ma ho anche scoperto che ti vendono il database GeoIP per ospitarlo nei locali, se necessario. https://www.maxmind.com/en/geoip2-databases – spicyramen

+0

@spicyramen Sì, se non riesco a capire come farlo in BGP un db MaxMind locale è la mia alternativa di fallback per ora. –

risposta

3

Come ho letto, la tua domanda è il modo più generale che il vostro/caso d'uso WebRTC Javascript.

Chi di qualcosa di simile: "Data una rete P2P e un server centrale che conosce tutti i peer connessi, che è la migliore metrica di quella che può essere utilizzata per accoppiarli?".

=> Come buona metrica per accoppiare due nodi arbitrari sarebbe la distanza di salto tra di loro. Il problema è che questo valore non è possibile calcolare (puoi solo indovinare quale percorso i router ISP sceglieranno tra i nodi).

Come approssimarlo quindi?

1. Utilizzare la distanza geografica come approssimazione per hop distanza

In tal caso, si sono praticamente finito. Utilizzare qualsiasi servizio "ip to latlng" e il gioco è fatto.

2. cercare di indovinare la distanza reale hop mappando internet

ho trovato un articolo su questo argomento, che potrebbe essere utile a voi.Si potrebbe anche scavare un po 'sul loro riferimenti per recuperare precedenti documenti sullo stesso argomento:

Estimating Hop distanza tra le coppie host arbitrari http://nowak.ece.wisc.edu/infocom09.pdf

astratta - Creazione di un quadro chiaro e tempestivo di Internet La topologia è complicata da molti fattori, tra cui la grande dimensione e la natura dinamica dell'infrastruttura. In questo documento, descriviamo una metodologia per la stima di una caratteristica importante della topologia di Internet: la distanza di salto tra coppie arbitrarie di host finali. Il nostro obiettivo è quello di sviluppare un approccio alla stima della distanza del luppolo a coppie accurata, scalabile, tempestiva e che non richiede un'infrastruttura di misurazione significativa. La nostra metodologia si basa sulla distribuzione di una piccola serie di punti di riferimento nodi che utilizzano sonde tipo traceroute tra loro su stabiliscono una serie di distanze di salto pairwise accurate. I nodi di riferimento sono inoltre configurati per raccogliere gli indirizzi IP di origine e i valori TTL dal traffico di pacchetti di rete monitorato passivamente. Sviluppiamo un nuovo algoritmo di ridimensionamento multidimensionale che può essere applicato a entrambe le misurazioni passive e attive a e genera stime della distanza dell'arco a coppie per tutti gli indirizzi host di origine osservati. L'algoritmo di base viene quindi migliorato in considerando l'appartenenza al sistema autonomo degli host di origine tramite le informazioni di routing BGP . Esaminiamo le funzionalità dei nostri algoritmi di stima utilizzando un set di topologie di rete sintetiche. I risultati mostrano che il nostro metodo è in grado di generare stime della distanza di salto pairwise molto precise con un intervallo di dimensioni di rete e configurazioni e dimensioni di infrastruttura di riferimento.

+0

Grazie per il link a quel documento. Questo è esattamente quello che sto cercando! –

2

Il modo più semplice per trovare i peer più vicini è inviare a ciascuno dei peer una richiesta di eco e misurare il tempo necessario per ottenere una risposta, come fa il ping.

9

Installare https://github.com/runk/node-maxmind

Download 'GeoLite2-City.mmdb' da: 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); 
} 
Problemi correlati