[네트워크] 실시간 통신 개념 정리 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 실행 흐름(클라이언트 ↔ 서버)

https://recipes4dev.tistory.com/153

 

 


 

클라이언트측 과정

 

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 값 고려해서 )

→ 이런 과정을 통해 패킷이 어떤 소켓으로 가야하는 지 결정을 함

https://recipes4dev.tistory.com/153

 

 

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
반응형