Tercer inning, esto realmente hacerlo desde cero: la dificultad ni siquiera está en “escribir un retransmisor”, sino en “aguantar un montón de trabajos sucios y pesados”.
Más o menos hay estas cuantas “pilas”:
-
Diseño del protocolo
Cómo hacer el handshake
Cómo hacer la autenticación
Si hay que hacer multiplexación o no
Cómo manejar de forma unificada UDP, TCP, DNS
Al principio por ahorrar esfuerzo, después casi siempre terminas reescribiendo por extensibilidad -
Pila de red multiplataforma
Windows / Linux / macOS / Android / iOS se comportan todos distinto
TUN/TAP, proxy del sistema, rutas, formas de tomar el control de DNS, todo es diferente
Lo realmente asqueroso es la compatibilidad entre plataformas, no esas pocas líneas de socket -
Rendimiento
En cuanto sube el número de conexiones, salen los problemas
buffer, copias, contención de locks, planificación de corrutinas, fragmentación de memoria, coste de syscalls
Que una sola conexión corra no significa que en producción aguante -
Estabilidad
Reconexión tras cortes
Cambio de red
Suspensión y reanudación
NAT / IPv6 / MTU / fragmentación
Con muchos escenarios anómalos, los logs te pueden dar PTSD de mirarlos -
Cifrado y seguridad
Intercambio de claves
Protección contra replay
Forward secrecy
Reanudación de sesión
Seguridad en la distribución de configuración
Aquí lo que más da miedo es “inventarte tu propia criptografía”, eso es subirte la dificultad tú mismo -
Estrategia de tráfico y encapsulado
Cómo trocear los paquetes
Cómo ocultar el header
Cómo evitar que las huellas sean demasiado fijas
Esto no es “que se pueda comunicar” y ya, sino “que no explote a largo plazo” -
Manejo de DNS
Resolver localmente o resolver en remoto
DoH / DoT / UDP puro
Envenenamiento, caché, consistencia, fugas
Muchos problemas de “claramente conecta pero está raro” vienen de DNS -
Enrutamiento y split tunneling
Global, por reglas, por dominio, por IP, por proceso
GeoIP / GeoSite / reglas personalizadas
El sistema de reglas cuanto más lo escribes más se parece a medio intérprete -
Observabilidad
Logs
tracing
Estado de conexiones
Panel de estadísticas
Sin esto, depuras a base de esoterismo y “si eres sincero, funciona” -
Sistema de configuración
Actualización en caliente
Compatibilidad de configuración
Migración de versiones
Validación de schema
A los usuarios les encanta escribir configuraciones como basura y luego culpar al core de inestable -
Ecosistema de cliente
GUI
Suscripciones
Importación/exportación de configuración
Integración con el sistema
Cuando haces un producto de verdad, el core no necesariamente es la parte con más código; lo de alrededor lo es -
Los propios agujeros de la programación asistida por IA
La IA es muy buena escribiendo código de red “que parece correcto”
Pero en concurrencia, condiciones de borde y máquinas de estados de protocolo es especialmente fácil que meta minas
Puede ayudarte a montar el armazón, completar boilerplate, escribir tests
No puede sustituirte verificando que el protocolo es correcto
Al final suele quedar: la IA saca código en 5 minutos, tú te pasas 5 horas capturando paquetes para encontrar el culpable
Si solo haces un núcleo sencillo, la dificultad más realista en ingeniería en realidad es:
Definir primero un objetivo mínimo
No hacerlo multiplataforma desde el arranque
No inventarte un protocolo desde el arranque
No hacer un motor de reglas desde el arranque
No montar desde el arranque una “arquitectura universal de alto rendimiento”
Si no, es muy fácil que acabe así:
Primera semana: voy a hacer el núcleo de nueva generación
Segunda semana: primero que corra el reenvío TCP
Tercera semana: ¿por qué DNS volvió a explotar?
Cuarta semana: mejor me voy a modificar a lo bestia un proyecto existente
Una frase de crítica afilada:
Desde cero escribir algo que “corra” no es tan difícil; lo difícil es escribir algo “mantenible a largo plazo, multiplataforma, estable, extensible y con un rendimiento no lamentable”.
Si lo que quieres es evaluar la dificultad de “con ayuda de IA, de cero a un MVP usable”, puedo seguir con ese criterio y desglosártelo en:
Prototipo de 2 semanas
1 mes para uso propio
3 meses para que mantenerlo no sea ir a la cárcel
En esas versiones.