♠ 소켓이란?

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

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

  • 즉, 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개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN