on1ystar 머릿속을 정리, 기록하는 곳

소켓 프로그래밍 - 소켓의 의미/특징/종류


의문점이나 지적 등의 관심 및 조언을 위한 댓글이나 메일은 언제나 환영이고 감사합니다.
Socket

논리적인 의미로 컴퓨터 네트워크를 경유하는 프로세스 간 통신(Inter-Process Communication, IPC)의 종착점(end-point)

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

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

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

5-Tuple

통신을 통해 전달되는 모든 데이터 포맷은 5-tuple 이라는 규격에 맞추어 흐르게 된다.

  1. 프로토콜 (Protocol)

  2. 호스트 IP 주소 (source IP address)

  3. 호스트 port 번호 (source port nunber)

  4. 목적지 IP 주소 (destination IP address)

  5. 목적지 port 번호 (destination port number)

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

소켓도 위 정보들인 프로토콜, IP 주소, port 번호가 있어야 정의된다.

먼저 보통 소켓은 인터넷 소켓이며, 위에서도 말했듯이 전송 계층 위에서 동작하므로 프로토콜은 TCP/UDP 가 된다. 프로토콜이 정의되면 네트워크 상에서 데이터를 송수신할 수 있는 방법, 규칙이 정의된 것이다.

이제 누가 어디로 보낼 지를 정의하기 위한 주소로 IP와 port 정보가 필요하다. IP 주소는 어떤 호스트(단말기)로 데이터를 보내야 할 지 알려준다. IP 주소를 이용해 원하는 호스트에 도착했다고 끝이 아니라 송수신할 프로세스를 찾아야 한다. 소켓은 프로세스 간 통신을 하기 위한 api다. 이때 port 번호를 통해 어떤 프로세스에 가야할 지 정할 수 있다.

즉, 호스트의 어떤 프로세스와 다른 호스트(목적지 호스트)의 프로세스가 네트워크 상에서 통신하기 위해 당연하게 위 정보들이 필요하게 된다.

또 중요한 부분이 1개의 프로세스는 1개 이상의 소켓을 사용할 수 있다. 따라서 1개의 호스트 내의 프로세스 1개로 여러 개의 소켓을 열어 다수의 호스트들과 통신도 가능하다. 이때 소켓들을 구분하는 방법은 소켓에 주어지는 소켓 번호로 식별한다.

Secket 통신의 특징

server-client 구조

TCP/UDP 위에서 동작하므로 당연하게 server-client 통신 구조를 갖춘다.

처음에 데이터를 보내는 쪽이 client가 되고, 받는 쪽이 server가 된다. 이후에는 서로가 데이터를 송수신할 수 있다. (자세한 설명은 아래)

양방향 통신

socket은 한 쪽에서 데이터를 보내고 반대 편에서 이를 수신한 뒤 연결이 끊어지는게 아니라 양 쪽에서 실시간으로 데이터를 송수신할 수 있다. 따라서 실시간 스트리밍이나 채팅에 주로 유용하게 사용된다.

프로그래밍 언어나 운영체제에 종속적

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

소켓의 종류 및 통신 흐름

Stream sockets - TCP (Transmission Control Protocol)

  • TCP를 사용하므로 연결 지향형(Connection-oriented) 소켓

  • 신뢰성을 보장한다

  • 데이터가 순서대로 송수신된다

  • 점대점(point-to-point) 연결

Server

  1. socket(): 소켓 생성(TCP는 stream)
  2. bind(): 사용할 IP address와 Port number 등록
  3. listen(): 연결 되지 않은 소켓을 요청 수신 대기 모드로 전환(Block 상태)

Client

  1. socket(): 마찬가지로 소켓 생성(TCP는 stream)
  2. connect(): Client에서 Server와 연결하기 위해 소켓과 목적지 IP address, Port number 지정 (Block 상태)

Server

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

처음 만들어 진(bind()listen()한) 소켓은 그 이후로도 새로운 Client의 요청을 대기하기 위해 쓰임

Server-Client

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

Datagram sockets - UDP (User Datagram Protocol)

  • UDP를 사용하므로 비 연결형(Connectionless) 소켓

  • 신뢰성을 보장할 수 없다.

  • 데이터가 순서대로 송수신될 지를 보장하지 못한다.

  • 점대점 연결뿐만 아니라 일대다도 가능

connect()과정이 필요 없기 때문에 소켓을 생성한 후 바로 데이터 전송

따라서 주로 일 대 다 통신에 많이 쓰임

Reference

https://en.wikipedia.org/wiki/Network_socket

https://bnzn2426.tistory.com/52?category=770232