Post

소켓 통신이란?

소켓 통신이란?

곧 진행될 종합 프로젝트의 주제가 AI를 활용한 챗봇 개발이다.
챗봇은 실시간 통신과 연결 유지에 대한 이해가 필수적이다 보니, 웹소켓(WebSocket)과 관련된 기술을 익히기 위해
그 기반이 되는 소켓(Socket)의 개념부터 확실히 이해하고 넘어가야겠다는 생각이 들었다.

왜냐하면, 소켓을 이해해야

  • WebSocket의 동작 방식 이해 가능
  • 웹소켓을 쉽게 다루기 위해 자주 쓰이는 socket.io 라이브러리까지 학습 가능

하기 때문이다.

즉, 이번 학습은 챗봇 개발을 위한 통신 기술의 기초를 다지는 과정이다.


🎯 오늘의 공부 목표

  • 소켓의 기본 개념
  • 소켓 통신의 기본 원리
  • 소켓과 포트의 관계

1️⃣ 소켓 개념 이해

🔸 소켓이란?

소켓(Socket)은 컴퓨터 네트워크에서 통신을 하기 위한 양 끝점(Endpoint)을 의미한다.
좀 더 쉽게 말하면, 네트워크를 통해 데이터를 주고받는 ‘문’ 또는 ‘채널’이라고 할 수 있다.

  • 소켓은 IP 주소(어디에?)와 포트 번호(어떤 창구?)를 함께 사용하여 특정 컴퓨터의 특정 프로그램과 통신할 수 있도록 만들어줌
  • 네트워크에서 데이터를 주고받기 위해 운영체제가 제공하는 API(응용 프로그램 인터페이스) 중 하나이며, 다양한 프로그래밍 언어에서 지원됨

💡 한마디로:
소켓은 인터넷 상에서 데이터를 주고받기 위해 만들어진 ‘가상의 통신 창구’이다.


🔸 소켓 통신의 기본 원리

소켓 통신은 양쪽의 소켓 간에 연결을 맺고, 데이터를 송수신하는 방식으로 이루어진다.
네트워크의 기본 원리인 TCP/IP 프로토콜 위에서 동작하며, 아래와 같은 흐름으로 이루어진다:
소켓 통신 흐름

  1. 소켓 생성 (socket)
    클라이언트와 서버가 통신하기 위해 각자 소켓을 생성
  2. 서버 측: 포트 바인딩 및 대기 (bind & listen)
    서버는 특정 포트 번호에 소켓을 바인딩하고, 클라이언트의 연결 요청을 기다림
  3. 클라이언트 측: 연결 요청 (connect)
    클라이언트는 서버의 IP 주소와 포트 번호를 통해 연결을 요청
  4. 서버 측: 연결 수락 (accept)
    서버는 클라이언트의 요청을 수락하고 연결을 확립함
  5. 데이터 송수신 (send & recv)
    서버와 클라이언트는 데이터를 주고받음
  6. 연결 종료 (close)
    통신이 끝나면 양쪽 모두 소켓을 닫아 연결을 종료

💡 비유하자면:

  • 소켓 = 전화기의 수화기
  • IP 주소 = 상대방의 전화번호
  • 포트 번호 = 회사 대표 번호 내의 내선 번호
  • 연결(connect) = 전화를 거는 행동
  • 데이터 송수신 = 실제 대화하는 과정

🔸 소켓과 포트의 관계

소켓은 IP 주소 + 포트 번호의 조합으로 정의된다.

  • IP 주소 : 컴퓨터(혹은 서버)의 네트워크 상의 위치를 나타냄
  • 포트 번호 : 해당 컴퓨터 내의 특정 프로그램(프로세스)을 식별함

예를 들어,

  • IP 주소가 192.168.1.100, 포트가 8080인 소켓은 192.168.1.100:8080으로 표현됨
  • 같은 컴퓨터라도 포트 번호가 다르면 서로 다른 소켓으로 취급

