논리적인 의미로 컴퓨터 네트워크를 경유하는 프로세스 간 통신(Inter-Process Communication, IPC)의 종착점(End-point)
통신을 통해 전달되는 모든 데이터 포맷은 5-Tuple이라는 규격에 맞추어 흐르게 된다.
소켓 또한 위 정보들인 프로토콜, IP 주소, port 번호가 있어야 정의된다.
먼저 보통 소켓은 인터넷 소켓이며 전송 계층 위에서 동작하므로 프로토콜은 TCP/UDP가 된다. 프로토콜이 정의되면 네트워크 상에서 데이터를 송수신할 수 있는 방법, 규칙이 정의된 것.
1개의 프로세스는 1개 이상의 소켓을 사용할 수 있다. 따라서 호스트 내의 프로세스 1개로 여러 개의 소켓을 열어 다수의 호스트들과 통신도 각능하다. 소켓들은 소켓 번호로 식별한다.
Server-Client 구조
TCP/UDP 위에서 동작하므로 당연하게 Server-Client 통신 구조를 갖춘다.
처음에 데이터를 보내는 쪽이 클라이언트가 되고 받는 쪽이 서버가 된다. 이후에는 서로가 데이터를 송수신할 수 있다.
양방향 통신
Socket은 한 쪽에서 데이터를 보내고 반대 편에서 이를 수신한 뒤 연결이 끊어지는게 아니라 양 쪽에서 실시간으로 데이터를 송수신할 수 있다. 따라서 실시간 스트리밍이나 채팅에 주로 유용하게 사용된다.
프로그래밍 언어나 운영체제에 종속적
Socket은 TCP/IP 표준이 아니라 네트워크 프로그래밍 인터페이스다. 따라서 운영체제마다 약간씩 다르며, 그 안에서 또 프로그래밍 언어마다 소켓 API를 구현한 라이브러리가 다 다르다.
Server
1. socket()
: 소켓 생성(TCP는 Stream)
2. bind()
: 주소 바인딩, 사용할 IP addreess 등록
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()
: 연결 종료, 소켓을 닫음connect()
과정이 필요 없기 때문에 소켓을 생성한 후 바로 데이터 전송, 일대다 통신에 많이 쓰임.