터미널 서버 연습: 시작, 연결 및 애플리케이션

이 문서에서는 터미널 서버의 초기화 프로세스를 설명하고 사용자가 서버에 연결하고 애플리케이션을 실행할 때 발생하는 상황에 대해 설명합니다.

적용 대상: Windows Server 2012 R2
원래 KB 번호: 186572

Windows 터미널 서버 초기화

Windows 터미널 서버가 코어 운영 체제를 부팅하고 로드하면 터미널 서버 서비스(Termsrv.exe)가 시작되고 들어오는 연결을 수신 대기하는 수신 대기 스택(프로토콜 및 전송 쌍당 하나씩)을 만듭니다. 각 연결에는 터미널 서버에 대한 개별 세션을 나타내는 고유한 세션 식별자 또는 "SessionID"가 제공됩니다. 세션 내에서 만든 각 프로세스는 연결된 SessionID로 "태그가 지정"되어 네임스페이스를 다른 연결의 네임스페이스와 구분합니다.

콘솔(터미널 서버 키보드, 마우스 및 비디오) 세션은 항상 가장 먼저 로드되며 특수한 경우 클라이언트 연결로 처리되고 SessionID가 할당됩니다. 콘솔 세션은 구성된 Windows NT 디스플레이, 마우스 및 키보드 드라이버가 로드된 일반 Windows NT 시스템 세션으로 시작됩니다.

그런 다음 터미널 서버 서비스는 Windows NT 세션 관리자(Smss.exe)를 호출하여 클라이언트 연결을 기다리는 두 개의(기본값 = 2) 유휴 클라이언트 세션(콘솔 세션을 만든 후)을 만듭니다. 유휴 세션을 만들기 위해 Session Manager는 Windows NT 기반 클라이언트/서버 런타임 하위 시스템 프로세스(Csrss.exe)를 실행하고 해당 프로세스에 새 SessionID가 할당됩니다. 또한 CSRSS 프로세스는 새로 연결된 SessionID에서 Winlogon(Winlogon.exe) 프로세스 및 Win32k.sys(창 관리자 및 그래픽 디바이스 인터페이스 - GDI) 커널 모듈을 호출합니다. 수정된 Windows NT 이미지 로더는 이미지 헤더에 미리 정의된 비트 집합에 의해 이 Win32k.sys SessionSpace 로드 가능한 이미지로 인식합니다. 그런 다음, Win32k.sys 아직 로드되지 않은 경우 해당 세션에 대한 가상 커널 주소 공간의 포인터를 사용하여 이미지의 코드 부분을 실제 메모리로 재배치합니다. 기본적으로 메모리에 이미 있는 경우 이전에 로드한 이미지의 코드(Win32k.sys)에 항상 연결됩니다. 예를 들어 모든 활성 애플리케이션 또는 세션에서.

그러면 이 이미지의 데이터(또는 공유되지 않음) 섹션이 새로 만든 SessionSpace 페이징 가능 커널 메모리 섹션에서 새 세션에 할당됩니다. 콘솔 세션과 달리 터미널 서버 클라이언트 세션은 디스플레이, 키보드 및 마우스에 대해 별도의 드라이버를 로드하도록 구성됩니다.

새 디스플레이 드라이버는 RDP(원격 데스크톱 프로토콜) 디스플레이 디바이스 드라이버이며 Tsharedd.dll. 마우스 및 키보드 드라이버는 여러 instance 스택 관리자를 통해 스택으로 통신하고 termdd.sys. Termdd.sys Wdtshare.sys RDP 드라이버와 마우스 및 키보드 작업에 대한 메시지를 보냅니다. 이러한 드라이버를 사용하면 RDP 클라이언트 세션을 원격으로 사용할 수 있고 대화형으로 사용할 수 있습니다. 마지막으로 터미널 서버는 TCP 포트 번호 3389에서 RDP 클라이언트 연결을 수신 대기하는 여러 instance 스택 관리자(Termdd.sys)에서 다시 관리되는 RDP 프로토콜에 대한 연결 수신기 스레드도 호출합니다.