💡 중요한 점:

  • 포트 번호는 0~65535까지 존재하며, 특정 번호들은 이미 표준 서비스(HTTP: 80, HTTPS: 443 등)에 예약되어 있음
  • 네트워크 통신에서 두 프로그램이 소켓을 통해 데이터를 주고받을 때는 서로의 IP 주소와 포트 번호를 알고 있어야 함

2️⃣ 소켓 통신의 동작 방식

🔸 TCP/IP와 소켓의 관계

소켓 통신은 인터넷에서 데이터를 주고받기 위해 TCP/IP 프로토콜을 기반으로 동작한다.
여기서 TCP/IP는 인터넷의 표준 통신 규약으로,

  • IP(Internet Protocol)는 데이터를 어디로 보낼지 결정
  • TCP(Transmission Control Protocol)UDP(User Datagram Protocol)는 데이터를 어떻게 전송할지 정함

💡 비유하자면:

  • IP = 주소(택배 주소)와 경로 결정
  • TCP = 상자에 포장하고 안전하게 배달
  • UDP = 빠르게 봉투에 담아 배달

소켓은 이 TCP/IP 프로토콜을 활용해 데이터를 주고받는 역할을 하며,
소켓 프로그래밍에서 소켓 객체는 IP 주소 + 포트 번호 + 프로토콜(TCP/UDP) 정보를 담고 연결을 수행한다.


🔸 연결형 소켓(TCP)과 비연결형 소켓(UDP)

소켓은 사용하는 프로토콜에 따라 두 가지로 나뉜다:

연결형 소켓 (TCP)

  • 연결을 먼저 맺고 데이터 전송 (3-wap Handshake: SYN, SYN-ACK, ACK)
  • 데이터 전송 순서와 안정성 보장 (순서 유지, 오류 감지 및 재전송)
  • 예: 웹사이트 접속, 파일 다운로드, 이메일 전송

비연결형 소켓 (UDP)

  • 연결 없이 데이터 전송 (헤더에 목적지 정보 포함)
  • 빠르고 간단하지만 데이터 손실 가능성 있음
  • 예: 실시간 스트리밍, 온라인 게임, 화상 회의

💡 정리하자면:

  • TCP 소켓 = “중요한 문서 배송” (배달 상태를 체크하고, 순서대로, 빠짐없이)
  • UCP 소켓 = “엽서 배달” (빠르고 간단하게, 일부 손실은 감수)

🔸 데이터 송수신 흐름

소켓을 이용한 데이터 전송은 다음과 같은 단계로 이루어진다:

  1. 서버 소켓 생성 및 바인딩
    서버는 소켓을 생성하고, 특정 IP와 포트에 바인딩한 후, 클라이언트의 접속을 기다림
  2. 클라이언트 소켓 생성 및 접속 요청
    클라이언트는 소켓을 생성하고, 서버의 IP와 포트를 지정해 접속 요청을 보냄
  3. 서버에서 접속 수락
    서버는 클라이언트의 접속 요청을 수락하고, 통신 채널을 생성함
  4. 데이터 송수신
    양쪽 소켓은 데이터를 송수신하며, TCP의 경우 패킷 손실 방지 및 순서 보장을 위해 ACK(확인 응답)를 주고받음
  5. 연결 종료
    통신이 끝나면 양쪽 소켓은 연결을 닫아 통신을 종료

💡 비유하자면:

  • 서버 = 우체국
  • 클라이언트 = 편지를 보내는 사람
  • TCP 소켓 = 등기 우편 (배달 확인 가능)
  • UDP 소켓 = 일반 우편 (배달 확인 불가)

3️⃣ 소켓 통신의 주요 활용 사례

소켓 통신은 네트워크 상에서 데이터를 주고받는 표준적인 방법으로, 실생활과 다양한 IT 서비스에서 중요한 역할을 한다.
다음은 소켓 통신이 활용되는 대표적인 사례들이다.

🔸 웹 개발에서의 소켓 (예: WebSocket)

