# VNC

VNC son las siglas del inglés de Virtual Network Computing (Computación Virtual en Red).
VNC es un programa de software libre basado en una estructura cliente-servidor que permite observar las acciones del ordenador servidor remotamente a través de un ordenador cliente. VNC no impone restricciones en el sistema operativo del ordenador servidor con respecto al del cliente: es posible compartir la pantalla de una máquina con cualquier sistema operativo que admita VNC conectándose desde otro ordenador o dispositivo que disponga de un cliente VNC portado.
La versión original del VNC se desarrolló en el Reino Unido, concretamente en los laboratorios AT&T Olivetti Research Laboratory, en Cambridge. El programa era de código abierto, por lo que cualquiera podía modificarlo, y existen hoy en día varios programas para el mismo uso. Muchos derivados modernos de él son software libre con licencia GPL.
En la enseñanza, VNC sirve para que el profesor comparta su pantalla con los alumnos, por ejemplo en un laboratorio. También puede usarse para que un técnico ayude a un usuario inexperto, el técnico ve remotamente el problema del que informa el usuario.
El programa servidor suele tener la opción de funcionar como servidor HTTP para mostrar la pantalla compartida en un navegador con java. En este caso el usuario remoto (cliente) no tiene que instalar un programa cliente de VNC sino que es descargado por el navegador automáticamente.
VNC es independiente de la plataforma, un cliente VNC de un sistema operativo pueden conectarse a un servidor VNC del mismo sistema operativo o de cualquier otro. Hay clientes y servidores tanto para muchos sistemas operativos basados en GUI como para java. Varios clientes pueden conectarse a un servidor VNC al mismo tiempo. Los usos populares de esta tecnología incluyen ayuda técnica remota y acceso a los archivos presentes en el ordenador del trabajo desde la computadora de la casa o viceversa.
Hay una serie de variantes de VNC, que ofrecen, aparte de las funciones típicas de VNC, funciones particulares; por ejemplo, algunos están optimizados para Microsoft Windows; otros disponen de transferencia de archivos, (que no es propiamente parte de VNC), etc. Muchos son compatibles (sin funciones adicionales) con el propio VNC en el sentido de que un usuario de una variante de VNC puede conectar con un servidor de otra, mientras que otros se basan en el código fuente de VNC, pero no son compatibles con el estándar VNC.
El término "VNC" y el RFB son marcas registradas de RealVNC Ltd. en los EE. UU. y en otros países.

## Historia

VNC fue creado en el Olivetti & Oracle Research Lab (ORL), que entonces era propiedad de Olivetti y Oracle Corporation. En 1999 AT&T compró el laboratorio, y en 2002 cerró los esfuerzos del laboratorio de investigación.
Los desarrolladores que trabajaron en VNC cuando aún estaba en el Laboratorio de Investigación de AT&T son:
* Tristan Richardson (inventor)
* Andy Harter (director del proyecto)
* Quentin Stafford-Fraser
* James Weatherall
* Andy Hopper
Tras el cierre de ORL en el año 2002, varios miembros del equipo de desarrollo (incluyendo Richardson, Harter, Weatherall y Hopper) crearon RealVNC con el fin de seguir trabajando en software libre y software comercial VNC bajo ese nombre.
Varias otras versiones de VNC se han desarrollado a partir del código fuente original GPL. Tal bifurcación no ha dado lugar a problemas de compatibilidad ya que el protocolo RFB está diseñado para ser extensible. Los clientes y servidores VNC negocian sus capacidades, al hacer apretón de manos (handshaking) para utilizar las opciones más apropiadas soportadas en ambos extremos.

## Etimología

El nombre de "Virtual Network Computer/Computing" se originó en el Olivetti Research Laboratory (ORL), en un thin client llamado Videotile que también utilizaba el protocolo RFB que estaba siendo desarrollado allí. Se trataba esencialmente de una pantalla LCD con una entrada de lápiz y una conexión rápida ATM a la red. En ese momento, una computadora de red se utiliza comúnmente como sinónimo de "cliente ligero". VNC es esencialmente una versión sólo software (es decir, virtual) de esta red informática.

## Funcionamiento

