[web proxy server] 소켓(SOCKET)이란?

해롱그·2023년 9월 15일

네트워크

목록 보기
1/3
post-thumbnail

BSD Socket

소켓은 버클리 대학에서 만들어져 1982년 BSD(Berkeley Software Distribution) UNIX 4.1에서 처음 소개되었으므로 BSD Socket이라고 표현한다.
내가 친구에게 택배를 보낸다고 했을 때, 상자에 보낼 물건을 넣고 나의 이름, 주소 등의 인적사항친구의 집 주소를 적어야 한다. 컴퓨터에서는 이 역할을 소켓이 해준다고 보면 된다.

Socket

인터넷에서 정보를 주고 받는 것은 매우 복잡한 매커니즘에 기반한다. 이를 단순화 하기 위해서 *OSI 7계층을 만들고, 다시 이를 단순화 해서 TCP/IP4 계층을 만들어서 인터넷 애플리케이션 개발에 활용하고 있다.

하지만 이 마저도 복잡하다. 그리고 계층만 나누는 것으론 한계가 있다.
why? 계층별 각 프로토콜은 일종의 통신 규약일 뿐, 프로토콜 구현을 위해 안에 들어갈 구체적인 구현부인 함수가 필요하다.

그래서 만든게 소켓이다. 소켓은 몇 개의 간단한 함수만으로도 인터넷 애플리케이션을 만들 수 있도록 도와주는 함수 모음이다.

일반적으로 TCP/IP 프로토콜을 이용한다.

TCP/IP 4계층에서 전송계층 위에 놓인다. 그 위에서 전송계층의 프로토콜 제어를 위한 코드를 제공한다. 즉, 소켓은 엔드포인트다. 통신의 양 끝단 📡 !

소프트웨어와 소프트웨어를 연결하는 소켓

인터넷은 소프트웨어와 소프트웨어의 네트워크다. 따라서 다양한 종류의 인터넷 서비스가 가능하다.

소켓은 운영체제에서 관리하는 객체로 소프트웨어를 인터넷에 연결해주는 접점 역할을 한다. 인터넷과의 점점에 놓여서 인터넷으로 데이터를 전송하거나 또는 인터넷으로부터 전송되는 데이터를 읽는 것이다.

소프트웨어 연결에 필요한 것들

인터넷에 묶여있는 컴퓨터를 찾기 위해서는 IP(인터넷 주소)가 필요하다. 하지만 소켓 프로그래밍은 소프트웨어와 소프트웨어를 연결하는 것이므로 소프트웨어의 위치를 찾을 수 있어야 한다. 소프트웨어의 위치는 port number로 찾을 수 있다.
즉, IPport 번호만 있으면 전체 인터넷 상에서 유일한 소프트웨어를 찾아서 연결할 수 있다.

소켓의 3요소

protocol, IP 주소, port number 로 정의된다.

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

Socket Programming

프로세스 간 통신에 사용되는 Socket을 이용한 통신 프로그래밍

Socket API flow

소켓 통신 프로그래밍은 서버와 클라이언트로 나뉜다.

client socket

  1. socket() : 소켓 생성(연결 대상에 대한 정보가 없는 껍데기 소켓)
    이 때, 소켓의 종류를 선택해야 한다. TCP Socket 을 위해선 stream type, UDP Socket 을 위해선 datagram type 으로 지정 가능하다.
  2. connect() : IP주소와 port number로 통신할 서버를 정하여 연결 요청
    통신 시도 시, 서버가 accept() 함수로 클라의 socket descriptor (fd) 반환한다.
    이를 통해 클라와 서버가 서로 read(), write()를 반복하며 통신한다.
    요청을 보내고 단순히 끝나는 게 아니라, 그 요청에 대한 결과(fd)가 반드시 돌아와야만 connect의 실행이 끝난다.
  3. send() / recv() : 데이터 송수신
    연결 요청(connect)과 같이 요청을 보낸다고 끝나는 게 아니라 요청에 대한 결과(신호)가 들어와야 실행이 끝난다.
    but, 송신할 때는 데이터를 보내는 것이기 때문에 언제, 얼마나 보낼 것인지 알 수 있지만, 수실할 땐 상대방이 언제, 얼만큼의 데이터를 보낼 것인지 알 수가 없다. 그러므로 수신하는 API는 별도의 Thread에서 진행하게 된다.
  4. close() : 소켓 닫기
    더 이상의 데이터 송수신이 없다고 판단되면 소켓을 닫는다.

server socket

데이터 송수신 시, 보안이 가장 중요하다.

내가 만약 언니에게 카톡을 보냈다면 우리 언니만 그 카톡을 볼 수 있어야 한다. (당연..)