웹 개발에서는 HTTP가 기본적인 통신 방식이지만,
HTTP는 요청-응답(Req-Res) 구조라 실시간 양방향 통신에는 한계가 있다.

이를 보완하기 위해 WebSocket이 등장했다. WebSocket은 소켓 기반의 프로토콜로, 처음에 HTTP로 연결한 후 TCP 기반의 소켓 통신으로 업그레이드되어
서버와 클라이언트가 지속적으로 연결된 상태에서 실시간 데이터를 주고받을 수 있다.

💡 예시:

  • 실시간 채팅
  • 주식/암호화폐 시세 전송
  • 라이브 스포츠 중계

🔸 채팅 애플리케이션

소켓 통신의 대표적인 활용 사례 중 하나는 실시간 채팅이다.

카카오톡, WhatsApp 등 대부분의 메신저 앱은 서버와 클라이언트가 소켓을 통해 연결을 유지하고,
메시지가 발생하면 서버를 거쳐 상대방에게 즉시 전달된다.

💡 특징:

  • 지속적인 연결 유지
  • 메시지 전송의 지연 최소화
  • 실시간으로 메시지 읽음/수신 상태 표시 가능

🔸 온라인 게임 및 실시간 데이터 전송

온라인 게임에서는 서버와 클라이언트 간의 빠르고 안정적인 데이터 전송이 필수다.

특히 멀티플레이어 게임은 매 순간마다 플레이어 위치, 행동 등을 실시간으로 서버에 보내고
다른 플레이어의 상태를 수신해야 한다.

✅ 주로 사용되는 프로토콜:

  • TCP : 정확성이 중요한 게임 (턴제, 카드게임 등)
  • UDP : 빠른 반응이 중요한 게임 (액션, FPS 등)

💡 기타 예시:

  • 실시간 스포츠 경기 데이터 전송
  • 실시간 센서 데이터 스트리밍

🔸 IoT 및 네트워크 장치 제어

IoT(Internet of Things) 기기나 네트워크 장치(예: CCTV, 스마트홈 장치)는
서버와 기기 간의 통신을 위해 소켓을 활용한다.
서버가 기기에 명령을 내리거나, 기기가 서버에 데이터를 전송하는 등 양방향 통신이 필요하기 때문이다.

✅ 특징:

  • 기기의 상태 모니터링 및 제어
  • 실시간 데이터 송수신 (센서 값, 알림 등)
  • 안정적인 연결 유지

💡 예시:

  • 스마트 홈의 온도조절 장치, 조명 시스템
  • 산업용 센서 네트워크
  • CCTV 영상 스트리밍

4️⃣ 소켓 프로그래밍 기초

🔸 소켓 프로그래밍 기본 구조 (클라이언트-서버 모델)

소켓 프로그래밍은 일반적으로 클라이언트-서버 구조로 이루어진다.

  • 서버(Server) : 항상 대기하고 있다가, 클라이언트의 연결 요청을 받아 처리함
  • 클라이언트(Client) : 서버에 연결 요청을 보내고, 데이터를 주고받음

📶 흐름 요약

1
2
클라이언트: socket() → connect() → send() / recv() → close()
서버: socket() → bind() → listen() → accept() → send() / recv() → close()

🔸 주요 함수 및 API

소켓 프로그래밍에서 자주 사용되는 주요 함수들을 간단히 정리하면 다음과 같다:

함수 / 메서드설명
socket()소켓 생성 (IP 주소 체계, 프로토콜 종류 지정)
bind()소켓에 IP 주소와 포트 번호 할당 (서버 측)
listen()클라이언트의 연결 요청을 기다림
accept()클라이언트의 연결 요청 수락 및 새로운 소켓 생성
connect()서버에 연결 요청 (클라이언트 측)
send() / recv()데이터 송수신 (TCP 기반)
close()소켓 연결 종료

🔸 간단한 소켓 예제 코드 (Python)

🖥️ 서버 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import socket

