VNC

[thumb|[KDE 3.1의 VNC]]

**VNC**(Virtual Network Computing)는 원격 프레임 버퍼(**RFB**) 프로토콜을 사용하여 다른 컴퓨터를 원격으로 제어하는 그래픽 데스크톱 공유 시스템이다. 한 컴퓨터의 키보드 및 마우스 입력을 다른 컴퓨터로 전송하고, 네트워크를 통해 그래픽 화면 업데이트를 중계한다. 이 기술의 대중적인 용도로는 원격 기술 지원과 회사 컴퓨터의 파일에 집 컴퓨터에서 액세스하거나 그 반대의 경우도 있다.

VNC는 다양한 GUI 기반 운영 체제 및 자바용 클라이언트와 서버를 갖춘 플랫폼 독립적이다. 여러 클라이언트가 동시에 VNC 서버에 연결할 수 있다. VNC에는 고유한 기능을 제공하는 여러 변형이 있다. 예를 들어, 일부는 마이크로소프트 윈도우에 최적화되어 있거나 파일 전송 (VNC 자체의 일부 아님)을 제공하는 등이다. 많은 변형이 (추가 기능 없이) VNC 자체와 호환된다. 한 종류의 뷰어가 다른 종류의 서버에 연결할 수 있다는 의미에서 호환되며, 다른 변형은 VNC 코드에 기반을 두지만 표준 VNC와는 호환되지 않는다.

VNC는 원래 영국 케임브리지의 올리베티 & 오라클 연구소에서 개발되었으며, 개발자들은 나중에 RealVNC Ltd를 설립하고 VNC 및 RFB를 미국 및 일부 다른 국가에서 등록 상표로 등록했다. 원래 VNC 소스 코드와 많은 현대 파생물은 GNU 일반 공중 사용 허가서에 따라 오픈 소스이다.

## 역사

영국 케임브리지의 올리베티 & 오라클 연구소(ORL)는 올리베티와 오라클 (기업)이 연구소를 소유하고 있던 시기에 VNC를 개발했다. AT&T 연구소에서 VNC 작업을 했던 개발자로는 트리스탄 리처드슨(발명가), 앤디 하터(프로젝트 리더), 쿠엔틴 스태퍼드-프레이저, 제임스 웨더럴, 앤디 호퍼가 있다. 가상 네트워크 컴퓨터/컴퓨팅(VNC)이라는 이름은 RFB 프로토콜도 사용했던 비디오타일이라는 신 클라이언트에 대한 ORL의 작업에서 유래했다. 비디오타일은 펜 입력이 가능한 LCD 디스플레이와 네트워크에 대한 빠른 ATM 연결을 가졌다. 당시 네트워크 컴퓨터는 신 클라이언트의 동의어로 흔히 사용되었다. VNC는 기본적으로 소프트웨어 전용(즉, 가상) 네트워크 컴퓨터이다.

1999년, AT&T는 연구소를 인수했고 2002년에는 연구소의 연구 노력을 중단시켰다. 이어서 개발팀의 여러 구성원(리처드슨, 하터, 웨더럴, 호퍼 포함)은 RealVNC를 설립하여 그 이름으로 오픈 소스 및 상용 VNC 소프트웨어 작업을 계속했다.  현재 RealVNC Ltd는 미국 및 기타 국가에서 "VNC"라는 용어를 등록 상표로 주장한다.

원래의 GPLed 소스 코드는 여러 다른 VNC 버전으로 이어졌다. 이러한 포크는 RFB 프로토콜이 확장 가능하도록 설계되었기 때문에 호환성 문제를 일으키지 않았다. VNC 클라이언트와 서버는 양쪽 끝에서 지원되는 가장 적절한 옵션을 사용하기 위해 핸드셰이킹을 통해 기능을 협상한다.

## 설계 및 작동

VNC 서버는 일부 화면을 공유하는 기계(물리적 디스플레이와 관련이 없을 수도 있음: 서버는 "헤드리스"일 수 있음)의 프로그램이며, 클라이언트가 이를 공유 제어하도록 허용한다. VNC 클라이언트 (또는 뷰어)는 서버에서 발생하는 화면 데이터를 표시하고, 서버로부터 업데이트를 수신하며, 수집된 로컬 입력을 서버에 알려 제어하는 프로그램이다. VNC 프로토콜 (RFB 프로토콜)은 서버에서 클라이언트로 하나의 그래픽 원시 데이터("지정된 X, Y 위치에 화소 데이터 사각형 배치")를 전송하고 클라이언트에서 서버로 이벤트 메시지를 전송하는 것을 기반으로 하는 매우 간단한 프로토콜이다.

