♠ 소켓이란?
프로그램이 네트워크에서 데이터를 주고받을 수 있도록 네트워크 환경에 연결할 수 있게 만들어진 연결부
네트워크를 이용해 데이터를 송수신 하고 싶은 프로그램들은 소켓을 거쳐야 함
즉, OSI 7 계층의 어플리케이션 계층(application layer)에 존재하는 네트워크 응용 프로그램들은 데이터를 송수신 하기 위해 소켓을 거쳐 전송 계층(trasport layer)의 통신 망으로 전달함으로써 데이터를 송수신 하게 된다.
따라서 소켓은 그 사이에 위치하고 있으며, 응용 프로그램에서 TCP/IP를 이용하는 인터페이스 역할을 한다.
♠ 소켓의 역할
1) 소프트웨어와 소프트웨어를 연결
2) 소프트웨어 간 데이터 통신
♠ 소켓의 특징
1) 파일과 비슷한 데이터 타입
소켓은 파일 디스크립터와 비슷한 형식의 데이터
생성과 설정 과정이 끝나면 이를 이용하여 통신과 관련된 다양한 작업을 할 수 있는 간편한 데이터 타입
2) TCP/IP 표준이 아닌 네트워크 프로그래밍 인터페이스
소켓이 TCP/IP 프로토콜에서 대부분 사용되기 때문에 TCP/IP 표준으로 오해하는 경우가 있음
TCP/IP의 관점에서 소켓은 하나의 네트워크 프로그래밍 인터페이스
3) 운영체제나 언어에 종속적
4) 5-Tuple
① 프로토콜 (TCP,UDP)
② 자신의 IP address
③ 자신의 Port number
④ 목적지 IP address
⑤ 목적지 Port number
5) 양방향 통신
socket은 한 쪽에서 데이터를 보내고 반대 편에서 이를 수신한 뒤 연결이 끊어지는게 아니라 양 쪽에서 실시간으로 데이터를 송수신할 수 있다.
따라서 실시간 스트리밍이나 채팅에 주로 유용하게 사용된다.
♠ Socket Programming
프로세스 간 통신에 사용되는 Socket을 이용한 통신 프로그래밍을 socket programming이라고 함
Server Socket : 통신 연결 요청을 받아들이는 Socket
Client Socket : 통신 연결 요청을 보내는 Socket
--> 동일한 구조의 Socket이지만, 역할에 따라 처리되는 흐름이 조금씩 다름
♠ 소켓 종류 및 통신 흐름 (Client, Server)
<특징>
① Server 흐름
0) 보안은 데이터 송수신 시 매우 중요
1) 서버 소켓 생성
socket() : 소켓 생성(TCP는 stream)
2) 바인딩(bind)
bind() : 사용할 IP address와 Port number 등록
우리는 컴퓨터를 사용할 때 매우 많은 서비스를 이용한다.
즉, 수많은 프로세스가 동시에 돌아가고 있다.
서버 소켓이 고유한 포트 번호를 만들 수 있도록 소켓과 포트번호를 결합해주는 작업이 필요
--> 서버 소켓이 받은 데이터를 다시 보내주어야할 때 프로세스들의 포트번호가 동일하다면 혼란이 생길 수 있음
위의 그림과 같이 소켓이 사용하는 포트 번호가 다른 소켓의 포트 번호와 중복된다면 어떤 상황이 될까?
하나의 프로세스는 동일한 포트 번호를 가진 여러 개의 소켓을 결합 할 수 있다. 즉, 호스트가 하나의 Port로 여러 개의 Socket을 만들어 다른 호스트들과 데이터를 주고받을 수 있다
3) 클라이언트 연결 요청 대기
listen() : 연결되지 않은 소켓을 요청 수신 대기 모드로 전환(Block 상태)
서버 소켓에서 포트번호와 바인딩 작업을 마치고 나면 클라이언트로부터의 연결 요청을 받아들일 준비가 된 것이다.
클라이언트가 연결 요청을 할 때까지 기다리다가 연결 요청이 오면 대기 상태를 종료하고 리턴한다.
② Client 흐름
4) 클라이언트 소켓 생성
socket() : 소켓 생성 (TCP는 stream)
5) 연결 요청 (Connection)
connect() : Client에서 Server와 연결하기 위해 소켓과 목적지 IP address, Port number 지정(Block 상태)
cf. 서비스 포트란?
③ Server 흐름
6) 클라이언트 연결 수립
accept() : client의 요청 수락 후 실질적인 소켓 연결 -> 통신을 위한 새로운 소켓 생성
--처음 만들어 진(bind() 후 listen()한) 소켓은 그 이후로도 새로운 Client의 요청을 대기하기 위해 쓰임
서버 소켓은 연결 요청을 받아들임과 동시에 새로운 소켓을 생성
서버 소켓의 메인 역할은 클라이언트 연결 요청을 기다리는 것
클라리언트 소켓으로부터 연결 요청을 받으면 새로운 소켓을 열고, 이 소켓과 클라이언트 소켓을 맵핑하여 넘겨줌
④ Server - Client 흐름
7) 데이터의 송수신 (Send, Receive)
연결 요청과 같이, 요청에 대한 결과(신호)가 들어와야 실행이 끝남
송신할 때 : 데이터를 보내는 것이기 때문에, 데이터를 언제 얼마나 보낼 것인지 알 수 있음
수신할 때 : 상대방이 언제, 얼만큼의 데이터를 보낼 것인지 알 수가 없다는 서로의 차이점이 존재
send(), recv(): Client는 처음에 생성한 소켓으로, Server는 새로 반환(생성)된 소켓으로 client와 server간에 데이터 송수신
★ 그렇기 때문에 수신하는 API는 별도의 Thread에서 진행하게 됨
8) 소켓 닫기
close(): 소켓을 닫음
<특징>
UDP는 비연결형 서비스이므로 TCP보다 빠르고 네트워크 부하가 적지만 신뢰성은 낮다. 신뢰성보다는 연속성, 성능이 중요한 실시간 서비스 등에 사용한다.