2025-08-11 21:02

Tags:

소켓(Socket)의 모든 것 네트워크 연결의 숨은 설계도

1. 소켓은 왜 만들어졌나? (탄생 배경)

컴퓨터 네트워크의 초기 시절, 서로 다른 컴퓨터끼리 데이터를 주고받는 것은 매우 복잡하고 어려운 작업. 각기 다른 운영체제와 하드웨어는 통신 방식을 표준화하기 어렵게 만들었고, 개발자들은 매번 통신을 위해 저수준의 복잡한 프로토콜과 씨름해야 했음.

이러한 문제를 해결하기 위해 ‘소켓’ 이라는 개념이 등장. 마치 전기 콘센트에 플러그를 꽂으면 전기가 통하는 것처럼, 네트워크 세상에서도 정해진 규격(소켓)에 연결하기만 하면 데이터를 쉽게 주고받을 수 있도록 만든 ‘추상화된 통신 연결점’.

핵심 비유: 소켓은 ‘전화기’ 와 같음. 전 세계 누구와도 통화하고 싶을 때, 우리는 복잡한 교환기나 통신망의 원리를 몰라도 됨. 그저 전화기를 들고 상대방의 번호(IP 주소 + 포트 번호)를 누르면 연결되는 것과 같은 원리. 소켓은 개발자가 네트워크의 복잡한 내부 동작을 신경 쓰지 않고 ‘연결’과 ‘데이터 전송’이라는 본질에만 집중할 수 있도록 도와주는 일종의 ‘통신용 창구’.

2. 소켓의 구조: 무엇으로 이루어져 있나?

소켓은 단순히 하나의 부품이 아니라, 통신을 위해 필요한 정보들이 결합된 하나의 ‘설계도’ 와 같음. 이 설계도의 핵심 요소는 다음과 같음.

  • 프로토콜 (Protocol): 통신 규약. 데이터를 어떤 규칙으로 주고받을지 정하는 것.

    • TCP (Transmission Control Protocol): 신뢰성 있는 연결을 지향하는 방식. 데이터를 보내면 상대방이 잘 받았는지 일일이 확인하며, 순서가 뒤바뀌지 않도록 보장. 전화 통화처럼 연결을 먼저 확립하고 대화를 시작하는 것과 유사. (연결 지향형)

    • UDP (User Datagram Protocol): 속도를 중시하는 방식. 상대방의 수신 여부를 확인하지 않고 데이터를 빠르게 전송. 편지나 소포처럼 일단 보내는 데 집중하며, 중간에 사라지거나 순서가 바뀔 수 있음. (비연결 지향형)

  • IP 주소 (Internet Protocol Address): 네트워크상의 ‘집 주소’. 수많은 컴퓨터 중에서 통신할 상대를 특정하는 고유한 주소. (예: 211.249.222.141)

  • 포트 번호 (Port Number): 컴퓨터라는 ‘건물’ 안의 ‘방 번호’. 하나의 컴퓨터에서는 여러 프로그램이 동시에 네트워크를 사용할 수 있음. 포트 번호는 이 프로그램들 중 어떤 프로그램과 통신할지를 지정하는 번호. (예: 웹서버는 80번, FTP 서버는 21번 포트를 주로 사용)

결론적으로, 소켓은 ‘어떤 방식(프로토콜)으로, 어떤 컴퓨터(IP 주소)의, 어떤 프로그램(포트 번호)과 통신할 것인가’를 정의하는 정보의 집합체.

3. 소켓의 사용법: 통신은 어떻게 이루어지나? (TCP 기준)

TCP 프로토콜을 사용하는 소켓 통신은 보통 다음과 같은 단계로 진행됨. 마치 두 사람이 약속을 잡고 만나는 과정과 유사.

단계서버 (Server)클라이언트 (Client)비유 (만남 약속)
1. 소켓 생성socket()socket()각자 통화할 전화기를 준비함
2. 주소 할당bind()-서버가 자신의 가게(IP)에 특정 전화번호(Port)를 부여함
3. 연결 대기listen()-서버가 손님(클라이언트)의 전화를 기다리기 시작함
4. 연결 요청-connect()클라이언트가 서버의 전화번호로 전화를 걺
5. 연결 수락accept()-서버가 걸려온 전화를 받고 새로운 통화 라인을 개설함
6. 데이터 송수신send() / recv()send() / recv()전화기를 통해 서로 대화를 주고받음
7. 연결 종료close()close()대화가 끝나면 각자 전화기를 끊음

이러한 흐름을 통해 클라이언트와 서버는 안정적으로 데이터를 주고받을 수 있음. 온라인 게임, 채팅 프로그램, 웹 서비스 등 대부분의 신뢰성 있는 통신은 이 구조를 따름.

4. 심화 내용: 더 깊이 알아보기

  • 블로킹(Blocking) vs 논블로킹(Non-blocking) 소켓:

    • 블로킹: recv() 함수를 호출했을 때, 데이터가 들어올 때까지 프로그램 전체가 멈춰서 기다리는 방식. 구현은 쉽지만, 기다리는 동안 다른 작업을 할 수 없어 효율이 떨어질 수 있음. (전화 올 때까지 아무것도 못 하고 기다리는 사람)

    • 논블로킹: recv() 함수를 호출했을 때, 데이터가 없으면 기다리지 않고 즉시 다른 작업을 하러 감. 주기적으로 데이터가 왔는지 확인해야 하므로 구현이 복잡하지만, 시스템 자원을 효율적으로 사용할 수 있음. (전화 오는지 틈틈이 확인하며 다른 일을 하는 사람)

  • 동기(Synchronous) vs 비동기(Asynchronous) I/O:

    • 논블로킹 개념에서 한 단계 더 나아가, I/O(입출력) 작업이 완료되면 운영체제가 직접 알려주는 방식. (비서가 전화가 오면 알려주겠다고 하고, 나는 내 일에 집중하는 상황)

    • select(), poll(), epoll(리눅스), IOCP(윈도우) 등의 모델을 사용하여 수많은 클라이언트의 요청을 동시에 효율적으로 처리할 수 있음. 대규모 서버 프로그램의 핵심 기술.

  • 소켓과 파일:

    • 유닉스 계열 운영체제에서는 “모든 것은 파일이다(Everything is a file)“라는 철학이 있음. 소켓 역시 파일의 한 종류로 취급됨.

    • 따라서 소켓이 생성되면 파일처럼 ‘파일 디스크립터(File Descriptor)‘라는 고유한 번호가 할당되고, read(), write() 같은 파일 입출력 함수로도 데이터를 주고받을 수 있음. 이는 프로그램의 일관성과 확장성을 높여주는 중요한 특징.

이처럼 소켓은 단순한 연결점을 넘어, 운영체제와 네트워크 아키텍처의 깊은 철학이 담겨있는 핵심 기술입니다.

더 궁금한 점이 있으신가요? 예를 들어 TCP와 UDP의 구체적인 사용 사례나, 논블로킹 소켓의 코드 구현 방식에 대해 더 자세히 알아볼 수도 있습니다.

References

소켓