클라이언트/서버 프로그래밍(이하 C/S)은 네트워크(Network) 프로그램 중에 가장 일반적이고, 가장 폭 넓게 사용됩니다; 넓은 의미로 보면 사람들이 많이 하는 온라인 게임, 메신저, P2P 등도 클라이언트/서버 구조에 속합니다;
클라이언트와 서버란?
좀 억지스럽긴 하지만; 굳이 표현하자면 전화를 거는 사람이 클라이언트, 전화를 받는 사람이 서버입니다; 물론, 일반적인 C/S 프로그램은 서버는 하나, 클라이언트는 다수인 경우입니다. (사실, 때에 따라선 서버도 다수, 클라이언트도 다수가 될 수 있지만...) 결국 클라이언트와 서버가 통신을 하기 위해서는 클라이언트가 서버에 접속 요청을 하고; 서버가 이를 수락함으로써 연결이 맺어집니다;
클라이언트와 서버가 연결이 맺어지기 까지의 과정을 소개하자면 다음과 같습니다.
A. 서버가 특정 포트를 오픈(Bind)합니다.
B. 서버가 클라이언트의 연결을 대기(Listen)합니다.
C. 클라이언트가 서버의 특정 포트로 연결(Connect)합니다.
D. 서버가 클라이언트의 연결을 수락(Accept)합니다.
괄호() 안의 용어는 대부분의 소켓(Socket) APIs에서 제공하는 함수 또는 메쏘드의 이름이며, 표준 용어라고 할 수 있습니다. 원칙적이라면 서버가 특정 포트에 바인딩 한다고 표현하는 것이 맞겠지요.
잠깐... 여기서 몇가지 짚고 넘어가야할 이야기가 있습니다;
제가 앞서 기술한 내용은 모두 연결지향성 프로토콜(TCP)을 기준으로 한 내용입니다; 이외에도 일반적으로 네트워크 프로그래밍에 등장하는 비연결지향성 프로토콜(UDP)도 많이 사용되며, 그 외에도 IPX, IP 등 너무 많은 프로토콜이 있지만; 여기선 다 생략하고, 일단 TCP를 기준으로 하겠습니다;
여기까지 썼는데도; 또 생소한 용어들이 또 등장했습니다; 하나 하나 설명하자면!
우선, 소켓(Socket) - 소켓은 앞서 나열한 A~D까지 나열한 실제 행동을 수행하는 녀석입니다. 결국 클라이언트든, 서버든, 실제로는 소켓이란 녀석이 Bind 되고, Listen을 하고, Connect도 하고, Accept도 합니다. Send와 Receive도 다 소켓이 합니다. 따라서, 굳이 나누자면 서버 프로그램에서 구현한 소켓은 서버 측 소켓, 클라이언트 프로그램에서 구현한 소켓은 클라이언트 측 소켓으로 말 할 수 있습니다.
포트(Port) - 포트는 실제 네트워크 상에서 패킷이 오가는 통로입니다. 서버 측 소켓과 클라이언트 측 소켓을 이어주는 하나의 길이라고 생각하면 되겠네요. 몇몇 좋은(?) 회사들은 메신저를 사용하지 못하도록 방화벽으로 차단을 합니다. 이 때 방화벽은 실제로 메신저가 사용하는 포트를 차단함으로써 메신저를 무용지물로 만듭니다; 일반적으로 윈도우즈에서는 1 ~ 65535의 포트가 사용됩니다; 우리가 늘 업무 시간에도 몰래 몰래 하는 인터넷 서핑은 80번, FTP는 21번, MySQL은 3306번을 사용합니다. 이 때 포트는 TCP, UDP 구분을 해서 씁니다; 여기서 중요한 사실은 이미 사용 중인 포트는 다른 소켓에서 사용할 수 없습니다; 따라서; 일반적으로 네트워크 프로그램을 개발할 때는 O/S 및 기존의 잘 알려진 프로그램에서 사용하는 포트가 집중되어 있는 1024번 이후의 포트를 사용합니다.
프로토콜(Protocol) - 프로토콜은 사전적 의미 그대로 규약입니다. 예를 들면, 저와 미국 친구가 전화를 하는데; 저는 우리나라 말로 얘기하고, 미국 친구는 영어로 얘기한다면; 정상적인 대화가 될 수가 없습니다; (저는 영어를 모르고, 친구는 우리 말을 모르기 때문이지요.) 네트워크 상에서도 그런 불상사를 막기 위해; 몇 몇 상황에 맞도록 규약(약속)을 만들었는데, 그것이 TCP, UDP 같은 것들입니다. 만약; 서버에서 TCP로 소켓을 생성하여 통신을 하도록 한다면; 당연히 클라이언트도 TCP로 소켓을 생성하여 통신을 해야합니다; TCP나 UDP는 구현 하는 목적에 맞게 쓰면 됩니다; TCP나 UDP에 대해서도 소개하자면; 내용이 많기에 다음 기회로 넘기겠습니다.
지금까지 아주 짧게나마; 클라이언트/서버 프로그래밍에서 처음 접하게 되는 기초 개념을 살펴보았습니다.
다시 짚고 넘어가자면; 클라이언트/서버 프로그램에서 가장 중요한 핵심은 소켓이고; 소켓을 통해 클라이언트와 서버가 통신 하기 까지는 A~D 과정을 통해서 이루어진다는 사실을 기억해야 합니다. 그리고, 포트와 프로토콜에 대해서도 간략히 살펴보았네요;
다음 아티클에서는 소켓과 프로토콜을 실제 코드를 통해 좀 더 기술할 수 있도록 하겠습니다;
클라이언트와 서버란?
좀 억지스럽긴 하지만; 굳이 표현하자면 전화를 거는 사람이 클라이언트, 전화를 받는 사람이 서버입니다; 물론, 일반적인 C/S 프로그램은 서버는 하나, 클라이언트는 다수인 경우입니다. (사실, 때에 따라선 서버도 다수, 클라이언트도 다수가 될 수 있지만...) 결국 클라이언트와 서버가 통신을 하기 위해서는 클라이언트가 서버에 접속 요청을 하고; 서버가 이를 수락함으로써 연결이 맺어집니다;
클라이언트와 서버가 연결이 맺어지기 까지의 과정을 소개하자면 다음과 같습니다.
A. 서버가 특정 포트를 오픈(Bind)합니다.
B. 서버가 클라이언트의 연결을 대기(Listen)합니다.
C. 클라이언트가 서버의 특정 포트로 연결(Connect)합니다.
D. 서버가 클라이언트의 연결을 수락(Accept)합니다.
괄호() 안의 용어는 대부분의 소켓(Socket) APIs에서 제공하는 함수 또는 메쏘드의 이름이며, 표준 용어라고 할 수 있습니다. 원칙적이라면 서버가 특정 포트에 바인딩 한다고 표현하는 것이 맞겠지요.
잠깐... 여기서 몇가지 짚고 넘어가야할 이야기가 있습니다;
제가 앞서 기술한 내용은 모두 연결지향성 프로토콜(TCP)을 기준으로 한 내용입니다; 이외에도 일반적으로 네트워크 프로그래밍에 등장하는 비연결지향성 프로토콜(UDP)도 많이 사용되며, 그 외에도 IPX, IP 등 너무 많은 프로토콜이 있지만; 여기선 다 생략하고, 일단 TCP를 기준으로 하겠습니다;
여기까지 썼는데도; 또 생소한 용어들이 또 등장했습니다; 하나 하나 설명하자면!
우선, 소켓(Socket) - 소켓은 앞서 나열한 A~D까지 나열한 실제 행동을 수행하는 녀석입니다. 결국 클라이언트든, 서버든, 실제로는 소켓이란 녀석이 Bind 되고, Listen을 하고, Connect도 하고, Accept도 합니다. Send와 Receive도 다 소켓이 합니다. 따라서, 굳이 나누자면 서버 프로그램에서 구현한 소켓은 서버 측 소켓, 클라이언트 프로그램에서 구현한 소켓은 클라이언트 측 소켓으로 말 할 수 있습니다.
포트(Port) - 포트는 실제 네트워크 상에서 패킷이 오가는 통로입니다. 서버 측 소켓과 클라이언트 측 소켓을 이어주는 하나의 길이라고 생각하면 되겠네요. 몇몇 좋은(?) 회사들은 메신저를 사용하지 못하도록 방화벽으로 차단을 합니다. 이 때 방화벽은 실제로 메신저가 사용하는 포트를 차단함으로써 메신저를 무용지물로 만듭니다; 일반적으로 윈도우즈에서는 1 ~ 65535의 포트가 사용됩니다; 우리가 늘 업무 시간에도 몰래 몰래 하는 인터넷 서핑은 80번, FTP는 21번, MySQL은 3306번을 사용합니다. 이 때 포트는 TCP, UDP 구분을 해서 씁니다; 여기서 중요한 사실은 이미 사용 중인 포트는 다른 소켓에서 사용할 수 없습니다; 따라서; 일반적으로 네트워크 프로그램을 개발할 때는 O/S 및 기존의 잘 알려진 프로그램에서 사용하는 포트가 집중되어 있는 1024번 이후의 포트를 사용합니다.
프로토콜(Protocol) - 프로토콜은 사전적 의미 그대로 규약입니다. 예를 들면, 저와 미국 친구가 전화를 하는데; 저는 우리나라 말로 얘기하고, 미국 친구는 영어로 얘기한다면; 정상적인 대화가 될 수가 없습니다; (저는 영어를 모르고, 친구는 우리 말을 모르기 때문이지요.) 네트워크 상에서도 그런 불상사를 막기 위해; 몇 몇 상황에 맞도록 규약(약속)을 만들었는데, 그것이 TCP, UDP 같은 것들입니다. 만약; 서버에서 TCP로 소켓을 생성하여 통신을 하도록 한다면; 당연히 클라이언트도 TCP로 소켓을 생성하여 통신을 해야합니다; TCP나 UDP는 구현 하는 목적에 맞게 쓰면 됩니다; TCP나 UDP에 대해서도 소개하자면; 내용이 많기에 다음 기회로 넘기겠습니다.
지금까지 아주 짧게나마; 클라이언트/서버 프로그래밍에서 처음 접하게 되는 기초 개념을 살펴보았습니다.
다시 짚고 넘어가자면; 클라이언트/서버 프로그램에서 가장 중요한 핵심은 소켓이고; 소켓을 통해 클라이언트와 서버가 통신 하기 까지는 A~D 과정을 통해서 이루어진다는 사실을 기억해야 합니다. 그리고, 포트와 프로토콜에 대해서도 간략히 살펴보았네요;
다음 아티클에서는 소켓과 프로토콜을 실제 코드를 통해 좀 더 기술할 수 있도록 하겠습니다;
Trackback
Trackback Address :: http://www.nohungry.net/tt1/trackback/161

Comments