[Network] Extra. 소켓

KYJ의 Tech Velog·2023년 4월 25일
0

Network

목록 보기
13/21
post-thumbnail

Socket

HTTP를 통한 통신은 단방향 통신입니다. 클라이언트의 요청이 없다면 서버는 먼저 클라이언트에게 통신을 할 수 없습니다. 이와 달리 소켓 통신은 양방향 통신이 가능한 통신 방식입니다.

소켓(Socket)은 프로세스가 드넓은 네트워크 세계로 데이터를 내보내거나 혹은 그 세계로부터 데이터를 받기 위한 실제적인 창구 역할을 합니다. 프로세스가 데이터를 보내거나 받기 위해서는 반드시 소켓을 열어서 소켓에 데이터를 써보내거나 소켓으로부터 데이터를 읽어들여야 합니다.


소켓 통신

소켓은 프로토콜, IP 주소, 포트 넘버로 정의됩니다.

  • 프로토콜
    어떤 시스템이 다른 시스템과 통신을 원활하게 하도록 해주는 통신 규약, 약속
  • IP 주소
    전 세계 컴퓨터에 부여된 고유의 식별 주소
  • 포트 번호
    네트워크 상에서 통신하기 위해 호스트 내부적으로 프로세스가 할당받아야 하는 고유한 숫자
    같은 컴퓨터 내에서 프로그램을 식별하는 번호

소켓은 떨어져 있는 두 호스트를 연결해주는 도구로써 인테페이스의 역할을 합니다. 데이터를 주고 받을 수 있는 구조체로 소켓을 통해 데이터 통로가 만들어집니다.

소켓은 역할에 따라 서버 소켓, 클라이언트 소켓으로 구분됩니다.

Client

1. 클라이언트 소켓 생성 (socket())

연결 대상에 대한 정보가 들어지 않은 빈 소켓을 생성합니다.

2. 연결 요청 (connect())

연결하고자 하는 서버에게 연결 요청을 전송합니다. IP 주소와 포트 번호로 연결하고자 하는 서버를 특정합니다. 요청을 전송한 후에 요청에 대한 결과가 서버로부터 돌아와야 실행이 끝납니다.

3. 데이터의 송수신 (send()/recv())

연결 요청과 마찬가지로 송신하고나서 송신에 대한 결과가 돌아와야 실행이 끝납니다. 송신할 때에는 데이터를 언제 얼마나 보낼 것인지 알지만 수신할 때에는 언제 얼마나 데이터가 수신될 지 모릅니다. 따라서, 수신하는 API는 별도의 스레드에서 진행됩니다.

4. 소켓 닫기 (close())

데이터 송수신이 없다고 판단되면 소켓을 닫습니다.

Server

0. 보안

데이터를 수신할 때에는 포트 번호를 식별하여 알맞게 들어온 프로세스만을 수신해야 합니다.

1. 서버 소켓 생성 (socket())

연결 대상에 대한 정보가 들어지 않은 빈 소켓을 생성합니다.

2. 바인딩 (bind())

컴퓨터에는 수많은 프로세스가 동시에 실행되고 있습니다. 만약 서버 소켓이 받은 데이터를 다시 보내줘야할 때 프로세스들의 포트 번호가 동일하다면 혼란이 생길 수 있습니다. 따라서 서버 소켓이 고유한 포트 번호를 만들 수 있도록 소켓과 포트 번호를 결합해주는 작업이 필요합니다.

만약 소켓들의 포트 번호가 중복된다면 해당 포트 번호로 데이터가 수신될 때 어떤 소켓이 처리해야 할지 결정할 수 없는 문제가 발생할 것입니다.

운영체제에서는 소켓이 중복된 포트 번호를 사용하지 않도록 내부적으로 포트 번호와 소켓 연결 정보를 관리합니다.

하나의 포르세스는 동일한 포트 번호를 가진 여러 개의 소켓을 결합할 수 있습니다. 즉, 호스트가 하나의 포트로 여러 개의 소켓을 만들어 다른 호스트와 데이터를 주고받을 수 있습니다.

3. 클라이언트 연결 요청 대기 (listen())

