2016-05-26 4 views
22

1つのパブリックIPアドレス(ピアA)と他の多くのパブリックIPアドレス(IPv4とIPv6アドレスが混在している)のリストがある場合、ピアAとIPを照合する最も簡単な方法nに最も近いピアのアドレスで、ピアが手作業でピアリングしてレイテンシベンチマークを行う必要はありませんか?WebRTC:最寄りのピアの照合

複雑なクエリ(と多分OSPFに関係するもの)がたくさんあるBGPを使ってこれを行うことは可能だと思いますが、以下の理論的な関数呼び出しと同じくらい簡単にできる解決策やライブラリがあることを期待していました。

// `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データベース+半正矢/ Vincentyのローカルインスタンスを使用すべきか、これを達成するために(必要に応じて適切なキャッシュを持つ)ライブラリをBGPを使用することは現実的ではありますか?

オープンソースのanycastルーティング実装にこの種のコードが存在する可能性がありますが、このユースケースに合ったものは何も見つかりませんでした。

解決策または推奨ライブラリはnode.jsで動作する必要はありません。どの言語でも問題ありません。

+0

私はIPのリストが外部IPアドレスであると仮定します。 MaxMindのGeoIPデータベースを使用して、各IPの座標を取得し、Haversineの式を使って最短の場所を決定します。おそらくボトルネックはMaxMind(例<400ミリ秒)からの応答時間ですが、私はGeoIPデータベースを販売して、必要に応じて施設内でホストすることも発見しました。 https://www.maxmind.com/en/geoip2-databases – spicyramen

+0

@spicyramenええ、BGPでこれを行う方法がわからないのなら、現地のMaxMind dbが私の代替手段です。 –

答えて

3

、あなたの質問には、JavaScriptの/のWebRTCユースケースよりも、方法がより一般的です。

「P2Pネットワークと、接続されているすべてのピアを知っている中央サーバは、ペア設定に使用できるメトリックよりも優れていますか?

=> 2つの任意のノードをペアにする良いメトリックは、それらの間のホップ距離です。問題は、この値を計算することができないことです(ISPルータがノード間で選択するパスを推測できるだけです)。

どのように近似しますか?近似値として

1.地理的な距離は、その場合には、距離に

をホップする、あなたはかなり行われています。任意の "ip to latlng"サービスを使用すれば、完了です。

2.みてください、私はあなたに役に立つかもしれない、そのテーマに関する論文を見つけたインターネット

をマッピングすることで、本物のホップ距離を推測します。 - インターネットの明確かつタイムリーな絵を確立抽象

http://nowak.ece.wisc.edu/infocom09.pdf 任意のホストのペア間の

推定ホップ距離:あなたにも同じテーマに関する以前の論文を取得するために、彼らの参照にビットを掘るかもしれません トポロジは、膨大なサイズの やインフラストラクチャの動的な性質など、多くの要因によって複雑になります。本論文では、 インターネットトポロジの重要な特性 - 重要な特性 - 最終的なホストの任意のペア の間のホップ距離 - を推定する方法を説明します。私たちの目標は、正確でスケーラブルでタイムリーなホップ距離推定である のペアごとのアプローチを開発することです。 は重要な測定インフラストラクチャを必要としません。私たちの 方法論は、正確なペアごとのホップ距離のセットを確立するために、お互いの間にtracerouteのようなプローブを使用するランドマークの小さなセット ノードを展開することに基づいています。ランドマークの ノードは、受動的に監視されるネットワークパケットトラフィックから送信元IPアドレスと 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); 
} 
関連する問題