ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Socket 통신
    Computer Science/Network 2019. 9. 23. 20:54

    Socket 이란

    소켓(Socket)의 사전적 정의는 구멍, 연결, 콘센트 등이다. 가정에서 사용하는 콘센트의 돼지코와 코드를 생각하면 쉽게 이해할 수 있다. 네트워크 프로그래밍적으로 생각해보면 프로그램이 네트워크에서 데이터를 송수신 할 수 있도록 네트워크 환경에 연결할 수 있게 만들어진 연결부 혹은 창구가 바로 소켓이다.

    콘센트에도 220v, 110v 등 규격이 있듯이 소켓도 통신 프로토콜 규격에 맞게 만들어져야 한다. 소켓은 특히 OSI 7 계층의 4계층인 TCP 상에서 동작하는 소켓을 주로 사용하는데 흔히 "TCP 소켓", "TCP/IP 소켓" 이라 부른다.

    Socket Programming

    소켓으로 네트워크 통신 기능을 구현하기 위해서는 기본적으로 다음에 대한 이해가 있어야 한다.

    • 클라이언트 소켓, 서버 소켓의 역할 및 구성
    • 소켓을 통한 데이터 전달
    • 소켓 API 사용법(실행 흐름)

    나아가 통신에는 여러 변수가 많기 때문에 여러 예외 상황에 대한 처리도 필요하다.

    • 케이블 분리로 인한 네트워크 단절
    • 트래픽 증가에 따른 데이터 전송 지연
    • 시스템 리소스 관리
    • ...

    예외 상황에 대한 처리 등은 차차 알아보고 우선은 기본적인 사항들에 대해 알아보자.

    클라이언트 소켓, 서버 소켓의 역할 및 구성

    각각의 소켓에 대해 알아보기 전에 기본적으로 숙지할 점은 각각의 소켓이 직접 데이터를 주고받는게 아니라 네트워크를 통해서 데이터를 주고받는다는 점이다.

    따라서 각 소켓은 역할에 따라 네트워크에 요청을 하고 요청 결과에 따라서 알맞은 처리를 한다. 각각이 어떤 요청을 하고 어떤 처리를 해야할 지 중점적으로 생각해보자.

    우선 각각의 역할을 개괄적으로 살펴보자.

    Client

    • 생성(create) 
    • 연결요청(connect)
    • 데이터 송수신(send/recv) 
    • 닫기(close)

    Server

    • 생성(create)
    • 서버와 결합(서버의 IP, 포트 번호 생성 후 결합) (bind)
    • 수신대기 (listen)
    • 요청 수락(accept)
    • 데이터 송수신(send/recv)
    • 닫기(close)

    좀 더 자세히 살펴보자.

    Client Socket


    Create

    소켓을 생성할 때 소켓의 종류를 정할 수 있는데, TCP 소켓을 위해서는 stream 타입, UDP 소켓을 위해서는 Datagram 타입을 지정한다. (외에도 다양한 옵션(family, raw) 등을 선택할 수 있다.)

    이 시점에는 어떠한 연결정보(IP, 포트 등)도 갖고 있지 않는다.

    Connect

    원하는 대상(IP 주소, Port 번호 ex) 2.2.2.2:7000)에게 연결 요청을 보낸다.

    요청 결과에 따라(연결, 거절, 시간초과 등) 다른 처리를 해야하므로 결과를 기다려 처리한다.

    Send/Recv

    send의 경우 자신이 어떤 데이터를 보낼지 알 수 있고 보내버리면 끝이지만 recv의 경우 알 수 없다. 따라서 recv는 한 번 실행되면 언제 끝날 지 알 수 없는 상태가 된다. 따라서 recv는 별도의 쓰레드에서 실행한다.

    Close

    한번 닫힌 소켓은 더 이상 사용할 수 없다. 다시 통신을 하기 위해서는 다시 Create부터 시작해야 한다.  

     

    Server Socket


    Create

    Client와 동일하다.

    Bind

    소켓이 중복된 주소를 갖는다면 해당 주소로 데이터가 들어올 때 어떤 소켓에서 처리해야 할 지 알 수 없기 때문에 각각의 소켓은 고유의 식별자를 갖는다.(IP주소 + 포트번호) 각각의 소켓이 중복되지 않게 포트를 지정해주는 것을 bind라 한다.

    Listen

    정상적으로 바인딩 되었다면 서버 소켓은 요청을 받아들일 준비가 된 것이다. 따라서 이제 포트로 클라이언트의 요청이 들어오는지 대기하고 있는다.

    Listen이 하는 일은 크게 두 가지로 요청이 제대로 들어오는지(Success) 않는지(Fail) 만을 확인한다. 클라이언트의 요청에 대한 정보는 시스템 내부적으로 관리되는 큐(Queue)에 쌓이게 된다. 아직 연결이 되지 않는 대기상태이다.

    Accept

    이제 남은 일은 큐에 쌓인 요청을 꺼내와 소켓을 연결하는 것이다. Server 소켓은 이 일을 직접하지 않고 이를 위한 새로운 Socket을 만들어 처리한다. 다시 말해 여기서 새로 만들어진 소켓이 실질적인 데이터 송수신을 처리하고 Server 소켓은 요청 하나와 새로운 소켓을 맵핑시킨 뒤 다시 대기(Listen)하거나 소켓을 닫는다.(Close)

    Send/Recv

    Client와 동일하다.

    Close

    역시 Client와 동일하다.

     

    참고

    소켓 프로그래밍. (Socket Programming)

    댓글

Designed by Tistory.