본문 바로가기
IT

소켓과 윈도우 소켓에 대해

by 미니송 2017. 8. 27.



소켓(SOCKET)과 윈도우 소켓 설명


이번 포스팅은 소켓과 윈도우 소켓에 대해 하겠습니다. 소켓은 외국에서 콘센트 구멍을 뜻하는 말입니다. 콘센트 구멍처럼 연결할 수 있도록 만들어 주는 것이 바로 소켓입니다. 소켓은 네트워크 프로그램을 구현할 수 있도록 해줍니다.


네트워크 프로그래밍이란 멀리 떨어져 있는 호스트들이 서로 데이터를 주고 받을 수 있도록 프로그램을 구현하는 것을 말합니다. 소켓(SOCKET)이란 네트워크 프로그래밍 과정에서 대상이 멀리 떨어져 있기 때문에 소프트웨어 차원에서 호스트들간을 연결해주는 장치를 말합니다. 소켓과 윈도우에서 사용하는 윈속에 대해 설명해 보도록 하겠습니다.

 

클라이언트-서버 모델

소켓프로그래밍에서 중요한 개념입니다. 네트워크 프로그램은 일반적으로 클라이언트 서버 모델로 작성합니다. 여기서 클라이언트-서버는 두 프로그램이 상호 작용하는 방식입니다. 서비스를 요청하는 쪽을 클라이언트, 클라이언트가 요청하는 서비스를 처리하는 쪽을 서버라고 부릅니다.


클라이언트-서버 모델을 한 컴퓨터에서 실행되는 두 프로그램에 적용할 경우에는 다양한 프로세스간 통신(Inter-process Communication) 기법을 사용해 데이터를 주고받을 수 있습니다. 반면 네트워크로 연결된 컴퓨터에서 실행되는 두 프로그램에 적용할 경우에는 반드시 통신 프로토콜을 사용해야만 데이터를 주고 받을 수 있습니다.


클라이언트-서버 모델에서 접속이 성공하려면 한 프로세스가 먼저 실행하여 대기하고, 다른 프로세스가 나중에 실행하여 접속하면 됩니다. 이때 먼저 실행하는 쪽이 서버, 나중에 실행하는 쪽이 클라이언트입니다. 클라이언트가 서버에 접속하려면 서버의 IP주소와 포트번호를 알고 있어야 합니다. 그러나 서버는 클라이언트의 주소를 알 필요가 없습니다. 클라이언트가 보낸 패킷에 주소 정보가 모두 들어있기 때문입니다.

 

소켓이란?

네트워크 통신을 하려면 하드웨어 신호처리, 장치 드라이버의 하드웨어 제어, 운영체제의 프로토콜 구현 등 여러 계층의 협력이 필요합니다. 소켓은 간단하게 설명하자면 포트번호와 IP주소 등의 통신 관련 정보를 포괄하는 개념으로 볼 수 있습니다.


소켓 프로그래밍에서 소켓이란 1. 데이터 타입 2. 통신 종단점 3. 네트워크 프로그래밍 인터페이스 세가지를 의미합니다.

 

데이터 타입

운영체제는 내부적으로 이와 같은 정보를 결정하고 관리하는데, 응용프로그램은 소켓을 사용해 이 정보에 접근할 수 있습니다. 프로그래밍 관점에서 소켓은 생성과 설정 과정이 끝나면 운영체제의 통신관련 정보를 참조해 다양한 작업을 편리하게 할 수 있는 데이터 타입으로 볼 수 있습니다.


소켓은 파일 디스크립터 혹은 핸들과 유사한 개념으로, 일단 만들고 나면 함수를 호출하여 손쉽게 네트워크 통신을 수행할 수 있습니다.

 

SOCKET sock = socket( ); // 소켓 생성

recv(sock, ...) // 데이터 받기

send(sock, ...) // 데이터 보내기


위와 같이 소켓을 생성하면 함수를 호출하고 소켓을 통하여 데이터를 받거나 보낼 수 있습니다. 응용프로그램이 통신을 하려면 다음과 같은 요소가 결정되어야 합니다.

사용할 프로토콜, 송신 IP 주소, 포트 번호, 수신 IP주소, 포트번호 가 결정되어야 합니다.

 

통신 종단점

소켓은 응용프로그램 관점에서 통신종단점(communication end point)라고 볼 수 있습니다. 통신의 출발점과 도착점이라고 생각하면 됩니다. 서버-클라이언트 모델이 있다고 하면 그 사이에서 통신을 시작하고 끝나는 지점이 소켓이라고 생각하면 됩니다.


