gloryyam 님의 블로그
소켓 통신 : 송신/수신 통신 과정 본문
1) 소켓 통신(Socket Communication)
💡 소켓통신
- 소켓통신은 두 컴퓨터가 네트워크를 통해 '실시간 양방향 통신'을 제공하는 기술을 의미합니다. 좀 더 쉽게 설명하면 인터넷에서 컴퓨터들은 데이터(정보)를 주고 받아야 합니다. 예를들어
- 상대방이 카톡을 보낼 때 ⮕ 내 폰으로 도착해야 하고,
- 온라인 게임에서 내 캐릭터가 움직이면 ⮕ 서버가 그걸 알아야 합니다.
이런 식으로 실시간으로 주고받는 통신을 가능하게 해주는 것이 '소켓통신'입니다.
※ 소켓은 운영체제의 네트워크 계층과, 전송 계층(TCP/UDP) 위에 동작하며, 응용 프로그램은 이 소켓을 통해 네트워크 자원에 접근할 수 있습니다.
2) 소켓의 구조
🧩 소켓은 다음 정보를 기반으로 통신 상대를 식별합니다.
| 구성 요소 | 설명 |
| IP 주소 (Internet Protocol Address) | 통신 상대 호스트(컴퓨터)의 위치 |
| Port 번호 (Port Number) | 해당 호스트 내에서 실행 중인 특정 프로세스를 구분하기 위한 번호 |
| 프로토콜 (Protocol) | 통신 규칙 (일반적으로 TCP 또는 UDP) |
⮕ 즉, 소켓은 (IP 주소, Port 번호, 프로토콜)의 조합으로 식별 됩니다.
3) 일반적인 소켓통신 흐름

- 클라이언트 소켓 ( 요청을 보내는 쪽 )
- 서버 소켓 ( 요청을 기다리고 응답하는 쪽 )
1단계: socket() — 소켓 생성
| 구분 | 설명 |
| Client / Server 모두 | socket() 함수를 이용해 통신에 사용할 소켓을 생성합니다. |
2단계: bind() (서버 전용)
| 구분 | 설명 |
| Server | bind() 함수는 소켓을 특정 IP와 포트 번호에 연결(바인딩)합니다. 이 과정을 통해 클라이언트가 해당 주소와 포트로 접속할 수 있는 네트워크 엔드 포인트가 설정 됩니다. |
3단계: listen() (서버 전용)
| 구분 | 설명 |
| Server | listen() 함수는 서버 소켓을 수신 대기 상태로 전환합니다. 이상태에서 서버는 클라이언트의 연결 요청을 큐에 저장하며, accept() 호출 시 큐에 있는 요청 중 하나를 처리합니다. |
4단계: connect() (클라이언트) ↔ accept() (서버)
| 구분 | 설명 |
| Client | connect() 함수는 지정된 IP와 포트의 서버로 연결 요청( Connection Request ) 을 전송합니다. 이 호출이 성공하면 TCP의 3way handshake 과정을 통해 연결이 수립됩니다. |
| Server | accept() 함수는 대기 중인 연결 요청을 수락(Accept) 하며, 새로운 통신용 소켓을 반환합니다. 이 소켓은 해당 클라이언트와의 전용 통신 채널로 사용됩니다. |
5단계: send() / recv() — 데이터 송수신
| 구분 | 설명 |
| Client & Server | send() 함수는 연결된 소켓을 통해 데이터를 전송하고, recv() 함수는 데이터를 수신합니다. TCP의 경우 데이터는 스트림(Stream) 형태로 전달되며, 전송 순서와 무결성이 보장됩니다. |
6단계: close() — 연결 종료
| 구분 | 설명 |
| Client & Server | close() 함수는 소켓을 닫고 연결을 종료합니다. TCP의 경우, FIN 패킷이 전송되어 연결 종료 과정(TCP 4-way handshake) 이 진행됩니다. |
4) 소켓 종류
스트림 소켓 (Stream Socket)

개념
- TCP 프로토콜을 사용하는 소켓입니다.
- 즉, 연결형(Connect-oriented) 통신 방식
- 데이터를 “흐름(Stream)” 형태로 주고받기 때문에 이름이 붙었습니다.
특징
| 항목 | 설명 |
| 프로토콜 | TCP (Transmission Control Protocol) |
| 통신 방식 | 연결형 (Connection-oriented) |
| 데이터 전달 보장 | 있음 (순서·정확성 보장) |
| 데이터 전송 단위 | 바이트 스트림 (데이터가 끊김 없이 연속적으로 전송됨) |
| 예시 | 웹 브라우징(HTTP), 이메일(SMTP), 파일 전송(FTP) |
💡 동작 원리
- 서버는 socket()으로 소켓 생성 → bind()로 IP/Port 설정 → listen()으로 연결 대기
- 클라이언트는 connect()로 서버에 연결 요청
- 서버가 accept()로 연결 수락
- 이후 send() / recv() 함수를 통해 데이터를 주고받음
➡ 즉, 전화 통화와 비슷해요.
전화를 걸고 연결된 뒤에야 서로 말을 주고받을 수 있고, 말이 순서대로 전달됨
데이터그램 소켓 (Datagram Socket)

개념
- UDP 프로토콜을 사용하는 소켓입니다.
- 비연결형(Connectionless) 통신 방식
- 데이터를 “데이터그램(Datagram)” 단위로 주고받습니다.
특징
| 항목 | 설명 |
| 프로토콜 | UDP (User Datagram Protocol) |
| 통신 방식 | 비연결형 (Connectionless) |
| 데이터 전달 보장 | 없음 (손실 가능, 순서 뒤바뀔 수 있음) |
| 데이터 전송 단위 | 패킷(데이터그램) 단위 |
| 예시 | 영상 스트리밍, 게임, 화상통화, DNS 요청 |
💡 동작 원리
- 서버는 socket()으로 소켓 생성 후 bind()로 포트 설정
- 클라이언트는 sendto()로 목적지 IP/Port에 직접 데이터 전송
- 서버는 recvfrom()으로 클라이언트가 보낸 데이터 수신
HTTP 통신과 소켓 통신의 차이
(1) HTTP 통신
- 클라이언트의 요청이 있을 때만 서버가 응답
- JSON, HTML, Image 등 다양한 데이터를 주고 받을 수 있음
- 서버가 응답한 후 연결을 바로 종료하는 단방향 통신이지만 Keep Alive 옵션을 주어 일정 시간동안 커넥션을 유지할 수 있다.
- 실시간 연결이 아닌 데이터 전달이 필요한 경우에만 요청을 보내는 상황에 유리
(2) 소켓 통신
- 클라이언트와 서버가 특정 포트를 통해 양방향 통신을 하는 방식
- 데이터 전달 후 연결이 끊어지는 것이 아니라 계속해서 연결을 유지 → HTTP에 비해 더 많은 리소스 소모
- 클라이언트와 서버가 실시간으로 계속하여 데이터를 주고받아야하는 경우에 유리
- 실시간 동영상 스트리밍이나 온라인 게임 등에 사용