소켓(Socket)

이승현·2022년 11월 7일
0
post-thumbnail

♠ 소켓이란?

  • 프로그램이 네트워크에서 데이터를 주고받을 수 있도록 네트워크 환경에 연결할 수 있게 만들어진 연결부

  • 네트워크를 이용해 데이터를 송수신 하고 싶은 프로그램들은 소켓을 거쳐야 함

  • 즉, OSI 7 계층의 어플리케이션 계층(application layer)에 존재하는 네트워크 응용 프로그램들은 데이터를 송수신 하기 위해 소켓을 거쳐 전송 계층(trasport layer)의 통신 망으로 전달함으로써 데이터를 송수신 하게 된다.

  • 따라서 소켓은 그 사이에 위치하고 있으며, 응용 프로그램에서 TCP/IP를 이용하는 인터페이스 역할을 한다.


♠ 소켓의 역할

1) 소프트웨어와 소프트웨어를 연결

  • IP와 서비스 포트를 통해 찾음

2) 소프트웨어 간 데이터 통신

  • 인터넷에서 소켓을 찾아 연결하고 데이터를 송수신함

♠ 소켓의 특징

1) 파일과 비슷한 데이터 타입

  • 소켓은 파일 디스크립터와 비슷한 형식의 데이터

  • 생성과 설정 과정이 끝나면 이를 이용하여 통신과 관련된 다양한 작업을 할 수 있는 간편한 데이터 타입

2) TCP/IP 표준이 아닌 네트워크 프로그래밍 인터페이스

  • 소켓이 TCP/IP 프로토콜에서 대부분 사용되기 때문에 TCP/IP 표준으로 오해하는 경우가 있음

  • TCP/IP의 관점에서 소켓은 하나의 네트워크 프로그래밍 인터페이스

3) 운영체제나 언어에 종속적

  • TCP/IP 표준이 아니라 네트워크 프로그래밍 인터페이스다. 따라서 운영체제마다 사용법이 약간씩 다르며, 그 안에서 또 프로그래밍 언어마다 소켓 api를 구현한 라이브러리가 다 다르다. Java, Linux, windows 등 소켓 API가 모두 다름

4) 5-Tuple

  • 통신을 통해 전달되는 모든 데이터 포맷은 5-tuple이라는 규격에 맞추어 흐르게 됨
  • 소켓 역시 이 5-tuple의 정보를 가지고 있음

① 프로토콜 (TCP,UDP)
② 자신의 IP address
③ 자신의 Port number
④ 목적지 IP address
⑤ 목적지 Port number

  • IP 주소: 호스트(컴퓨터, 스마트 폰 등의 단말기)들을 식별할 수 있는 고유한 주소다. IP 주소가 있으면 어떤 호스트에 데이터를 보내는 지, 누가 보내는 지를 알 수 있다.
  • port 번호: 호스트 내의 프로세스들을 식별할 수 있는 번호다.

5) 양방향 통신

  • socket은 한 쪽에서 데이터를 보내고 반대 편에서 이를 수신한 뒤 연결이 끊어지는게 아니라 양 쪽에서 실시간으로 데이터를 송수신할 수 있다.

  • 따라서 실시간 스트리밍이나 채팅에 주로 유용하게 사용된다.

    ♠ Socket Programming

  • 프로세스 간 통신에 사용되는 Socket을 이용한 통신 프로그래밍을 socket programming이라고 함

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

  • Client Socket : 통신 연결 요청을 보내는 Socket
    --> 동일한 구조의 Socket이지만, 역할에 따라 처리되는 흐름이 조금씩 다름


♠ 소켓 종류 및 통신 흐름 (Client, Server)

▲ (1) Stream sockets - TCP (Transmission Control Protocol)

<특징>

  • TCP를 사용하므로 연결 지향형(Connection-oriented) 소켓
  • 신뢰성을 보장
  • 데이터가 순서대로 송수신됨
  • 점대점(point-to-point) 연결

① Server 흐름

0) 보안은 데이터 송수신 시 매우 중요

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

1) 서버 소켓 생성

  • 클라이언트 소켓과 마찬가지로 연결 대상에 대한 정보가 들어있지 않은 껍데기 소켓을 생성함
socket() : 소켓 생성(TCP는 stream)

2) 바인딩(bind)