이 시점에서 CSRSS 프로세스는 자체 SessionID 네임스페이스 아래에 있으며 필요에 따라 프로세스별로 데이터가 인스턴스화됩니다. 이 SessionID 내에서 만든 모든 프로세스는 CSRSS 프로세스의 SessionSpace 내에서 자동으로 실행됩니다. 이렇게 하면 다른 SessionID가 있는 프로세스가 다른 세션의 데이터에 액세스하지 못하게 됩니다.

클라이언트 연결

RDP 클라이언트는 모든 Windows 기반 터미널(WinCE 기반), TCP/IP-32b를 실행하는 Windows for Workgroups 3.11 또는 Microsoft Win32 API 기반 플랫폼에서 설치 및 실행할 수 있습니다. Windows 기반이 아닌 클라이언트는 Citrix 메타프레임 추가 기능에서 지원됩니다. Windows for Workgroups RDP 클라이언트의 실행 파일 크기는 약 70KB이고, 300KB 작업 집합을 사용하며, 표시 데이터에 100KB를 사용합니다. Win32 기반 클라이언트의 크기는 약 130KB이며 디스플레이 데이터에는 300KB 작업 집합과 100KB를 사용합니다.

클라이언트는 TCP 포트 3389를 통해 터미널 서버에 대한 연결을 시작합니다. 터미널 서버 RDP 수신기 스레드는 세션 요청을 검색하고 새 세션 요청을 처리하는 새 RDP 스택 instance 만듭니다. 수신기 스레드는 들어오는 세션을 새 RDP 스택 instance 전달하고 추가 연결 시도를 위해 TCP 포트 3389에서 계속 수신 대기합니다. 각 RDP 스택은 클라이언트 세션이 연결되어 세션 구성 세부 정보의 협상을 처리할 때 만들어집니다. 첫 번째 세부 정보는 세션에 대한 암호화 수준을 설정하는 것입니다. 터미널 서버는 처음에 낮음, 중간 및 높음의 세 가지 암호화 수준을 지원합니다.

낮은 암호화는 클라이언트에서 터미널 서버로 전송되는 패킷만 암호화합니다. 이 "입력 전용" 암호화는 사용자의 암호와 같은 중요한 데이터의 입력을 보호하기 위한 것입니다. 중간 암호화는 클라이언트에서 나가는 패킷을 하위 수준 암호화와 동일하게 암호화하지만 터미널 서버에서 클라이언트로 반환되는 모든 표시 패킷도 암호화합니다. 이 암호화 방법은 원격 화면에 표시되도록 네트워크를 통해 이동하므로 중요한 데이터를 보호합니다. 낮음 및 중간 암호화는 모두 40비트 키와 함께 Microsoft-RC4 알고리즘(향상된 성능으로 수정된 RC4 알고리즘)을 사용합니다. 높은 암호화는 클라이언트를 오가는 양방향으로 패킷을 암호화하지만 40비트 키와 함께 업계 표준 RC4 암호화 알고리즘을 다시 사용합니다. 내보내지 않는 버전의 Windows NT 터미널 서버는 128비트 상위 수준 RC4 암호화를 제공합니다.

설치되는 일반적인 시스템 글꼴을 확인하기 위해 클라이언트와 서버 간에 글꼴 교환이 발생합니다. 클라이언트는 RDP 세션 중에 텍스트를 더 빠르게 렌더링할 수 있도록 설치된 모든 시스템 글꼴을 터미널 서버에 알립니다. 터미널 서버가 클라이언트에서 사용할 수 있는 글꼴을 알고 있는 경우 더 큰 비트맵이 아닌 압축된 글꼴 및 유니코드 문자 문자열을 클라이언트에 전달하여 네트워크 대역폭을 저장할 수 있습니다.

