Computer >> 컴퓨터 >  >> 네트워킹 >> 네트워킹

소켓 프로그래밍이란? 컴퓨터 네트워크 통신의 기초 개념 완전 정리

소켓(socket)은 컴퓨터 네트워크 프로그래밍의 가장 근본적인 기술 중 하나입니다. 소켓을 활용하면 네트워크 하드웨어와 운영체제에 내장된 표준 메커니즘을 통해 소프트웨어 애플리케이션끼리 서로 통신할 수 있습니다.


인터넷 소프트웨어 개발의 최신 기능처럼 들리지만, 사실 소켓 기술은 웹보다 먼저 등장했습니다. 오늘날 수많은 인기 있는 네트워크 애플리케이션이 바로 이 소켓을 기반으로 동작하고 있습니다.


소켓 기술이 네트워크에서 하는 역할


소켓은 두 개의 소프트웨어 사이에 정확히 하나의 연결, 즉 점대점(point-to-point) 연결을 나타냅니다. 셋 이상의 소프트웨어가 통신하려면 클라이언트/서버 방식이나 분산 시스템 구조에서 여러 개의 소켓을 사용해야 합니다. 예를 들어 여러 웹 브라우저가 서버 측에 생성된 소켓 그룹을 통해 하나의 웹 서버와 동시에 통신할 수 있습니다.


소켓 기반 소프트웨어는 보통 네트워크상의 서로 다른 두 컴퓨터에서 실행되지만, 한 대의 컴퓨터 안에서 프로세스 간 통신(interprocess communication) 용도로도 활용할 수 있습니다. 또한 소켓은 양방향(bidirectional) 통신을 지원하기 때문에 연결된 어느 쪽이든 데이터를 보내고 받을 수 있습니다.


통신을 시작하는 쪽 애플리케이션을 '클라이언트', 상대편을 '서버'라고 부르기도 하지만, 이러한 용어는 P2P(peer-to-peer) 네트워킹 환경에서 오히려 혼란을 일으킬 수 있으므로 가급적 사용을 피하는 것이 좋습니다.


소켓 API와 라이브러리


표준 응용 프로그래밍 인터페이스(API)를 구현한 여러 라이브러리가 인터넷에 공개되어 있습니다. 최초의 주류 패키지인 버클리 소켓 라이브러리(Berkeley Socket Library)는 UNIX 시스템에서 지금까지 널리 사용되고 있습니다.


또 다른 대표적인 API로는 마이크로소프트 운영체제용 Windows Sockets(WinSock) 라이브러리가 있습니다. 다른 컴퓨터 기술에 비해 소켓 API는 매우 성숙한 편인데, WinSock은 1993년부터, 버클리 소켓은 1982년부터 꾸준히 사용되어 왔습니다.


소켓 API는 비교적 작고 단순한 구조를 가지며, 많은 함수가 read(), write(), close() 같은 파일 입출력 루틴의 함수와 유사합니다. 실제 호출하는 함수는 개발자가 선택한 프로그래밍 언어와 소켓 라이브러리에 따라 달라집니다.


소켓 인터페이스의 세 가지 유형


소켓 인터페이스는 크게 다음의 세 가지 범주로 나눌 수 있습니다.


  • 스트림 소켓(Stream sockets): 가장 널리 쓰이는 유형입니다. 통신 당사자들이 먼저 소켓 연결을 설정한 후, 해당 연결을 통해 전달되는 데이터는 전송된 순서 그대로 도착하는 것이 보장됩니다(연결 지향 프로그래밍 모델).
  • 데이터그램 소켓(Datagram sockets): 비연결(connectionless) 방식의 의미 체계를 제공합니다. 스트림과 달리 연결이 명시적이 아니라 암묵적으로 이루어지며, 각 당사자는 필요할 때 데이터그램을 보내고 상대의 응답을 기다립니다. 메시지가 전송 중에 유실되거나 순서가 뒤바뀔 수 있으며, 이러한 문제는 소켓이 아니라 애플리케이션이 직접 처리해야 합니다. 대신 데이터그램 소켓을 활용하면 스트림 소켓보다 더 나은 성능과 유연성을 얻을 수 있는 애플리케이션도 있습니다.
  • 로우 소켓(Raw sockets): TCP나 UDP 같은 표준 프로토콜에 대한 라이브러리의 기본 지원을 우회합니다. 주로 커스텀 저수준(low-level) 프로토콜을 개발할 때 사용됩니다.

네트워크 프로토콜에서의 소켓 지원


현대의 네트워크 소켓은 일반적으로 IP, TCP, UDP 인터넷 프로토콜과 함께 사용됩니다. 인터넷 프로토콜용 소켓 라이브러리는 스트림에는 TCP를, 데이터그램에는 UDP를, 로우 소켓에는 IP를 사용합니다.


인터넷을 통해 통신하려면 IP 소켓 라이브러리가 IP 주소를 사용해 특정 컴퓨터를 식별합니다. 인터넷의 많은 부분이 네이밍 서비스(naming service)와 연동되기 때문에, 사용자와 소켓 프로그래머는 208.185.127.40 같은 숫자 주소 대신 thiscomputer.wireless.lifewire.com처럼 이름으로 컴퓨터를 다룰 수 있습니다.


스트림 소켓과 데이터그램 소켓은 IP 포트 번호를 사용해 여러 애플리케이션을 서로 구분합니다. 예를 들어 인터넷의 웹 브라우저는 웹 서버와의 소켓 통신에 기본적으로 80번 포트를 사용한다는 것을 알고 있습니다.