일반적인 작동 방식에서는 뷰어가 서버의 포트(기본 포트: 5900)에 연결한다. 또는 (구현에 따라) 브라우저가 서버에 연결할 수 있다(기본 포트: 5800). 또한 서버는 5500번 포트의 "수신 모드"에서 뷰어에 연결할 수 있다. 수신 모드의 한 가지 장점은 서버 측에서 5900번 (또는 5800번) 포트에 대한 액세스를 허용하도록 방화벽을 구성할 필요가 없다는 것이다. 이 의무는 뷰어에게 있으며, 서버 측에 컴퓨터 전문 지식이 없고 뷰어 사용자가 더 지식이 많을 때 유용하다.

서버는 프레임버퍼의 작은 사각형을 클라이언트에 전송한다. 가장 간단한 형태의 VNC 프로토콜은 많은 대역폭을 사용할 수 있으므로 통신 오버헤드를 줄이기 위한 다양한 방법이 고안되었다. 예를 들어, 다양한 인코딩(이러한 사각형을 전송하는 가장 효율적인 방법을 결정하는 방법)이 있다. VNC 프로토콜은 클라이언트와 서버가 사용할 인코딩을 협상할 수 있도록 한다. 모든 클라이언트와 서버에서 지원되는 가장 간단한 인코딩은 원시 인코딩으로, 왼쪽에서 오른쪽 스캔라인 순서로 픽셀 데이터를 전송하며, 원래 전체 화면이 전송된 후에는 변경되는 사각형만 전송한다. 이 인코딩은 화면의 작은 부분만 한 프레임에서 다음 프레임으로 변경될 때(마우스 포인터가 데스크톱을 가로질러 움직이거나 커서에 텍스트가 쓰여질 때와 같이) 매우 잘 작동하지만, 많은 픽셀이 동시에 변경될 때(창을 스크롤하거나 전체 화면 비디오를 볼 때와 같이) 대역폭 요구량이 매우 높아진다.

VNC는 기본적으로 TCP 포트 5900+N을 사용한다. 여기서 N은 디스플레이 번호(일반적으로 물리적 디스플레이의 경우 :0)이다. 여러 구현에서는 또한 5800+N 포트에 기본 HTTP 서버를 시작하여 자바 애플릿으로 VNC 뷰어를 제공함으로써 모든 자바 지원 웹 브라우저를 통해 쉽게 연결할 수 있도록 한다. 클라이언트와 서버가 그에 따라 구성되는 한 다른 포트 할당을 사용할 수 있다. 최신 브라우저를 위한 HTML5 VNC 클라이언트 구현(플러그인 필요 없음)도 존재한다.

낮은 대역폭에서도 가능하지만, 인터넷을 통한 VNC 사용은 양쪽 끝에 광대역 연결이 있을 때 더 용이하다. 그러나 연결이 이루어지기 위해 네트워크 주소 변환 (NAT), 방화벽 및 라우터 구성과 같은 고급 포트 포워딩이 필요할 수 있다. 사용자는 인터넷을 통한 사용을 용이하게 하기 위해 가상사설망 (VPN) 기술을 통해 통신을 설정하거나, VPN이 프록시로 사용되는 경우 LAN 연결로, 또는 VNC 리피터(NAT가 있는 경우 유용)를 통해 통신을 설정할 수 있다.

또한 VNC가 제공하는 디스플레이가 서버의 사용자가 보는 디스플레이와 반드시 같지는 않다. 여러 동시 X11 세션을 지원하는 유닉스/리눅스 컴퓨터에서는 VNC가 특정 기존 X11 세션을 제공하도록 설정하거나 자체 세션을 시작하도록 설정할 수 있다. 동일한 컴퓨터에서 여러 VNC 세션을 실행하는 것도 가능하다. 마이크로소프트 윈도우에서는 VNC 세션이 항상 현재 사용자 세션이다.

2014년 7월, RealVNC는 Wayland 개발자 미리 보기를 발표했다.

## 보안
기본적으로 RFB는 안전한 프로토콜이 아니다. 비밀번호는 평문으로 전송되지 않지만(예: 텔넷), 암호화 키와 인코딩된 비밀번호가 네트워크에서 스니핑되면 크래킹이 성공할 수 있다. 이러한 이유로 최소 8자 이상의 비밀번호를 사용하는 것이 권장된다. 반면에 일부 VNC 버전에서는 8자 제한이 있다. 8자를 초과하는 비밀번호가 전송되면 초과 문자는 제거되고 잘린 문자열이 비밀번호와 비교된다.

UltraVNC는 비밀번호 인증 및 데이터 전송을 포함하여 전체 VNC 세션을 암호화하는 오픈 소스 암호화 플러그인 사용을 지원한다. 또한 NTLM 및 액티브 디렉터리 사용자 계정을 기반으로 인증을 수행할 수 있다. 그러나 이러한 암호화 플러그인을 사용하면 다른 VNC 프로그램과 호환되지 않는다. RealVNC는 상용 패키지의 일부로 강력한 AES 암호화와 액티브 디렉터리와의 통합을 제공한다. TightVNC에 따르면 TightVNC는 그림 데이터가 암호화되지 않은 상태로 전송되므로 안전하지 않다. 이를 우회하려면 SSH 연결을 통해 터널링해야 한다(아래 참조).

VNC는 SSH 또는 VPN 연결을 통해 터널링될 수 있으며, 이는 더 강력한 암호화를 통해 추가 보안 계층을 추가한다.

VNC 사용에 대한 추가 보안 문제는 사용 중인 버전이 다른 사람이 장치를 제어하기 전에 원격 컴퓨터 소유자의 승인을 요구하는지 확인하는 것이다. 이렇게 하면 액세스된 컴퓨터의 소유자가 사전 통지 없이 누군가 장치를 제어하고 있음을 깨닫는 상황을 피할 수 있다. 이 보안 기능은 RealVNC 및 UltraVNC와 같은 특정 VNC 서버에 구현되었다.

## 구현

Xvnc는 표준 X 서버를 기반으로 하는 유닉스 VNC 서버이다. 애플리케이션에 대해 Xvnc는 X "서버"(즉, 클라이언트 창을 표시함)로 나타나며, 원격 VNC 사용자에게는 VNC 서버이다. 애플리케이션은 마치 일반 X 디스플레이인 것처럼 Xvnc에 자신을 표시할 수 있지만, 물리적 화면이 아닌 연결된 모든 VNC 뷰어에 나타난다. 또는 화면, 키보드, 마우스가 있는 컴퓨터(워크스테이션 또는 네트워크 서버일 수 있음)를 부팅하고 VNC 서버를 서비스 또는 데몬으로 실행하도록 설정한 다음, 화면, 키보드, 마우스를 제거하고 컴퓨터를 눈에 띄지 않는 위치에 보관할 수 있다.

사용자들은 일반적으로 VNC를 크로스 플랫폼 원격 데스크톱 시스템으로 배포한다. 예를 들어, macOS용 Apple Remote Desktop (및 버전 10.5부터 10.13까지의 "Back to My Mac")은 VNC와 상호 운용되며, x11vnc로 서비스되는 유닉스 사용자의 현재 데스크톱에 연결하거나 TightVNC로 서비스되는 경우 별도의 X11 세션에 연결한다. 유닉스에서 TightVNC는 VNC 옵션이 활성화된 경우 Apple Remote Desktop에서 서비스되는 macOS 세션에 연결하거나 마이크로소프트 윈도우에서 실행 중인 VNC 서버에 연결한다.

VNC를 구현하는 오픈 소스 프로그램 또는 라이브러리에는 Krdc, Krfb, Libvncserver, Remmina, TigerVNC, TightVNC, TurboVNC, UltraVNC, Veyon, Vinagre, VirtualGL, x11vnc, xpra 등이 있다.

## 같이 보기
* 원격 데스크톱 프로토콜
* RealVNC
* RFB 프로토콜
* TightVNC
* UltraVNC

## 각주

## 외부 링크

* RFB 3.8 프로토콜 표준


분류:자유 네트워크 소프트웨어