기본적으로 모든 클라이언트는 아이콘, 도구 모음, 커서 등과 같은 비트맵을 캐시하는 데 사용되는 비트맵 캐시에 대해 1.5MB의 메모리를 예약하지만 유니코드 문자열을 보유하는 데는 사용되지 않습니다. 캐시는 (레지스트리 키를 통해) 튜닝할 수 있으며 LRU(최소 최근 사용) 알고리즘을 사용하여 덮어씁니다. 터미널 서버에는 상수 비트스트림이 아닌 클라이언트에 대한 화면 새로 고침의 흐름 제어 전달을 가능하게 하는 버퍼도 포함되어 있습니다. 클라이언트에서 사용자 상호 작용이 높은 경우 버퍼는 초당 약 20회 플러시됩니다. 유휴 시간 동안 또는 사용자 상호 작용이 없는 경우 버퍼는 초당 10번만 플러시하도록 느려집니다. 레지스트리를 통해 이러한 모든 숫자를 튜닝할 수 있습니다.

세션 세부 정보가 협상되면 이 연결에 대한 서버 RDP 스택 instance 기존 유휴 Win32k 사용자 세션에 매핑되고 사용자에게 Windows NT 로그온 화면이 표시됩니다. 자동 로그온이 구성된 경우 암호화된 사용자 이름과 암호가 터미널 서버에 전달되고 로그온이 진행됩니다. 현재 유휴 Win32k 세션이 없는 경우 터미널 서버 서비스는 SMSS(세션 관리자)를 호출하여 새 세션에 대한 새 사용자 공간을 만듭니다. Win32k 사용자 세션의 대부분은 공유 코드를 활용하고 있으며 한 instance 이전에 로드한 후 눈에 띄게 빠르게 로드됩니다.

사용자가 사용자 이름과 암호를 입력하면 패킷이 터미널 서버로 암호화됩니다. 그런 다음 Winlogon 프로세스는 필요한 계정 인증을 수행하여 사용자가 로그온할 권한이 있는지 확인하고 사용자의 도메인 및 사용자 이름을 도메인/사용자 이름 SessionID 목록을 유지하는 터미널 서버 서비스에 전달합니다. SessionID가 이미 이 사용자와 연결되어 있는 경우(예: 연결이 끊긴 세션이 있음) 현재 활성 세션 스택이 이전 세션에 연결됩니다. 그런 다음 초기 로그온에 사용되는 임시 Win32 세션이 삭제됩니다. 그렇지 않으면 연결이 정상적으로 진행되고 터미널 서버 서비스가 새 도메인/사용자 이름 SessionID 매핑을 만듭니다. 어떤 이유로 이 사용자에 대해 둘 이상의 세션이 활성화된 경우 세션 목록이 표시되고 사용자가 다시 연결하도록 선택할 세션을 결정합니다.

애플리케이션 실행

사용자 로그온 후 데스크톱(또는 단일 애플리케이션 모드인 경우 애플리케이션)이 사용자에 대해 표시됩니다. 사용자가 실행할 32비트 애플리케이션을 선택하면 마우스 명령이 터미널 서버로 전달되어 선택한 애플리케이션을 새 가상 메모리 공간(2GB 애플리케이션, 2GB 커널)으로 시작합니다. 터미널 서버의 모든 프로세스는 가능한 한 커널 및 사용자 모드로 코드를 공유합니다. 프로세스 간의 코드 공유를 위해 Windows NT VM(가상 메모리) 관리자는 쓰기 중 복사 페이지 보호를 사용합니다. 여러 프로세스가 동일한 메모리 콘텐츠를 읽고 쓰려는 경우 VM 관리자는 메모리 영역에 쓰기 중 복사 페이지 보호를 할당합니다. 프로세스(세션)는 쓰기 작업이 수행될 때까지 동일한 메모리 콘텐츠를 사용합니다. 이때 VM 관리자는 실제 페이지 프레임을 다른 위치로 복사하고 프로세스의 가상 주소를 업데이트하여 새 페이지 위치를 가리키고 페이지를 읽기/쓰기로 표시합니다. 쓰기에 복사는 터미널 서버에서 실행되는 애플리케이션에 유용하고 효율적입니다.