bind() : 사용할 IP address와 Port number 등록
  • 우리는 컴퓨터를 사용할 때 매우 많은 서비스를 이용한다.
    즉, 수많은 프로세스가 동시에 돌아가고 있다.

  • 서버 소켓이 고유한 포트 번호를 만들 수 있도록 소켓과 포트번호를 결합해주는 작업이 필요
    --> 서버 소켓이 받은 데이터를 다시 보내주어야할 때 프로세스들의 포트번호가 동일하다면 혼란이 생길 수 있음

  • 위의 그림과 같이 소켓이 사용하는 포트 번호가 다른 소켓의 포트 번호와 중복된다면 어떤 상황이 될까?

    • 모든 소켓이 10000 이라는 동일한 포트 번호를 사용하게 된다면, 네트워크를 통해 10000 포트로 데이터가 수신될 때 어떤 소켓이 처리해야 하는지 결정할 수 없는 문제가 발생할 것이다. 이런 이유로 운영체제에서는 소켓들이 중복된 포트 번호를 사용하지 않도록, 내부적으로 포트 번호와 소켓 연결 정보를 관리한다.
  • 하나의 프로세스는 동일한 포트 번호를 가진 여러 개의 소켓을 결합 할 수 있다. 즉, 호스트가 하나의 Port로 여러 개의 Socket을 만들어 다른 호스트들과 데이터를 주고받을 수 있다

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

listen() : 연결되지 않은 소켓을 요청 수신 대기 모드로 전환(Block 상태)
  • 서버 소켓에서 포트번호와 바인딩 작업을 마치고 나면 클라이언트로부터의 연결 요청을 받아들일 준비가 된 것이다.

  • 클라이언트가 연결 요청을 할 때까지 기다리다가 연결 요청이 오면 대기 상태를 종료하고 리턴한다.

② Client 흐름

4) 클라이언트 소켓 생성

  • 연결 대상에 대한 정보가 들어있지 않은 Socket(껍데기 소켓)을 생성
  • 소켓의 종류 :: TCP 소켓 - Stream 타입, UDP 소켓 - 데이터그램 타입으로 지정 가능
socket() : 소켓 생성 (TCP는 stream)

5) 연결 요청 (Connection)

  • 서버 소켓단의 IP주소와 서비스 포트 번호로 연결하고 싶은 타켓대상을 특정
  • 요청을 보내고 단순히 끝나는게 아닌, 그 요청에 대한 결과가 돌아와야만 connect의 실행이 끝남
connect() : Client에서 Server와 연결하기 위해 소켓과 목적지 IP address, Port number 지정(Block 상태)

cf. 서비스 포트란?

    • 서비스 구분을 위한 번호
    • 'ip주소:서비스포트' 형태로 사용
    • 'XX 서비스에 접속하는 포트번호가 뭐야??' 라는 식의 대화 가능
    • 기본 서비스 포트 ( 처음 ssh 접속 시 22포트 , http 구성 시 80 포트)

③ Server 흐름

6) 클라이언트 연결 수립

accept() : client의 요청 수락 후 실질적인 소켓 연결 -> 통신을 위한 새로운 소켓 생성

--처음 만들어 진(bind() 후 listen()한) 소켓은 그 이후로도 새로운 Client의 요청을 대기하기 위해 쓰임
  • 서버 소켓은 연결 요청을 받아들임과 동시에 새로운 소켓을 생성

  • 서버 소켓의 메인 역할은 클라이언트 연결 요청을 기다리는 것

  • 클라리언트 소켓으로부터 연결 요청을 받으면 새로운 소켓을 열고, 이 소켓과 클라이언트 소켓을 맵핑하여 넘겨줌

④ Server - Client 흐름

7) 데이터의 송수신 (Send, Receive)

  • 연결 요청과 같이, 요청에 대한 결과(신호)가 들어와야 실행이 끝남

  • 송신할 때 : 데이터를 보내는 것이기 때문에, 데이터를 언제 얼마나 보낼 것인지 알 수 있음

  • 수신할 때 : 상대방이 언제, 얼만큼의 데이터를 보낼 것인지 알 수가 없다는 서로의 차이점이 존재

send(), recv(): Client는 처음에 생성한 소켓으로, Server는 새로 반환(생성)된 소켓으로 client와 server간에 데이터 송수신

★ 그렇기 때문에 수신하는 API는 별도의 Thread에서 진행하게 됨

8) 소켓 닫기

  • 더 이상의 데이터 송수신이 없다고 판단되면 소켓을 닫음
close(): 소켓을 닫음

▲(2) Datagram sockets - UDP (User Datagram Protocol)

<특징>

  • UDP를 사용하므로 비 연결형(Connectionless) 소켓
  • 신뢰성 보장 X
  • 데이터가 순서대로 송수신될 지를 보장하지 못함
  • 점대점 연결뿐만 아니라 일대다도 가능
  • 실시간 동영상 서비스에 많이 이용됨

UDP는 비연결형 서비스이므로 TCP보다 빠르고 네트워크 부하가 적지만 신뢰성은 낮다. 신뢰성보다는 연속성, 성능이 중요한 실시간 서비스 등에 사용한다.

0개의 댓글