즉, 내가 어떤 데이터를 보내려고 할 때, 수신측에서 무작정 데이터를 수신하는게 아니라 port 번호를 식별하여 알맞게 들어온 프로세스만을 수신하여야 한다.

  1. socket() : 소켓 생성(연결 대상에 대한 정보가 없는 껍데기 소켓)
  2. bind() : ip와 port 번호 설정
    우리는 컴퓨터를 사용할 때 많은 서비스를 이용한다. 즉, 수많은 프로세스가 동시에 돌아가고 있다.
    만약, 서버 소켓이 받은 데이터를 다시 보내주어야 할 때 프로세스들의 port number가 동일하다면 혼란이 생길 수 있다. 따라서 서버 소켓이 고유한 포트 번호를 만들 수 있도록 소켓과 포트번호를 결합해주는 작업이 필요하다.
    💡 하나의 프로세스는 동일한 port number를 가진 여러 개의 소켓을 결합할 수 있다.
    즉, 호스트가 하나의 port로 여러 개의 소켓을 만들어 다른 호스트들과 데이터를 주고 받을 수 있다.
    
    이러한 특징 덕분에 우리가 하나의 채팅 앱을 사용하더라도 동시에 여러 사람들과 채팅을 주고 받을 수 있는 것인가?
    ex) 특정 포트가 소켓을 여러 개 열어서 socket1 - 엄마, socket2 - 아빠 … 와 채팅할 수 있는 것!
  3. listen() : 클라이언트의 연결 요청 대기
    서버 소켓에서 바인딩 작업을 마치고 나면 클라이언트로부터 연결 요청을 받아들일 준비가 완료된 것이다.
    클라이언트가 연결 요청을 할 때까지 기다리다가 연결 요청이 오면 대기 상태를 종료하고 리턴한다.
  4. accept() : 클라이언트 연결 수립
    실질적인 연결이 여기서 시작된다.
    서버 소켓은 사실… 연결 요청을 받아들임과 동시에 새로운 소켓을 생성한다.
    서버 소켓의 메인 역할은 just 클라이언트 연결 요청을 기다리는 것. 따라서 클라이언트 소켓으로부터 연결 요청을 받으면 new socket()하고, 이것과 클라이언트 소켓을 매핑해서 넘겨준다.
  5. send() / recv() : 데이터 송수신
  6. close() : 소켓 닫기
    서버 소켓은 자신이 생성한 소켓들도 관리해야 한다.

소켓의 종류

1. 스트림 소켓

  • TCP(Transmission Control Protocol)을 사용하는 연결 지향 방식의 소켓
  • 송수신자의 연결을 보장하여 신뢰성 있는 데이터 송수신이 가능
  • 데이터의 순서 보장
  • 소량의 데이터보다 대량 데이터 전송에 적합
  • 점대점 연결

2. 데이터그램 소켓

  • UDP(User Diagram Protocol)을 사용하는 비연결형 소켓
  • 데이터의 순서와 신뢰성을 보장하기 어려움
  • 점대점 뿐만 아니라 일대다 연결도 가능
  • accept 과정없이 소켓 생성 후 바로 데이터 송수신

    *UDP?
    IP를 확장한 프로토콜 중 하나
    UDP는 데이터그램 형태의 패킷을 사용하여 데이터를 전송하는 프로토콜로, 주로 IP 네트워크를 통해 데이터를 송수신하는 데 사용된다.


    데이터그램 형태의 패킷: UDP는 데이터를 작은 패킷, 즉 데이터그램으로 나누어 전송한다. 이 데이터그램은 독립적으로 처리되며 각각이 목적지 호스트로 전송된다. 이것은 데이터를 나누어 전송하고 다시 조립하는데 사용되는 방식이다.


    UDP는 IP 네트워크를 통해 데이터를 데이터그램 단위로 프로세스에서 프로세스로 전송하는 프로토콜이다.

HTTP 통신과 Socket 통신의 비교

HTTP 통신

Client의 요청이 있을때만 Server가 응답하여 해당 정보를 전송하고 곧바로 연결을 종료하는 방식

  • 단방향 통신
  • server로부터 응답을 받은 후에는 연결 바로 중단
  • 실시간 연결 X, 필요한 경우에만 server로 요청을 보내는 상황에 유용
  • 요청을 보내 server의 응답을 기다리는 어플리케이션의 개발에 주로 사용됨

Socket 통신

server와 client가 특정 port를 통해 실시간으로 양방향 통신을 하는 방식

  • 서버와 클라이언트가 계속 연결을 유지하는 양방향 통신
  • 서버와 클라이언트가 실시간으로 데이터를 주고받는 상황이 필요한 경우에 사용됨
  • 실시간 동영상 스트리밍이나 온라인 게임 등과 같은 경우에 자주 사용됨
profile
사랑아 컴퓨터해 ~

0개의 댓글