Microsoft Word 같은 Win32 기반 애플리케이션이 한 프로세스(세션)에 의해 실제 메모리에 로드되면 쓰기에 복사로 표시됩니다. 새 프로세스(세션)도 Word 호출하는 경우 이미지 로더는 애플리케이션이 이미 메모리에 로드되어 있으므로 새 프로세스(세션)를 기존 복사본으로 가리킵니다. 버퍼 및 사용자별 데이터가 필요한 경우(예: 파일에 저장) 필요한 페이지는 새 실제 메모리 위치에 복사되고 개별 프로세스(세션)에 대한 읽기/쓰기로 표시됩니다. VM 관리자는 이 메모리 공간을 다른 프로세스로부터 보호합니다. 그러나 대부분의 애플리케이션은 공유 가능한 코드이며 실행 횟수에 관계없이 실제 메모리에 단일 instance 코드만 있습니다.

터미널 서버 환경에서 32비트 애플리케이션을 실행하는 것이 좋습니다(필요하지는 않지만). 32비트 애플리케이션(Win32)을 사용하면 코드 공유를 허용하고 다중 사용자 세션에서 보다 효율적으로 실행할 수 있습니다. Windows NT 각 Win16 애플리케이션이 실행되도록 VDM(가상 MS-DOS 기반 컴퓨터)을 만들어 Win32 환경에서 16비트 애플리케이션(Win16)을 실행할 수 있습니다. 모든 16비트 출력은 필요한 작업을 수행하는 Win32 호출로 변환됩니다. Win16 앱은 자체 VDM 내에서 실행되므로 여러 세션의 애플리케이션 간에 코드를 공유할 수 없습니다. Win16과 Win32 호출 간의 변환은 시스템 리소스도 사용합니다. 터미널 서버 환경에서 Win16 애플리케이션을 실행하면 비슷한 Win32 기반 애플리케이션보다 두 배의 리소스를 사용할 수 있습니다.

세션 연결 끊기 및 사용자 로그오프

세션 연결 끊기

사용자가 세션의 연결을 끊기로 결정하면 다른 프로세스에 실제 메모리가 필요한 경우 프로세스와 모든 가상 메모리 공간이 남아 실제 디스크로 페이징됩니다. 터미널 서버는 도메인/사용자 이름 및 연결된 SessionID의 매핑을 유지하므로 동일한 사용자가 다시 연결되면 기존 세션이 로드되고 다시 사용할 수 있게 됩니다. RDP의 또 다른 이점은 사용자가 세션에 대해 요청하는 내용에 따라 세션 화면 해상도를 변경할 수 있다는 것입니다. 예를 들어 사용자가 이전에 터미널 서버 세션에 800 x 600 해상도로 연결하고 연결이 끊어진 경우를 가정해 보겠습니다. 그런 다음 사용자가 640 x 480 해상도만 지원하는 다른 컴퓨터로 이동하고 기존 세션에 다시 연결하는 경우 새 해상도를 지원하기 위해 데스크톱이 다시 그려질 것입니다.

사용자 로그오프

로그오프는 일반적으로 구현이 간단합니다. 사용자가 세션에서 로그오프한 후 SessionID와 연결된 모든 프로세스가 종료되고 세션에 할당된 모든 메모리가 해제됩니다. 사용자가 Microsoft Word 같은 32비트 애플리케이션을 실행하고 세션에서 로그오프하는 경우 마지막 사용자가 애플리케이션에서 종료될 때까지 애플리케이션 자체의 코드가 메모리에 유지됩니다.