소켓
두 개의 프로세스가 통신하기 위해서는 극점(endpoint)를 갖는 두 개의 소켓이 필요하다.
각 소켓은 IP 주소와 포트 번호 두 가지를 구별한다. 일반적으로 소켓은 클라이언트-서버 구조를 지원한다.
서버 소켓은 클라이언트 소켓의 응답 요청을 대기하며, 클라이언트 프로세스가 연결을 요청하면 호스트 서버에서 포트 번호를 부여한다. 예로, IP 주소 146.80.5.20 호스트가 a 클라이언트에게 웹 서버에 접속하기 위한 포트를 지정할 떄, 포트 1630을 부여한다. 두 호스트 사이에서 데이터 패킷 교환이 생길 때, 해당 패킷들은 목적지 포트 번호가 지정하는 곳에 맞춰 적절한 프로세스 통신이 이루어진다.
소켓 네트워크 도구를 JAVA를 예시로 하여 정리하고자 한다.
TCP 소켓은 Socket 클래스로 구현된다. UDP 소켓은 DatagramSocket 클래스를 사용하고, MulticasSocket 클래스는 DatagramSocket 클래스의 서브 클래스이다. Multicast 소켓은 데이터를 여러 수신자에게 보낼 수 있다.
import java.net.*;
import java.io.*;
public class DataServer
{
public static void main(String[] args)
{
try{
ServerSocket sock = new ServerSocket(6013);
// 서버는 통신 무한루프로 연결 대기중...
while(true)
{
// 소켓 클라이언트 수신 대기
Socket client = sock.accept();
PrintWriter pout = new PrintWriter(client.getOutputStream(), true);
// 서버로부터 통신받은 날짜 출력
pout.println(new java.util.Date().toString());
// 소켓 통신 종료
client.close();
}
}
catch(IOException ioe)
{
System.err.println(ioe);
}
}
}
Java 프로그램으로 작성한 간단한 형식의 소켓 교환은 다음과 같이, new Client() 소켓 객체를 생성하고, 요청을 받은 서버 클라이언트는 println()으로 날짜를 출력 후, 클라이언트는 소켓을 닫고 종료한다. IP 127.0.0.1 루프백(loopback) 은 자기 자신의 지칭하는 IP 주소이다. 이와 같이 사용하게 되면, 같은 기계에 있는 클라이언트와 서버가 TCP/IP 프로토콜을 사용하여 통신하게 된다. 원격 주소지에 127.0.0.1을 사용하지 않고 원격지 주소지를 넣게되면 타 컴퓨터와 프로토콜 교환이 가능하다.
소켓은 ByteStream만을 통신하기 때문에, 원시적인 바이트 스트림 데이터를 구조화하여 해석하기 때문에 낮은 수준의 통신 교환이다. 따라서, 더욱 높은 수준의 통신 기법인 RPC(remote procedure call) 원격 프로시절 호출을 알아보자.
RPC(remote procedure call)
네트워크에 연결되 두 시스템 사이의 통신을 사용하기 위해, 프로세스들이 서로 시스템 위에서 작동하기에 메시지 기반 통신을 하게 된다. RPC는 통신에서 사용되는 메시지는 구조화되어 있고, 데이터의 패킷 수준을 넘게 된다. RPC에는 전달되어야할 매개변수 및 각 RPC의 주소가 저장되어 있다.
RPC는 클라이언트가 원격 호스트의 프로시저 호출하는 것을 마치 자신의 프로시저 호출하는 것처럼 해준다. RPC 시스템은 클라이언트 쪽에 스텁을 제공하여 클라이언트가 원격 프로시저를 호출하면 RPC 는 그에 대응하는 스텁을 호출하고 매개변수를 반환해준다. 그 후, 스텁은 메시지 전달 기법을 사용하여 서버에게 메시지를 전달한다.
RPC의 정확한 호출을 체크하기 위해서, 메시지에 대한 타임스탬프 기능을 제공한다. 이는 서버가 요청 받는 것이 실패하거나 메시지가 중복으로 받아들이는 것을 방지하고자 ACK를 지원한다. 이는 RPC 요청이 수신되고 실행되었다는 것을 의미하는 acknowledegement 메시지를 보내는 것이다. ACK는 네트워킹에서 일반적이며, 클라이언트는 해당 호출에 대한 ACK를 받을 때까지 주기적으로 각 RPC 호출을 재전송해야한다.
클라이언트와 서버는 서로에 대한 정보값을 가질 수 없다.(공유 메모리가 없기 때문에) 두 가지 방식으로 서버의 포트 번호를 알 수 있다.
첫 번째는 , 고정된 주소의 형태를 미리 정해놓는다. 컴파일에 의해 RPC는 고정된 포트 번호를 준다.
두 번째는, 랑데부 방식에 의해 동적으로 바인딩하는 방법이다. 클라이언트가 자신이 실행하기를 원하는 RPC 메시지에 랑데부 디먼을 보내고, RPC는 클라이언트에게 포트 주소를 전달한다. 이후, 클라이언트는 해당 포트 주소에 RPC 요청을 계속 보낸다.
프로시저란?
별도의 코딩이 필요로 하지 않는 다른 주소 공간에서 함수나 프로시저를 실행할 수 있도록 해주는 통신 기법이다.
랑데부 방식이란?
클라이언트가 가능한 n개의 선택지에서 k개의 선택에 대해 분산 합의를 달성할 수 있게 하는 알고리즘이다.