¿Por qué el cliente principal limita el número de conexiones salientes a 8?

El cliente principal de Bitcoin limita el número de conexiones salientes a 8, sin embargo, permite hasta 125 conexiones en total. Para lograr más de 8 conexiones (debido a la limitación de salida) se requiere el uso de upnp o el reenvío de puertos para que el cliente pueda aceptar conexiones entrantes.

¿Por qué hay un límite de 8 conexiones y solo en conexiones salientes? ¿Por qué no permitir que el cliente cree 20 o 125 conexiones salientes?

Respuestas (3)

Este es un problema heredado.

Cuando se implementó la red por primera vez, había una gran escasez de servidores que pudieran aceptar conexiones entrantes de manera confiable. Muchas personas comenzaron a ejecutar el cliente detrás de NAT y no podían aceptar ninguna conexión entrante. Mientras tanto, estaban consumiendo la capacidad de conexión de entrada disponible de la cantidad más limitada de máquinas que podían aceptarlos. El cliente ahora habilita el cruce de uPNP de forma predeterminada.

En segundo lugar, hubo problemas con el código del cliente que hicieron que no pudiera admitir tantas conexiones como debería. Muchos nodos ni siquiera podían admitir las 125 conexiones predeterminadas, a pesar de que su uso de CPU y red no estaba ni mucho menos al máximo.

En estos días, está un poco atascado. Mis parches de 'modo concentrador' hacen posible que los clientes admitan fácilmente 1500 conexiones. Pero casi nunca ven más de 200 clientes porque las limitaciones de capacidad de la red ya no existen.

Necesita una buena cantidad de conexiones salientes porque un adversario malicioso puede consumir todas sus ranuras de conexión entrante al conectarse repetidamente a usted y permanecer conectado desde una variedad de direcciones IP. El cliente de Bitcoin en realidad tiene un código para tratar de obtener diversidad de IP en sus conexiones salientes para protegerse contra alguna entidad que crea un millón de servidores y tiene una alta probabilidad de obtener las 8 ranuras de salida.

Si eres paranoico, sube esto. Todavía puede configurar para 32 conexiones salientes si también puede agregar al menos 64 ranuras de conexión entrante a cambio. Estarás ayudando a la red. Puede usar mis parches de modo concentrador para hacer esto.

Gracias. Entonces, ¿por qué los desarrolladores no han aumentado el límite en el cliente principal? Uno pensaría que con cada versión harían algunos ajustes. Mirando la sección de novatos en el foro de Bitcointalk, el rendimiento lento e inconsistente de la descarga de blockchain es un problema continuo. A medida que la cadena de bloques deja de ser, los 8 límites de conexión me parecen cada vez más arcaicos. Al menos aumentarlo a 16 permitiría un mayor rendimiento para nuevos clientes.
Creo que la tasa de sincronización de bloque lenta se debe a dos problemas, ninguno de los cuales está relacionado con el límite de conexión. Uno fue un error que se solucionó, pero los clientes más antiguos aún estropean los más nuevos. El otro es el hecho de que el cliente valida cada bloque, cada hash y cada transacción. Hay más de 100.000 bloques y las PC típicas no pueden validar más de 15 por segundo.

El cliente de Bitcoin que acepta conexiones entrantes, llamémoslo servidor, puede aceptar un número limitado de ellas. Suponiendo que la cantidad de clientes es mayor que la cantidad de servidores, si los clientes no tienen fuertes restricciones en la cantidad de conexiones salientes, entonces sobrecargaría los servidores y negaría el acceso a los datos de la cadena de bloques a algunos clientes.

Para ilustrar, imagine una situación en la que solo hay un servidor en la red y muchos clientes de bitcoin, si los clientes pueden reservar tantas conexiones de servidor como quieran, eso seguramente evitaría que algunos clientes se conecten al servidor.

las constantes para establecer el número de conexiones están en src/net.h

static const int MAX_OUTBOUND_CONNECTIONS = 8;

en el repositorio en github: https://github.com/bitcoin/bitcoin/blob/3bf06e9bac57b5b5a746677b75e297a7b154bdbd/src/net.h#L59

cambia a lo que quieras y vuelve a compilar