# 1. 소켓 생성
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2. IP, 포트 설정 및 바인딩
server_socket.bind(('localhost', 12345))

# 3. 연결 대기
server_socket.listen()

print("서버 대기 중...")

# 4. 클라이언트 접속 수락
client_socket, addr = server_socket.accept()
print(f"{addr}에서 접속됨")

# 5. 데이터 수신 및 응답
data = client_socket.recv(1024).decode()
print(f"받은 데이터: {data}")
client_socket.send("응답: 잘 받았어요!".encode())

# 6. 소켓 종료
client_socket.close()
server_socket.close()

🧑‍💻 클라이언트 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import socket

# 1. 소켓 생성
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2. 서버에 연결 요청
client_socket.connect(('localhost', 12345))

# 3. 메시지 전송 및 수신
client_socket.send("안녕하세요, 서버!".encode())
data = client_socket.recv(1024).decode()
print(f"서버로부터 받은 응답: {data}")

# 4. 소켓 종료
client_socket.close()

💡 이 코드는 로컬환경에서 localhost로 테스트하는 용도이며, 실서비스에서는 공인 IP 및 보안 설정(TLS 등)이 추가되어야 한다.


5️⃣ WebSocket과 소켓의 차이점

🔸 WebSocket의 특징

WebSocket은 웹 환경에서 클라이언트(브라우저)와 서버 간의 실시간 양방향 통신을 가능하게 하는 프로토콜이다.
초기에 HTTP 요청으로 연결을 시작하지만, 연결이 성립되면 지속적인 연결을 유지하며 데이터를 주고받는다.
연결 이후에는 HTTP 헤더 없이 데이터를 주고받기 때문에 속도가 빠르고 효율적이다.
서버와 클라이언트 모두 언제든지 데이터를 전송 가능하며, 지속적인 연결 덕분에 실시간성이 매우 뛰어나다.

💡 주요 특징 요약:

  • HTTP 기반의 핸드셰이크 후, TCP 소켓 연결로 업그레이드
  • 서버-클라이언트 간 지속적 연결 유지 (Keep-Alive)
  • 양방향 통신 (서버 -> 클라이언트, 클라이언트 -> 서버)
  • 헤더 오버헤드 없음, 전송 속도 빠름

🔸 HTTP와의 차이

항목HTTPWebSocket
연결 방식요청-응답 단방향 통신지속적 연결 유지 (양방향)
연결 유지요청마다 새로 연결연결 한 번으로 계속 유지
헤더매 요청마다 헤더 포함초기 핸드셰이크 이후 헤더 없음
전송 효율헤더 오버헤드로 전송량 많음전송 효율적, 지연시간 짧음
사용 예시웹 페이지 로드, API 호출채팅, 실시간 데이터 전송

💡 비유하자면:

  • HTTP = 편지를 매번 새로 부쳐야 하는 통신
  • WebSocket = 전화 통화로 계속 연결된 상태에서 대화하는 통신

🔸 WebSocket의 동작 방식

WebSocket은 다음과 같은 흐름으로 동작한다:

  1. 클라이언트가 HTTP 요청을 통해 WebSocket 연결 시도
    요청 헤더에 Upgrade: websocketConnection: Upgrade를 포함하여 서버에 연결 요청을 보냄
  2. 서버가 요청을 받아 WebSocket 연결 수락
    서버는 요청 헤더를 확인하고, 연결을 승낙하면 HTTP 연결을 WebSocket으로 업그레이드
  3. WebSocket 연결 성립
    연결 이후에는 HTTP 프로토콜을 벗어나 TCP 기반의 지속적 연결로 전환됨
  4. 양방향 데이터 전송
    서버와 클라이언트는 언제든지 자유롭게 데이터를 송수신할 수 있으며,
    서버에서 클라이언트로 데이터를 push하는 것도 가능
  5. 연결 종료
    필요 시 클라이언트나 서버가 연결을 닫을 수 있음