Un sistema de VNC se compone de un cliente, un servidor, y un protocolo de comunicación.
* El VNC servidor es el programa en el equipo que comparte su pantalla. El servidor de forma pasiva permite al cliente tomar el control de la misma.
* El VNC cliente (o espectador) es el programa que vigila, controla e interactúa con el servidor. El cliente controla al servidor.
* El VNC protocolo (RFB) es muy simple, basado en una primitiva gráfica del servidor al cliente (("Put a rectangle of pixel data at the specified X,Y position", en español "Póngase un rectángulo de datos de píxel en la posición X,Y especificada) y mensajes de eventos desde el cliente al servidor.
En el método normal de operación, un visor (espectador) se conecta a un puerto en el servidor (puerto por defecto 5900). Alternativamente, un navegador puede conectarse al servidor (dependiendo de la implementación) (puerto por defecto 5800). Y un servidor puede conectarse a un espectador en "modo de escucha" en el puerto 5500. Una de las ventajas del modo de escucha es que el sitio del servidor no tiene que configurar su cortafuegos para permitir el acceso en el puerto 5900 (o 5800), la responsabilidad recae en el espectador, lo cual es útil si el sitio del servidor no tiene conocimientos informáticos, mientras que del visor usuario se espera que sea más sabio.
El servidor envía pequeños rectángulos de la framebuffer para el cliente. En su forma más simple, el protocolo VNC puede utilizar una gran cantidad de ancho de banda, por lo que han sido diseñados varios métodos para reducir la sobrecarga de comunicación. Por ejemplo, hay varias codificaciones (métodos para determinar la manera más eficiente de transferencia de estos rectángulos). El protocolo VNC permite que el cliente y el servidor negocien la codificación que se utilizará. La forma más simple de codificación, que es apoyada por todos los clientes y servidores, es la codificación cruda (raw), donde los datos se envían en píxeles en orden scanline de izquierda a derecha, y después de haberse transmitido la pantalla completa original, sólo se transfieren los rectángulos que cambien. Esta codificación funciona muy bien si sólo una pequeña porción de la pantalla cambia de un fotograma a otro (como un puntero del ratón se mueve en un escritorio, o el texto que se escriben en el cursor), pero las demandas de ancho de banda crecen radicalmente si una gran cantidad de píxeles cambia al mismo tiempo, como al desplazarse por una ventana o visualizar un vídeo a pantalla completa.
VNC por defecto usa puerto TCP 5900+N, donde N es el número de la pantalla (por lo general: 0 para una pantalla física). Varias implementaciones también inician un servidor básico HTTP en el puerto 5800+N para proporcionar un visor VNC como applet Java, que permite la conexión fácil a través de cualquier navegador web con Java activado. Se puede utilizar distintas asignaciones de puerto siempre y cuando el cliente y el servidor estén configurados para ello.
El uso de VNC a través de Internet funciona bien si el usuario tiene una conexión de banda ancha en ambos extremos. Sin embargo, puede requerir avanzada NAT, cortafuegos así como configuración del router, como el reenvío de puertos para el paso de la conexión entrante y saliente a través. Algunos usuarios pueden optar por utilizar al instante aplicaciones de redes privadas, tales como Red Privada Virtual (VPN), programas tales como Hamachi para hacer el uso a través de Internet mucho más fácil. Por otra parte, una conexión VNC puede ser establecida como conexión LAN si se utiliza VPN como proxy.
Téngase en cuenta que la máquina donde se ejecuta el servidor VNC no necesita tener una pantalla física. Es Xvnc es el servidor Unix VNC server, que se basa en el estándar X server. Para aplicaciones Xvnc es un X "servidor" (es decir, muestra ventanas del cliente), y para los usuarios remotos de VNC es un servidor VNC. Las aplicaciones pueden mostrarse en Xvnc como si fueran una pantalla X normal, pero van a aparecer en cualquier conexión VNC espectadores más que en una pantalla física También una máquina (que puede ser una estación de trabajo o un servidor de red) con pantalla, teclado y ratón se pueden configurar para arrancar y ejecutar el servidor VNC como un servicio o demonio, y entonces la pantalla, el teclado y el ratón pueden ser eliminados y la máquina almacenada en una ubicación fuera de la forma (out-of-the way).
Además, la pantalla que muestra VNC no es necesariamente la misma pantalla vista por un usuario en el servidor. En computadores Unix/Linux que soporten múltiples sesiones simultáneas X11, VNC puede ser configurado para servir a una sesión particular existente de X11, o para iniciar una propia. También es posible ejecutar múltiples sesiones de VNC desde el mismo ordenador. En Microsoft Windows la sesión VNC servida (proporcionada) es siempre la sesión del usuario actual.
VNC es comúnmente usado como un sistema de escritorio multiplataforma a distancia. Por ejemplo, Apple Remote Desktop de Mac OS X (y, más recientemente, "Back to My Mac" in 'Leopard' - Mac OS X 10.5) interactúa con VNC y se conectará al escritorio actual de un usuario de Linux, si se sirve con x11vnc, o a una sesión de X11 separada si se sirve con TightVNC. Desde Linux, TightVNC se conecta a una sesión de Mac OS X servida por Apple Remote Desktop, si la opción VNC está activada, o en un servidor VNC que se ejecute en Microsoft Windows.

## Uso

Primero tenemos que compartir una pantalla gráfica, que puede ser la que se está usando ahora o una pantalla virtual. En Windows solo puede compartirse la pantalla actual, no puede crearse una pantalla virtual. El sistema X gráfico que usan Gnu/Linux y Unix sí permite crear una o más pantallas virtuales.
El primer paso es crear y compartir una pantalla virtual:
El programa corre y muestra en pantalla el nombre de la máquina y el número de la pantalla que se comparte como nombre-máquina:número-pantalla. Por ejemplo si reporta: alps.dominio.org:2, la máquina es alps.dominio.org y el número de pantalla es 2.
Para compartir la pantalla actual en Gnu/Linux o Unix:
Nota: x0rfbserver no se encuentra en desarrollo actualmente (el proyecto ha sido abandonado) usar en su reemplazo:
O también, en el entorno KDE existe esta opción:
Ambos programas servidores muestran una ventana gráfica que deberá permanecer corriendo mientras se comparte la pantalla.
En el segundo paso, el usuario remoto corre un cliente de VNC:
Según el ejemplo de arriba, sería:
En un ambiente de enseñanza y con pantalla virtual, también el instructor deberá correr un cliente de VNC para poder ver la misma pantalla que los alumnos. Si se desea que los alumnos vean pero sin controlar la pantalla virtual, deberán usar:

## Disponibilidad

* GNU/Linux: Los programas cliente y servidor generalmente están disponibles como paquetes RPM o Debian. En Debian y derivados como Ubuntu el comando
y en Red Hat y derivados como Fedora el comando
Nota: DNF (Dandified yum) es el sucesor de yum. Fue introducido en Fedora 18 y es el gestor de paquetes por defecto desde Fedora 22 (así como en RHEL8 y CentOS8), por lo que para usuarios de estas versiones y posteriores se recomienda el comando
mostrará una lista de los paquetes disponibles relacionados con VNC, como servidores: vncserver, tightvncserver, rfb, krfb; y clientes: vncviewer, krdc.
El cliente vncviewer suele instalarse en forma predeterminada en las distribuciones orientadas a uso de escritorio. Si se desea el programa servidor o alguna otra variante de VNC, pueden instalarse ya sea de los CD o descargando de un repositorio de paquetes de la distribución.
* Windows: Se pueden descargar el cliente o el servidor de los enlaces disponibles abajo en Enlaces externos.

## Seguridad

Por defecto, VNC no es un protocolo seguro. Las contraseña no se envían en texto plano (como en telnet), pero el intento de romper o agrietar (cracking) la contraseña puede tener éxito si tanto la clave de cifrado y la contraseña cifrada es capturada desde una red. Por esta razón se recomienda utilizar una contraseña de al menos 8 caracteres. Por otro lado, también existe un límite de 8 caracteres en algunas versiones de VNC; si se envía una contraseña de más de 8 caracteres, los caracteres sobrantes se retiran y la cadena truncada es comparada con la contraseña.
Sin embargo, VNC puede ser tunelado a través de una conexión SSH o VPN que añada una capa extra de seguridad con un cifrado más seguro. Están disponibles Clientes SSH para todas las plataformas principales (y muchas plataformas más pequeñas también); se pueden crear túneles SSH a partir de clientes UNIX, Microsoft Windows, Macintosh (incluyendo Mac OS X y System 7 en adelante) - y muchos otros. Hay aplicaciones freeware que crean al instante túneles VPN entre ordenadores.
UltraVNC soporta el uso de un plugin de código abierto que cifra toda la sesión de VNC incluyendo autenticación de contraseña y transferencia de datos. También permite a la autenticación realizarse sobre la base de cuentas de usuario NTLM y Active Directory. Sin embargo, el uso de plugins de cifrado como lo hacen incompatible con otros programas VNC. RealVNC ofrece un alto nivel de cifrado como parte de su paquete comercial. Workspot ha publicado parches para VNC de cifrado AES.

## Limitaciones

Unicode no es compatible con las versiones 3.x VNC e inferiores por lo que es imposible transferir el texto del portapapeles fuera del juego de caracteres Latin-1.
El protocolo VNC está basado en píxeles. Aunque esto lleva a una gran flexibilidad (es decir, se puede mostrar cualquier tipo de escritorio), a menudo es menos eficiente que las soluciones que tienen una mejor comprensión de la disposición de fondo gráfico como X11 o Windows Remote Desktop Protocol. Estos protocolos envían primitivas gráficas o comandos de alto nivel en una forma más simple (por ejemplo, "open window", "abrir ventana"), mientras que RFB sólo envía los datos de píxeles en bruto (raw pixel data).