본문 바로가기

서버운영 (TA, ADMIN)/네트워크

[네트워크] 소켓과 윈도우 소켓

소켓 이란?

네트워크 프로그램 역시 통신의 내부 처리 과정을 이해하지 못해도 데이터를 초기화하고 정해진 절차에 따라 함수를 호출하는 작업만으로 만들 수 있습니다.


네트워크 프로그램을 제작하는 방법은 다양하지만, 다양한 플랫폼에서 널리 사용되는 것이 소켓 프로그래밍 방식입니다. 소켓 프로그래밍에서 '소켓'이라는 용어의 의미를 1)데이터 타입, 2)통신 종단점, 3)네트워크 프로그래밍 인터페이스 3가지 관점에서 볼 수 있습니다.


1) 데이터 타입

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


SOCKET sock = socket(...); //소켓 생성
...
recv(sock, ...) //데이터 받기
send(sock, ...) //데이터 보내기

응용 프로그램 통신시 필요 요소

- 사용할 프로토콜(TCP/IP, UDP/IP 등)

- 송신 측 IP 주소

- 송신측 포트 번호

- 수신측 IP 주소

- 수신측 포트 번호

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



2) 통신 종단점

소켓은 응용 프로그램 관점에서 통신 종단점(communication end-point), 즉 통신의 출발점과 도착점이라고 할 수 있습니다.





클라이언트는 자신의 소켓이 서버 소켓과 연결된 것으로 생각하고 send() 함수를 호출해 데이터를 보냅니다. 서버도 자신의 소켓이 클라이언트 소켓과 연결된 것으로 생각하고 recv() 함수를 호출해 데이터를 받을 수 있습니다. 서버가 클라이언트에 데이터를 보내는 경우도 같은 원리입니다.



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

TCP/IP 프로토콜의 관점에서 소켓은 네트워크 프로그래밍 인터페이스에 불과합니다. TCP/IP 프로토콜 구조에서 소켓은 응용 계층과 전송 계층 사이에 위치한다고 생각하면 됩니다.







윈도우 소켓(윈속) 이란?


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


윈도우 소켓은 유닉스소켓에 기반을 둔 네트워크 프로그래밍 인터페이스라 소스 코드 수준에서 비교적 호환성이 높습니다. 윈속 1.x 버전은 유닉스 소켓과 호환성을 제공하면서 TCP/IP 프로토콜을 지원하는 것을 목표로 설계되었습니다. 그러나 2.x 버전부터는 다양환 프로토콜을 지원하도록 구조를 변경하고 함수를 추가했습니다. 윈속에서 지원하는 통신 프로토콜은 TCP/IP, IPv6, IrDA, Bluetooth 입니다.


윈속을 사용했을때의 장점

- 유닉스 소켓과 소스 코드 수준에서 호환성이 높으므로 기존 코드를 이식하여 활용하기 쉽습니다.

- 가장 널리 사용하는 네트워크 프로그래밍 인터페이스이므로 한번 배우면 여러 운영체제에서 사용할 수 있습니다.

- TCP/IP 외의 프로토콜도 지원하므로 최소 코드 수정으로 응용 프로그램이 사용할 프로토콜을 변경할 수 있습니다.

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


윈속 사용시, 단점

- 응용 프로그램 수준의 프로토콜을 프로그래머가 직접 설계해야 합니다. 즉, 주고받는 데이터 형식이나 전송 절차 등을 고려해 프로그래밍해야 하며, 설계 변경 시에는 코드 수정이 불가피 합니다.

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



윈도우 소켓 구조






윈도우 운영체제는 윈속 응용 프로그램을 위해 위와 같은 구조를 지원합니다. 윈속이 지원하는 대부분의 기능은 WS2_32.DLL로 제공되며, 윈속 1.x 응용 프로그램은 WINSOCK.DLL이나 WSOCK32.DLL을 통해 궁극적으로 WS2_32.DLL의 기능을 사용하게 됩니다. 표준 윈속 API 외에도 확장한 API가 존재하며 MSWSOCK.DLL로 제공됩니다. 응용 프로그램이 실제로 사용할 하부 프로토콜은 WS2_32.DLL이 적절히 선택해 연결해 줍니다.