💡 요약하면: WebSocket은 HTTP와 달리, 연결을 한 번 맺은 후 지속적으로 유지하며,
실시간 통신이 필요한 애플리케이션(채팅, 실시간 알림, 주식 시세 등)에 최적화된 기술이다.


6️⃣ 보안과 최적화

🔸 소켓 통신의 보안 고려사항 (예: TLS, SSL)

소켓 통신은 기본적으로 TCP/IP 기반의 전송 계층으로 데이터를 주고받는다.
하지만 이때 데이터는 암호화되지 않아 중간에 가로채기(스니핑) 위험이 있다.

✅ 이를 방지하기 위해 TLS(Transport Layer Security) 또는 구버전 SSL(Secure Sockets Layer)을 사용한다.

TLS는 소켓 연결 위에 암호화 계층을 추가해 데이터가 안전하게 전송되도록 한다.
WebSocketwss://를 사용하면 TLS를 적용한 WebSocket 연결을 의미한다.

💡 보안 적용 예시:

  • 금융 서비스, 로그인/회원정보 처리
  • TLS를 통한 암호화(SSL은 권장되지 않음)

🔸 연결 유지 및 오류 처리

소켓 통신은 연결을 유지하는 동안 다양한 문제가 발생할 수 있다.

  • 네트워크 단절
  • 서버 다운
  • 클라이언트 측 비정상 종료

이런 상황에 대비해 다음과 같은 처리가 필요하다:

  • Keep-Alive: 연결을 지속적으로 유지하도록 설정(TCP의 Keep-Alive 옵션)
  • 타임아웃 처리: 일정 시간 동안 데이터 송수신이 없을 경우 연결 종료
  • 재연결 로직: 연결이 끊어진 경우 자동으로 재접속 시도
  • 에러 처리: try-catch 문, 예외 처리 구문으로 오류를 안전하게 처리

💡 예시:

  • 채팅 앱에서 네트워크 연결이 끊겼을 때 자동 재접속
  • IoT 장비의 네트워크 불안정 상황 처리

🔸 성능 최적화 방안

소켓 통신은 효율성을 높이기 위해 성능 최적화가 필요하다.
특히 대용량 데이터를 주고받거나 많은 클라이언트를 동시에 처리할 때 중요하다.

  • 데이터 패킷 크기 조절: 너무 작은 패킷은 오버헤드, 너무 큰 패킷은 지연 발생
  • 비동기 I/O 처리: 블로킹(Blocking)을 피하고 비동기로 처리하여 대기 시간 단축
  • 스레드/이벤트 기반 처리: 서버에서 클라이언트 수가 많을 경우 스레드 풀, 이벤트 루프 사용
  • 압축 전송: 데이터 전송량을 줄이기 위해 압축 기술 사용 (예: zlib)
  • 네트워크 최적화: QoS(Quality of Service), 우선순위 설정 등

💡 예시:

  • WebSocket 서버에서 많은 사용자의 채팅 메시지를 효율적으로 처리하기 위해 비동기 이벤트 처리 사용
  • IoT 장비에서 데이터 압축 후 전송으로 전송량 최소화

마무리하며

오늘은 소켓의 개념, 동작 원리, 활용 사례, 프로그래밍 기초, 그리고 보안과 최적화까지 폭넓게 학습해보았다.
소켓은 네트워크 통신의 기본을 이해하는 데 꼭 필요한 요소이며, 이를 기반으로 WebSocket과 socket.io 같은 실시간 통신 기술까지 확장할 수 있다.

이제 소켓의 기초를 다졌으니,
다음 단계에서는 WebSocket의 실전 활용과 socket.io 라이브러리 학습으로 나아갈 계획이다.

  • WebSocket의 실제 구현과 특징
  • socket.io를 사용한 편리한 실시간 통신 처리
  • 챗봇 개발에 필요한 실시간 데이터 흐름 이해

💡 한걸음 한걸음 네트워크 통신의 세계로!

This post is licensed under CC BY 4.0 by the author.