클라이언트가 연결 요청을 기다리다가 연결 요청이 오면 대기 상태를 종료합니다.

4. 클라이언트 연결 수립 (accept())

클라이언트가 연결 요청을 보내면 서버 소켓은 새로운 소켓을 생성해서 클라이언트 소켓과 연결해줍니다.

앞서 만들었던 소켓은 대기까지의 과정을 책임지는 소켓이었던 것입니다.

5. 데이터의 송수신 (send()/recv())

클라이언트와 동일합니다.

6. 소켓 닫기 (close())

클라이언트와 동일합니다. 다만 서버 소켓은 자신이 생성한 소켓들도 관리해야 합니다.

소켓의 종류

TCP를 이용하느냐 UDP를 이용하느냐에 따라서 소켓의 종류가 달라집니다.

  • Stream Socket (TCP)
    TCP를 이용하기 때문에 데이터를 주고 받기 전에 송수신 측이 서로 연결되어 있어야 합니다. 그리고 송신한 데이터가 수신 측에 잘 도착했는지 확인하는 과정을 거칩니다. 또한 데이터를 주고 받는 속도를 조절해 통신 효율이 떨어지거나 데이터가 손실되는 일을 방지할 수 있습니다. 송신한 순서대로 데이터가 수신됩니다. 신뢰성이 중요한 서비스에 주로 이용됩니다.
  • Datagram Socket (UDP)
    UDP를 이용하기 때문에 데이터를 주고 받기 전에 송수신 측이 연결되어 있지 않아도 됩니다. 또한 송신된 데이터가 잘 수신되었는지 확인하지 않습니다. 송신한 순서도 고려하지 않습니다. 신뢰성보다는 속도가 중요한 서비스에 주로 이용됩니다.

WebSocket

웹소켓은 HTTP와 같이 약속입니다. 서버와 클라이언트 간의 효율적인 양방향 통신을 실현하기 위한 구조입니다. 웹소켓은 단순한 API로 구성되어 있으며, 웹소켓을 이용하면 하나의 HTTP 접속으로 양방향 통신을 자유롭게 할 수 있습니다.

웹소켓이 나오기 이전에는 클라이언트의 요청이 없다면 서버로부터 응답을 받을 수 없는 구조였습니다. 웹소켓은 이런 문제를 해결하는 새로운 약속이었습니다.

웹소켓에서는 서버와 클라이언트 사이에 양방향 통신이 가능합니다. 브라우저는 서버가 직접 보내는 데이터를 받아들일 수 있고, 사용자가 다른 웹사이트로 이동하지 않아도 최신 데이터가 적용된 웹을 볼 수 있게 해줍니다. 웹페이지를 새로고침하거나 다른 주소로 이동할 때 덧붙인 부가 정보를 통해서만 새로운 데이터를 제공하는 웹서비스 환경의 빗장을 본질적으로 풀어준 셈입니다.

웹에서도 채팅이나 게임, 실시간 주식차트와 같은 실시간 통신이 요구되는 응용프로그램의 개발을 한층 효과적으로 구현할 수 있게 됩니다.

WebSocket Protocol

웹소켓은 HTTP와 같은 응용 계층에 위치하는 프로토콜이며, 전송 계층의 TCP에 의존합니다.

HTTP 프로토콜을 사용할 때 http를 이용하는 것처럼, 웹소켓을 사용할 때 ws를 이용합니다. 또한 보안을 강화한 https처럼 wss를 사용할 수 있습니다.

HTTP를 이용해서 연결을 확립하며 연결된 이후에도 연결할 때 사용했던 80번, 443번 포트를 이용합니다. 연결 확립은 HTTP를 이용한 핸드쉐이크를 통해 이루어집니다.

WebSocket Handshake

웹소켓은 서버와 클라이언트 간의 연결을 웹소켓 핸드쉐이트를 통해 확립합니다. 한 번의 HTTP 요청과 HTTP 응답으로 이루어집니다. 핸드쉐이크가 끝나면 HTTP 프로토콜을 웹소켓 프로토콜로 변환하여 통신을 하는 구조입니다.

0개의 댓글