w3schools img attribute javascript node.js webrtc p2p

javascript - img - WebRTC: emparejando a los compañeros más cercanos



title html css (3)

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

Descargue ''GeoLite2-City.mmdb'' desde: 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 ); }

Dada una única dirección IP pública (par A) y una lista de muchas otras direcciones IP públicas (una combinación de direcciones IPv4 e IPv6), ¿cuál es la forma más fácil de hacer coincidir el par A con las direcciones IP de los n peers más cercanos sin tener la ¿Los compañeros hacen ping manualmente entre sí para una evaluación comparativa de la latencia?

Creo que esto es posible usando BGP con un montón de consultas complicadas (y tal vez algo que involucra OSPF), pero esperaba que hubiera una solución o biblioteca que lo hiciera tan fácil como la llamada funcional teórica a continuación.

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

¿Debo usar una instancia local de la base de datos GeoIP de MaxMind + Haversine / Vincenty, o es práctico usar BGP a través de una biblioteca (con el almacenamiento en caché adecuado cuando sea necesario) para lograr esto?

Parece que este tipo de código podría existir en una implementación de enrutamiento Anycast de código abierto, aunque no he podido encontrar nada que se ajuste a este caso de uso.

La solución o la biblioteca sugerida no tienen que funcionar en node.js, cualquier idioma está bien.


La forma más fácil de encontrar a los compañeros más cercanos, sería enviar a cada uno de ellos una solicitud de eco y medir el tiempo que lleva obtener una respuesta, como lo hace ping.


Mientras lo leo, su pregunta es mucho más general que su caso de uso de Javascript / WebRTC.

¿Quién de algo como: "Dada una red P2P y un servidor central que conoce a todos los interlocutores conectados, cuál es la mejor métrica que se puede usar para emparejarlos?".

=> Una buena métrica para emparejar dos nodos arbitrarios sería la distancia de salto entre ellos. El problema es que este valor no es posible calcularlo (solo puede adivinar qué ruta elegirán los enrutadores ISP entre los nodos).

¿Cómo aproximarlo entonces?

1. Usa la distancia geográfica como una aproximación para saltar la distancia

En ese caso, ya has terminado. Use cualquier servicio de "ip to latlng" y habrá terminado.

2. Trate de adivinar la distancia real del salto mediante el mapeo de internet

Encontré un documento sobre ese tema, que podría ser útil para usted. También podrías profundizar un poco en sus referencias para recuperar documentos anteriores sobre el mismo tema:

Estimación de la distancia de salto entre pares de anfitriones arbitrarios http://nowak.ece.wisc.edu/infocom09.pdf

Resumen: el establecimiento de una imagen clara y oportuna de la topología de Internet se complica por muchos factores, incluido el vasto tamaño y la naturaleza dinámica de la infraestructura. En este documento, describimos una metodología para estimar una característica importante de la topología de Internet: la distancia de salto entre pares arbitrarios de hosts finales. Nuestro objetivo es desarrollar un enfoque para la estimación de la distancia de salto por pares que sea precisa, escalable, oportuna y que no requiera una infraestructura de medición significativa. Nuestra metodología se basa en el despliegue de un pequeño conjunto de nodos de referencia que utilizan sondas similares a traceroutes entre sí para establecer un conjunto de distancias de salto de pares precisas. Los nodos de referencia también están configurados para recopilar direcciones IP de origen y valores TTL del tráfico de paquetes de red supervisado de forma pasiva. Desarrollamos un nuevo algoritmo de escalamiento multidimensional que se puede aplicar tanto a las mediciones pasivas como a las activas para generar estimaciones de distancia de salto en pares para todas las direcciones de host de origen observadas. El algoritmo básico se mejora luego para considerar la pertenencia al sistema autónomo de los hosts de origen a través de la información de enrutamiento BGP. Investigamos las capacidades de nuestros algoritmos de estimación utilizando un conjunto de topologías de red sintéticas. Los resultados muestran que nuestro método puede generar estimaciones de distancias de salto por pares altamente precisas en un rango de tamaños y configuraciones de red, y tamaños de infraestructura emblemáticos.