클라이언트 서버 환경에서 통신

By 01/10/2018OS Concept

클라이언트 서버 환경에서 통신

 

클라이언트 서버 환경의 통신에서도 메시지 전달 기법을 이용하여 통신 한다. 통신 방식에서 3가지 유형에 대해서 살펴 보자.

 

[소캣(Socket)]

소켓(socket)은 통신의 극점(EndPoint)를 뜻한다. 두 프로세스가 네트워크 상에서 통신을 하려면 양 프로세스마다 하나씩 총 두 개의 소켓이 필요하다. 클라이언트 프로세스가 연결을 요청하면 호스트 컴퓨터가 포트 번호를 부여한다. 이때 포트 번호는 1024(0~1024는 시스템 예약)보다 큰 임의의 정수가 사용된다. 모든 연결은 유일 해야 한다.

 

소켓을 이용한 통신은 분산된 프로세스들 간에 널리 사용되고 효율적이기는 하지만 너무 저수준이다. 우선 소켓은 쓰레드들 간에 구조화되지 않은 바이트 스트림만을 통신하도록 하기 때문이다. 이러한 원시적인 바이트 스트림 자료를 구조화 하여 해석하는 것은 클아이언트와 서버의 주요 작업이 된다.

 

[원격 프로시저 호출(remote Procedure Call, RPC)]

RPC는 네트워크에 연결되어 있는 두 시스템 사이의 통신을 위해 프로시저 호출을 추상화 하기 위한 방편으로 설계 되었다.

IPC 방식과는 달리 RPC 통신에서는 전달되는 메시지는 구조화 되어 있고 따라서 데이터의 패킷 수준을 넘어서게 된다.

각 메시지에는 원격지 포트에서 listen 중인 RPC 데몬(daemon)의 주소가 지정되어 있고 수행되어야 할 함수의 식별자, 그리고 그 함수에게 전달 되어야 할 매개변수가 포함된다. 그리고 요청된 함수가 실행되고 어떤 출력이든지 별도의 메시지를 통해 요청자에게 반환 된다.

 

 

포트는 단순히 메시지 패킷의 시작 부분에 포함되는 정수이다. 시스템에서 지원되는 여러 서비스를 구별하기 위해 포트를 여러 개 가질 수 있으며 원격 프로세스가 어떤 서비스를 받고자 하면 그 서비스에 대응되는 적절한 포트 주소로 메시지를 보내야 한다.

 

RPC는 클라이언트가 원격 호스트의 프로시저를 호출하는 것을 마치 자기의 프로시저를 호출하는 것처럼 해 준다. 보통 프로시저마다 다른 스텁(Stub)이 존재 한다. 클라이언트가 원격 프로시저를 호출하면 RPC는 그 에 대응하는 스텁을 호출 하고 원격 프로시저가 필요로 하는 매개변수를 건네 준다. 그러면 스텁이 원격 서버의 포트를 찾고 매개변수를 정돈(marshall)한다. 그 후 스텁은 메시지 전달 기법을 사용하여 서버에게 메시지를 전송 한다. 이에 대응되는 스텁이 서버에도 존재하여 서버 측 스텁이 메시지를 수신한 후 적절한 서버의 프로시저를 호출한다. 필요한 경우 반환 값들도 동일한 방식으로 다시 되돌려 준다.

 

매개변수 정돈(parameter mashalling)이란?

프로시저에게 갈 매개변수를 네트워크로 전송하기 위해 적절한 형태로 재구성 하는 작업

 

주의할 점은 클라이언트와 서버의 자료 표현 방식이 다를 경우와 호출의 의미에 관한 것이다. 지역 프로시저의 경우 극단적인 경우에만 실패 하지만 RPC 경우는 네트워크 오류 때문에 실패할 수 도 있으며 메시지가 중복되어 여러 번 호출 될 수도 있다. 이 문제의 해결은 운영체제가 메세지가 최대 한번 수행되는 것이 아니라 정확히 한번 처리 되도록 보장하는 것을 알 수 있도록 구현 하는 것이다.

 

또 하나의 문제는 클라이언트와 서버간의 통신 문제이다. 일반적인 프로시저의 경우 바인딩(binding)이라는 작업이 링크/적재/실행 시점에 행해진다. 이때 프로시저의 이름이 프로시저의 메모리 주소로 변환 된다. 이와 마찬가지로 RPC도 클라이언트와 서버 포트를 바인딩 해야 하는데 두 시스템에는 공유 메모리가 없기 때문에 상대방에 대한 완전한 정보가 없다. 클라이언트는 서버의 포트 번호를 어떻게 알 수 있을까? 두 가지 방법이 사용 된다.

  • 고정 포트 방법 : 서버가 임의로 포트를 바꿀 수 없음으로 고정된 포트를 사용 할 수 있다.
  • 동적 바인딩 방법 : 운영체제는 미리 정해져 있고 고정 RPC 포트를 통해 동적으로 바인딩 한다. 클라이언트가 자신이 수행하기를 원하는 RPC 이름을 담고 있는 메시지를 랑데부 데몬에게 보내서 RPC이름에 대응하는 포트 번호가 무엇인지 요청하여 알 수 있다.

 

 

[원격 메소드 호출(Remote Method Invocation)]

원격 메소드 호출(Remote Method Invocation)은 JAVA가 제공하는 RPC 기능이다. RMI는 쓰레드로 하여금 원격 객체에 있는 메소드를 호출 할 수 있게 해준다. 자신과 동일한 JVM(java Virtual Machine)에 있지 않는 객체를 원격이라고 정의 하기 때문에 실제 물리적인 다른 컴퓨터일 수도 있으며 같은 컴퓨터에 있으면서도 별도의 JVM에 속한 객체 일수도 있다.

 

RMI는 RPC와 크게 두 가지 다른 점이 있다.

  • RPC는 절차적 프로그래밍을 지원하여 오직 원격 프로시저/ 함수만 호출 될 수 있지만 RMI는 객체 기반으로 원격 객체의 메소드 호출을 지원한다.
  • RPC에서는 원격 프로시저에 전달되는 매개변수가 일반적인 자료구조 이지만 RMI에서는 매개변수로 객체 자체를 원격 메소드에게 전달 해 줄 수 있다. JAVA 프로그램이 매개변수로 객체 자체를 호출할 수 있도록 해준다면 네트워크에 분산되어 있는 JAVA 응용프로그램을 개발 할 수 있다.

 

 

[참고자료]

Operating System Concept / 홍릉과학출판사

 

 

operation system, 운영체제, 운영체제구조, 컴퓨터구조, 컴퓨터일반, 컴퓨터프로세스, 서버간통신, OSConcept, 소켓통신, RPC, sqlmvp, SQL Angeles

 

Leave a Reply