[네트워크] 실시간 통신 개념 정리 1 - Socket
2026. 1. 3. 12:10ㆍ네트워크

소켓(Socket)
네트워크에서 데이터를 주고 받을 수 있는 통로
![]() |
![]() |
(왼쪽그림은 TCP/IP 4계층에 대한 그림이고,
오른쪽은 TCP/IP 4계층은 동일한데 소켓의 위치에 대해 확인하기 위해 과장해서 그린 그림입니다. )
- 소켓은 응용 계층과 전송 계층 사이에 위치
- 앱은 TCP/UDP 프로토콜을 직접 구현할 필요 없음
- OS가 제공하는 소켓 API를 사용해 데이터를 보내면 OS가 TCP/IP 처리
1️⃣ 소켓의 역할
| 역할 | 설명 |
| TCP/UDP를 사용하기 위한 입구(통로) | 앱이 write()로 데이터를 넣으면 TCP/IP 처리는 OS가 수행 |
| End-Point 역할 | IP + Port + 연결정보(4-tuple)를 통해 통신 상대를 식별 |
| 프로토콜이 아닌 인터페이스 | WebSocket, HTTP 같은 프로토콜은 응용 계층에서 정의됨. 소켓은 이 프로토콜을 흘려 보내는 통로 |
2️⃣ 소켓의 종류
| 종류 | 특징 |
| TCP 소켓(Stream) | 연결 기반, 3-way handshake 필요, 순서/재전송 보장 |
| UDP 소켓(Datagram) | 비연결 기반, 빠름, 순서/재전송 보장 없음 |
3️⃣ 소켓 API 실행 흐름(클라이언트 ↔ 서버)

클라이언트측 과정
1️⃣ 클라이언트 소켓 생성
- 소켓 종류 선택
- TCP라면 Stream 타입
- UDP라면 데이터그램 타입
- 이 시점엔 목적지 정보가 없는 빈 소켓임
socket(AF_INET, SOCK_STREAM, 0) // TCP
socket(AF_INET, SOCK_DGRAM, 0) // UDP
2️⃣ 연결 요청
- IP 주소 + Port 번호로 연결 대상 서버 식별
- connect() 호출 시 OS가 클라이언트 임시포트(ephemeral port) 자동 할당
- → 이것이 암묵적 바인딩
3️⃣ 3-way handshake 진행
- Client → Server : SYN
- Server → Client : SYN + ACK
- Client → Server : ACK
- 이 순간 TCP 연결 완료, connect 단계가 종료됨(return)
4️⃣ 데이터 송수신
- TCP는 스트림 기반(메시지 경계 없음)
- 100바이트를 보내도 수신 측에는 30/70, 50/50,100 등 임의 크기로 도착 가능
- 송신(write) 동작
- 클라이언트가 소켓에 write()
- OS 커널이 TCP 세그먼트 생성
- 네트워크 계층, 링크 계층, 물리 계층 순서대로 내려감
- 수신(read)은 별도의 스레드가 필요함
- 상대방이 언제 보낼지 알 수 없음 -> blocking I/O
- 그래서 별도 스레드 또는 비동기 I/O로 읽어야함
5️⃣ 소켓 닫기
- 더 이상의 송수신이 없다고 판단되면 소켓을 닫음
- Client → Server : FIN
- Server → Client : ACK
- Server → Client : FIN
- Client → Server : ACK
서버측 과정
1️⃣ 서버 소켓 생성(Listening 소켓)
- 아무런 정보가 없는 소켓 생성
서버
┌────────────────────┐
│ Listening Socket │ ← 8080 포트 바인딩
└────────────────────┘
2️⃣ 바인딩
- 소켓 ↔ 포트번호를 연결하는 과정
- 이 과정을 통해
- 어떤 포트를 사용해서 대기할지
- 클라이언트들이 어디로 접속해야하는지 결정
- 필요한 이유?
- 어떤 프로그램이 어떤 포트를 쓸지 OS가 알아야 하기 때문
- 중복 방지
더보기
예시
만약 100번 포트를 여러 소켓이 동시에 사용한다면
→ 운영체제 입장에서는 어느 프로세스에 연결시켜 주어야할지 알 수 없음
→ 소켓이 특정 포트를 사용하도록 포트번호 + 소켓 결합
→ 이를 통해 중복된 포트 사용을 방지하고 내부적으로 관리 (클라이언트 ip, port, 서버 ip, port 값 고려해서 )
→ 이런 과정을 통해 패킷이 어떤 소켓으로 가야하는 지 결정을 함

3️⃣ 클라이언트 연결 요청 대기
- 소켓에서 포트번호 + 바인딩을 마치고나면 클라이언트로부터 연결 요청을 받아들일 준비가 됨
4️⃣ 클라이언트 연결 수립
- 새로운 Connected 소켓이 만들어짐
- → 이 소켓을 고객 1명과의 전용 통신 통로로 사용
- 하나의 서버 포트(예: 8080)만 열어놓고도 수천 명과 동시에 통신 가능한 이유 = 4-tuple
(클라IP, 클라Port, 서버IP, 서버Port)
서버
┌──────────────────────┐
│ Listening Socket │ ← 8080
├──────────────────────┤
│ Connected Socket A │ ← 엄마 접속
│ Connected Socket B │ ← 아빠 접속
│ Connected Socket C │ ← 동생 접속
└──────────────────────┘
➡ Server Port는 모두 8080이지만 나머지 3개(Client IP, Client Port)가 다르기 때문에 서로 다른 연결로 구분 가능
5️⃣ 데이터 송수신
- connected 소켓에서만 이루어짐
- Listening 소켓에서는 절대 데이터를 주고받지 않음
6️⃣ 소켓 닫기
- 해당 클라이언트와의 통신이 끝나면 connect 소켓 닫음
- Listening 소켓은 서버가 종료될 때까지 유지
728x90
반응형
'네트워크' 카테고리의 다른 글
| [네트워크] 실시간 통신 개념 정리 3 - 웹소켓 동작방식 (0) | 2026.01.03 |
|---|---|
| [네트워크] 실시간 통신 개념 정리 2 - 웹소켓 (0) | 2026.01.03 |
| 서버의 인증서 유효성 검사 (1) | 2024.11.16 |
| HTTP & HTTPS (4) | 2024.11.06 |
| 대칭키 & 비대칭키 (0) | 2024.10.30 |

