ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 소켓 프로그래밍
    💻 computer science/🌐 network 2025. 8. 6. 17:55

    🔍 소켓이란?

    소켓(Socket) 컴퓨터 네트워크에서 데이터를 주고받기 위한 통신 종단점(endpoint)입니다.

     

    서버와 클라이언트가 특정 포트를 통해 양방향 통신을 가능하게 하며 소켓이 각 애플리케이션에 통신 인터페이스를 제공합니다.

    • 엔드포인트: IP 주소 + 포트 번호의 조합이 소켓의 고유 식별자
    • 일반적으로 TCP/IP, UDP/IP 등 표준 네트워크 프로토콜을 사용

     

    ✅ 소켓이 하는일

    역할 설명
    양방향 데이터 송수신 소켓을 통해 서버와 클라이언트가 데이터를 주고받습니다.
    네트워크 통신 추상화 소켓은 복잡한 네트워크 계층(IP, TCP/UDP 등)을 추상화하여 비교적 간단하게 통신 기능을 구현할 수 있도록 도와줍니다.
    IP 주소 및 포트 식별 소켓은 어떤 IP 주소의 어떤 포트로 통신할 것인지를 지정하고 이를 통해 여러 애플리케이션이 동시에 네트워크를 사용할 수 있게 합니다.
    연결 관리(서버) 서버는 클라이언트의 접속 요청을 수락할 때마다 새로운 소켓을 생성하고 이를 통해 다수의 클라이언트와 동시에 통신할 수 있습니다.

     

     

    🤖 소켓 종류

    소켓은 주로 통신 프로토콜에 따라 두 가지 종류로 나뉩니다.

     

    1️⃣ 스트림 소켓

    • 프로토콜: 주로 TCP 사용

    📖 특징

    연결 지향 방식으로 데이터 전송의 신뢰성과 순서를 보장합니다.

    데이터를 바이트 스트림 형태로 전송하며 데이터 손실이나 손상 시 재전송하여 완전한 데이터 전달을 보장합니다. 

     

    2️⃣ 데이터그램 소켓

    • 프로토콜: 주로 UDP를 사용

    📖 특징

    비연결 지향(Connectionless) 방식입니다.

    데이터 전송의 신뢰성이나 순서를 보장하지 않습니다.

    데이터를 패킷(데이터그램) 단위로 전송하며 각 패킷은 독립적으로 처리됩니다.

    연결 설정 과정이 없어 빠르지만 패킷이 유실되거나 순서가 뒤바뀔 수 있습니다.

     

     

    🏃 소켓 통신 과정 (TCP / IP)

    Server Socket

    • 통신 연결 요청을 받아들이는 Socket

    Client Socket

    • 통신 연결 요청을 보내는 Socket

     

    https://recipes4dev.tistory.com/153

    ✅ Server Socket

    1️⃣ 서버 소켓 생성 - socket()

    네트워크 통신을 위한 빈 소켓(socket)을 생성합니다.

    • 아직 특정 주소와 포트에 할당되지 않은 상태

     

    2️⃣ 바인딩 - bind() ⭐

    생성된 소켓에 서버의 IP 주소와 포트 번호를 부여하여 네트워크 상의 고유한 '주소'를 할당합니다.

    https://recipes4dev.tistory.com/153

     

    🚀 이 작업이 필요한 이유

     

    네트워크 주소 부여

    • 서버는 여러 클라이언트의 요청을 기다려야 하는데 클라이언트가 어디로 요청을 보내야 할지 알아야 합니다.
    • bind()는 소켓에 서버의 IP 주소와 서비스를 제공할 포트 번호를 결합해 클라이언트가 서버를 찾아올 수 있는 고유한 경로를 만들어 줍니다.

     

    혼란 방지

    • 만약 여러 서버 프로세스가 동일한 포트 번호를 사용하려 한다면 운영체제는 어떤 프로세스가 특정 포트로 들어온 데이터를 처리해야 할지 알 수 없습니다.
    • bind()는 이 문제를 해결하기 위해 운영체제가 포트 번호를 사용하여 각 소켓을 유일하게 식별하고 관리할 수 있도록 합니다.

     

    3️⃣ 연결 요청 대기 - listen()

     

    바인딩된 소켓을 연결 요청 대기 상태로 전환합니다.

    • 클라이언트로부터의 연결 요청을 받을 준비 완료!

    listen() 함수는 동시에 처리할 수 있는 최대 클라이언트 연결 요청 수를 설정합니다

     

    4️⃣ 연결 수락 - accept()

     

    listen() 상태에서 클라이언트의 연결 요청이 오면 accept() 함수가 이를 수락합니다.

    accept()는 요청을 수락함과 동시에 실제 데이터 통신에 사용할 새로운 소켓을 생성합니다.

    • 새로운 소켓이 클라이언트와 1:1로 연결되어 데이터를 주고받게 됩니다.

     

    5️⃣ 데이터 송수신 - send()/recieve()

     

    accept()를 통해 생성된 새로운 소켓을 사용하여 클라이언트와 데이터를 주고받습니다.

     

    6️⃣ 소켓 종료 - close()

     

    통신이 끝난 후 소켓을 닫아 리소스를 반환합니다.

    서버는 통신을 마친 소켓을 닫고 다시 accept()를 통해 다른 클라이언트의 연결을 기다릴 수 있습니다.

     

    ✅ Client 소켓

    1️⃣ 소켓 생성 - socket()

    - 서버와 통신할 소켓을 생성합니다.

    클라이언트 소켓의 포트 번호는 보통 운영체제가 자동으로 할당합니다.

     

    2️⃣ 연결 요청 - connect()

    생성된 소켓을 이용해 서버의 IP 주소와 포트 번호로 연결을 요청합니다.

    connect() 함수는 서버의 listen()과 accept() 과정에 응답해 연결이 성공적으로 이루어지면 통신 준비가 완료됩니다.

     

    3️⃣ 데이터 송수신 - send()/recieve()

    연결된 소켓을 통해 서버와 데이터를 주고받습니다.

     

    4️⃣ 소켓 종료 - close()

    통신이 끝난 후 소켓을 닫아 리소스를 반환합니다.

    '💻 computer science > 🌐 network' 카테고리의 다른 글

    웹 서버와 WAS  (0) 2025.09.17
    HTTP Request / Response 구조  (0) 2025.08.06
    네트워크 통신 방식 - 유니캐스트, 브로드캐스트, 멀티캐스트  (0) 2025.08.06
    HTTPS  (0) 2022.10.09
    TCP / UD  (0) 2022.10.09

    댓글

Designed by Tistory.