소켓 프로그래밍 - 소켓의 의미/특징/종류
16 Mar 2021논리적인 의미로 컴퓨터 네트워크를 경유하는 프로세스 간 통신(Inter-Process Communication, IPC)의 종착점(end-point)
네트워크를 이용해 데이터를 송수신 하고 싶은 프로그램들은 소켓을 거쳐야 한다.
즉, OSI 7 계층의 어플리케이션 계층(application layer)에 존재하는 네트워크 응용 프로그램들은 데이터를 송수신 하기 위해 소켓을 거쳐 전송 계층(trasport layer)의 통신 망으로 전달함으로써 데이터를 송수신 하게 된다.
따라서 소켓은 그 사이에 위치하고 있으며, 응용 프로그램에서 TCP/IP를 이용하는 인터페이스 역할을 한다.
통신을 통해 전달되는 모든 데이터 포맷은 5-tuple 이라는 규격에 맞추어 흐르게 된다.
-
프로토콜 (Protocol)
-
호스트 IP 주소 (source IP address)
-
호스트 port 번호 (source port nunber)
-
목적지 IP 주소 (destination IP address)
-
목적지 port 번호 (destination port number)
- IP 주소: 호스트(컴퓨터, 스마트 폰 등의 단말기)들을 식별할 수 있는 고유한 주소다. IP 주소가 있으면 어떤 호스트에 데이터를 보내는 지, 누가 보내는 지를 알 수 있다.
- port 번호: 호스트 내의 프로세스들을 식별할 수 있는 번호다.
소켓도 위 정보들인 프로토콜, IP 주소, port 번호가 있어야 정의된다.
먼저 보통 소켓은 인터넷 소켓이며, 위에서도 말했듯이 전송 계층 위에서 동작하므로 프로토콜은 TCP/UDP 가 된다. 프로토콜이 정의되면 네트워크 상에서 데이터를 송수신할 수 있는 방법, 규칙이 정의된 것이다.
이제 누가 어디로 보낼 지를 정의하기 위한 주소로 IP와 port 정보가 필요하다. IP 주소는 어떤 호스트(단말기)로 데이터를 보내야 할 지 알려준다. IP 주소를 이용해 원하는 호스트에 도착했다고 끝이 아니라 송수신할 프로세스를 찾아야 한다. 소켓은 프로세스 간 통신을 하기 위한 api다. 이때 port 번호를 통해 어떤 프로세스에 가야할 지 정할 수 있다.
즉, 호스트의 어떤 프로세스와 다른 호스트(목적지 호스트)의 프로세스가 네트워크 상에서 통신하기 위해 당연하게 위 정보들이 필요하게 된다.
또 중요한 부분이 1개의 프로세스는 1개 이상의 소켓을 사용할 수 있다. 따라서 1개의 호스트 내의 프로세스 1개로 여러 개의 소켓을 열어 다수의 호스트들과 통신도 가능하다. 이때 소켓들을 구분하는 방법은 소켓에 주어지는 소켓 번호로 식별한다.
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
socket()
: 소켓 생성(TCP는 stream)bind()
: 사용할 IP address와 Port number 등록listen()
: 연결 되지 않은 소켓을 요청 수신 대기 모드로 전환(Block 상태)
Client
socket()
: 마찬가지로 소켓 생성(TCP는 stream)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()
과정이 필요 없기 때문에 소켓을 생성한 후 바로 데이터 전송
따라서 주로 일 대 다 통신에 많이 쓰임