소켓은 위에 이야기 한 것처럼 프로토콜과 송신IP주소, 송신 포트번호, 수신IP주소, 수신 포트번호 등의 정보를 가지고 있기 때문에 종단점 역할을 할 수 있습니다. 따라서 클라이언트는 자신의 소켓이 서버 소켓과 연결된 것으로 생각하고 send()함수나 recv()함수를 호출해서 데이터를 받거나 보낼 수 있습니다.

 

네트워크 프로그래밍 인터페이스

TCP/IP프로토콜의 관점에서 소켓은 네트워크 프로그래밍 인터페이스에 불과합니다. 따라서 응용프로그램이 통신하기 위해 양쪽 모두 소켓을 사용해야 하는 것은 아닙니다. 둘다 같은 프로토콜을 사용하고 정해진 형태과 절차에 따라 데이터를 주고 받으면 됩니다. 소켓은 일반적으로 응용계층과 전송계층 사이에 위치하는 것으로 간주합니다. 하지만 전송계층을 건너뛰고 바로 인터넷 계층을 사용할 수도 있습니다.

 

윈도우 소켓(윈속)

소켓은 버클리 유늑스에서 개발한 네트워크 프로그래밍 인터페이스입니다. 이를 윈도우 환경에서 사용할 수 있게 만든 것이 윈도우 소켓(Windows Sockets)입니다. 줄여서 윈속이라고 합니다. 윈속은 윈도우 95버전부터 API(Application Programming Interface)에 정식으로 포함하여 제공하고 있습니다.

 

윈도우 소켓 특징

윈도우 소켓은 유닉스 소켓에 기반을 둔 네트워크 프로그래밍 인터페이스이므로 소스코드 수준에서 비교적 호환성이 높습니다. 하지만 유닉스 소켓 프로그래밍과 다른 특징이 있습니다. 윈도우로 소켓을 공부해도 동작하는 원리만 안다면 다른 플랫폼에서도 충분히 활용가능할 것으로 생각됩니다.


윈도우 소켓은 DLL(Dynamic Link Library)을 통해 대부분의 기능이 제공되므로 DLL 초기화와 종료 작업을 위한 함수가 필요합니다. 윈도우 프로그램은 GUI를 갖추고 메시지 구동 방식으로 동작하므로 이를 위한 확장 함수가 존재합니다. 윈도우는 운영체제 차원에서 멀티스레드를 지원하므로 멀티스레드 환경에서 안정적으로 동작하는 구조와 이를 위한 함수가 필요합니다.


윈속 1.x버전에서 유닉스 소켓과 호환성을 제공하면서 TCP/IP 프로토콜을 지원하는 것을 목표로 설계되었다. 그러나 2.x버전부터는 다양한 프로토콜을 지원하도록 구조를 변경하고 함수를 추가하였습니다.


윈속을 사용하면 많은 장점이 있습니다. 유닉스 소켓과 소스코드 수준에서 호환성이 높으므로 기존 코드를 이식하여 활용하기 쉽습니다. 윈도우에서 개발 하였더라도 유닉스로 가져갈 수 있다는 말이 됩니다.


가장 널리 사용하는 네트워크 프로그래밍 인터페이스므로 한번 배우면 여러 운영체제에서 사용할 수 있습니다. TCP/IP 외의 프로토콜도 지원하므로 최소 코드 수정으로 응용프로그램이 사용할 프로토콜을 변경할 수 있습니다.


저수준(low-level or mid-level) 프로그래밍 인터페이스므로, 세부제어가 가능하며 고성능 네트워크 프로그램을 개발할 수 있습니다.

하지만 단점도 있습니다. 응용프로그램 수준의 프로토콜을 프로그래머가 직접 설계해야 합니다. 주고받는 데이터 형식이나 절차 등을 고려해 프로그래밍 해야 하며, 설계 변경시에는 코드를 수정할 수 밖에 없습니다.


서로 다른 바이트정렬(byte ordering) 방식을 사용하거나 데이터 처리 단위가 다른 호스트끼리 통신할 경우, 응용프로그램 수준에서 데이터 변환을 처리해야 합니다.

 

'IT' 카테고리의 다른 글

스레드(Thread)와 프로세스(Process)  (0) 2017.08.29
인공지능 스피커 및 종류에 대해  (2) 2017.08.28
VR과 AR의 개념과 적용사례  (0) 2017.08.25
클래시로얄 2vs2 전투  (0) 2017.08.23
안드로이드 8.0 오레오(Oreo)  (0) 2017.08.22

댓글