본문 바로가기

공부 기록/OS

[OS/공룡책] Chapter 3. 프로세스 - 클라이언트 서버 환경에서 통신

소켓

- 소켓(socket)은 통신의 극점(endpoint)을 뜻한다.

- 각 소켓은 IP 주소와 포트 번호 두 가지를 접합해서 구별한다.

- 일반적으로 소켓은 클라이언트-서버 구조를 사용한다.


- 모든 연결은 유일해야 한다. 호스트 X에 있는 다른 클라이언트 프로세스가 위와 동일한 웹 서버와 통신을 하면 그 클라이언트는 1024보다 크고 1625가 아닌 다른 포트 번호를 부여받게 된다. 이것은 모든 연결이 유일한 소켓 쌍으로 구성되는 것을 보장한다.


- Java는 세 가지 종류의 소켓을 제공한다.

   - 연결 기반(TCP) 소켓 => Socket 클래스

   - 비연결성(UDP) 소켓 => DatagramSocket 클래스

   - MulticastSocket 클래스(DatagramSocket 클래스의 서브 클래스)

 

- 위의 예제 프로그램에서 서버는 6013 포트를 listen하고 있으며, 연결이 수신되면 서버는 클라이언트에게 현재 날짜와 시간을 보내준다.

- 서버는 accept() 메소드에서 클라이언트가 연결을 요청할 때까지 봉쇄된다. 연결 요청이 들어오면 accept()는 클라이언트와 통신하기 위해 사용할 수 있는 소켓을 반환한다.


- 소켓을 이용한 통신은 분산된 프로세스 간에 널리 사용되고 효율적이기는 하지만 너무 낮은 수준이다. 소켓은 스레드 간에 구조화되지 않은 바이트 스트림만을 통신하도록 하기 때문이다. 이러한 원시적인 바이트 스트림 데이터를 구조화하여 해석하는 것은 클라이언트와 서버의 책임이 된다.


원격 프로시저 호출(RPC)

- 원격 서비스와 관련한 가장 보편적인 형태 중 하나는 RPC 패러다임으로서, 네트워크에 연결된 두 시스템 사이의 통신에 사용하기 위하여 프로시저 호출 기법을 추상화하는 방법으로 설계되었다.

- RPC는 클라이언트가 원격 호스트의 프로시저 호출하는 것을 마치 자기의 프로시저 호출하는 것처럼 해준다.

- RPC 시스템은 클라이언트 쪽에 스텁을 제공하여 통신을 하는 데 필요한 자세한 사항들을 숨겨 준다.

 

- 클라이언트가 원격 프로시저 호출 -> RPC는 그에 대응하는 스텁 호출 & 원격 프로시저가 필요로 하는 매개변수 건네어줌 -> 스텁이 원격 서버의 포트를 찾고 매개변수 정돈* -> 스텁은 서버에게 메시지 전송 -> 이에 대응되는 서버 측 스텁이 메시지 수신 & 적절한 서버의 프로시저 호출

* 매개변수 정돈은 클라이언트와 서버 기기의 데이터 표현 방식의 차이 문제를 해결한다.

- Windows에서 스텁 코드는 MIDL(Microsoft Interface Definition Language)로 작성된 명세로부터 컴파일된다. => MIDL은 클라이언트와 서버 프로그램 사이의 인터페이스를 정의하는 데 사용된다.

- 대부분의 RPC 시스템은 기종 중립적인 데이터 표현 방식을 정의한다. => 그 중 하나가 XDR(External Data Representation)이다.


- RPC는 여러 문제로 인해 실패할 수 있다. => 운영체제가 메시지가 정확히 한 번 처리되도록 보장하게 해야 한다.

- PRC도 클라이언트와 서버의 포트를 바인딩 해야 한다. 그러나 두 시스테에는 모두 상대방에 대한 완전한 정보가 없다(공유 메모리가 없기 때문에).

   - 방법1 : 고정된 포트 주소 형태로 미리 정해놓는다.

   - 방법2 : 랑데부 방식에 의해 동적으로 바인딩한다.

- RPC는 분산 파일 시스템(DFS)을 구현하는 데 유용하다. => 몇 개의 RPC deamon과 클라이언트로 구현할 수 있다.


- 안드로이드 운영체제는 바인더 프레임워크에 포함된 풍부한 IPC 기법의 집합을 가지고 있는데, 이 중 RPC는 프로세스가 다른 프로세스의 서비스를 요청할 수 있게 한다.