2016-05-26 14 views
22

Cho một địa chỉ IP công cộng (peer A) và danh sách nhiều địa chỉ IP công cộng khác (kết hợp địa chỉ IPv4 và IPv6), cách dễ nhất để so khớp ngang hàng IP là gì địa chỉ của n các đồng nghiệp gần nhất mà không cần các đồng nghiệp tự ping nhau để chấm điểm độ trễ? Tôi nghĩ rằng điều này là có thể bằng cách sử dụng BGP với một loạt các truy vấn phức tạp (và có thể một cái gì đó liên quan đến OSPF), nhưng tôi đã hy vọng rằng có thể có một giải pháp hoặc thư viện mà sẽ làm cho nó dễ dàng như các cuộc gọi chức năng lý thuyết dưới đây Logged .WebRTC: Kết hợp các đối tác gần nhất

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

nên tôi chỉ sử dụng một trường hợp địa phương của cơ sở dữ liệu GeoIP MaxMind của + Haversine/Vincenty, hoặc là nó thực tế để sử dụng BGP thông qua một thư viện (với bộ nhớ đệm đúng nơi cần thiết) để thực hiện điều này?

Dường như loại mã này có thể tồn tại trong triển khai định tuyến anycast nguồn mở, mặc dù tôi không thể tìm thấy bất kỳ thứ gì phù hợp với trường hợp sử dụng này.

Giải pháp hoặc thư viện được đề xuất không phải hoạt động trên node.js — mọi ngôn ngữ đều ổn.

+0

Tôi giả định danh sách IP là địa chỉ IP bên ngoài. Tôi sẽ sử dụng cơ sở dữ liệu GeoIP của MaxMind để lấy tọa độ của mỗi IP và sau đó sử dụng công thức Haversine để xác định vị trí ngắn nhất. Có lẽ nút cổ chai sẽ là thời gian phản hồi từ MaxMind (Ví dụ <400 ms) nhưng tôi cũng thấy rằng họ bán cho bạn cơ sở dữ liệu GeoIP để lưu trữ nó trên cơ sở nếu cần thiết. https://www.maxmind.com/en/geoip2-databases – spicyramen

+0

@spicyramen Vâng, nếu tôi không thể tìm ra cách để làm điều này trong BGP một MaxMind db địa phương là dự phòng thay thế của tôi bây giờ. –

Trả lời

3

Như tôi đã đọc nó, câu hỏi của bạn là cách tổng quát hơn/trường hợp sử dụng WebRTC của Javascript của bạn.

Ai về một cái gì đó như: "Với mạng P2P và máy chủ trung tâm biết tất cả các đồng nghiệp được kết nối, đó là số liệu tốt nhất có thể được sử dụng để ghép nối chúng?".

=> Số liệu tốt để ghép hai nút tùy ý sẽ là khoảng cách hop giữa chúng. Vấn đề là giá trị này không thể tính toán được (bạn chỉ có thể đoán đường dẫn mà các bộ định tuyến ISP sẽ chọn giữa các nút).

Làm cách nào để ước tính nó?

1. Sử dụng khoảng cách địa lý như một xấp xỉ nhảy khoảng cách

Trong trường hợp đó, bạn đang thực hiện khá nhiều. Sử dụng bất kỳ dịch vụ "ip to latlng" nào và bạn đã hoàn tất.

2. Cố gắng đoán khoảng cách hop thực bằng cách ánh xạ internet

Tôi tìm thấy một giấy về chủ đề đó, mà có thể có ích cho bạn.Bạn cũng có thể đào một chút về tài liệu tham khảo của họ để lấy giấy tờ trước trên cùng một subject:

dự toán Hop Khỏang cách giữa cặp chủ Arbitrary http://nowak.ece.wisc.edu/infocom09.pdf

Tóm tắt - Thiết lập một bức tranh rõ ràng và kịp thời của Internet cấu trúc liên kết phức tạp bởi nhiều yếu tố bao gồm kích thước rộng lớn và tính chất động của cơ sở hạ tầng. Trong bài báo này, chúng tôi mô tả một phương pháp để ước tính một đặc tính quan trọng của cấu trúc liên kết Internet - khoảng cách hop giữa các cặp tùy ý của máy chủ lưu trữ cuối. Mục tiêu của chúng tôi là phát triển một phương pháp tiếp cận để ước tính khoảng cáchkhoảng cách hop là chính xác, có thể mở rộng, kịp thời và không yêu cầu cơ sở hạ tầng đo lường đáng kể. Phương pháp của chúng tôi dựa trên việc triển khai một tập hợp nhỏ các mốc các nút sử dụng các đầu dò giống như traceroute giữa nhau với nhau để thiết lập một tập hợp các khoảng cách nhảy cặp đôi chính xác. Các nút mốc cũng được định cấu hình để thu thập địa chỉ IP nguồn và giá trị TTL từ lưu lượng gói mạng được giám sát thụ động. Chúng tôi phát triển thuật toán chia tỷ lệ đa chiều mới có thể áp dụng cho cả phép đo thụ động và hoạt động để tạo ước tính khoảng cách hop hop cho tất cả địa chỉ máy chủ nguồn được quan sát . Thuật toán cơ bản sau đó được tăng cường để xem xét tư cách thành viên hệ thống tự trị của máy chủ nguồn thông qua thông tin định tuyến BGP. Chúng tôi điều tra khả năng của các thuật toán ước tính của chúng tôi bằng cách sử dụng một tập hợp các cấu trúc liên kết mạng tổng hợp. Kết quả cho thấy rằng phương pháp của chúng tôi có thể tạo ra các ước tính khoảng cách hop hop theo từng cặp một cách chính xác với các kích thước mạng và cấu hình cũng như kích thước cơ sở hạ tầng mang tính bước ngoặt.

+0

Cảm ơn bạn đã liên kết đến bài báo đó. Đây chính xác là những gì tôi đang tìm kiếm! –

2

Cách dễ nhất để tìm các đồng nghiệp gần nhất, là gửi cho từng đồng nghiệp một yêu cầu echo và đo thời gian cần để nhận phản hồi, như ping.

9

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

Tải 'GeoLite2-City.mmdb' từ: 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); 
} 
Các vấn đề liên quan