최근 간단한 토이 프로젝트로 메신저 프로그램을 만들었던 경험이 있었는데 이 때 사용됐던 핵심 개념인 소켓에 대한 포스팅을 남기고자 한다.
❓소켓(Socket)
클라이언트와 서버 각각의 프로세스가 통신으로 데이터를 주고받기 위해 소켓이 필요하다. 소켓은 파일과 비슷한 역할을 수행한다. 클라이언트 프로세스에서 소켓을 열어 소켓에 데이터를 써서 서버에 전송한다. 서버 프로세스에서 클라이언트 측의 소켓으로부터 받은 데이터를 읽어 사용한다.
프로세스마다 고유한 포트(Port)를 가지고 있으며, 하나의 프로세스가 여러 개의 소켓을 가질 수 있다. 그래서 우리가 PC를 켜면 게임을 틀어놓으면서 음악도 들을 수 있고 문서 작업 등 여러 프로그램을 실행할 수 있는 것이다.
❓소켓의 종류
-
소켓
- 네트워크에 대한 사용자 수준의 인터페이스를 제공
- 소켓은 양방향 통신 방법으로 클라이언트-서버 모델을 기반으로 프로세스 사이의 통신에 매우 적합하다.
-
유닉스 소켓
-
인터넷 소켓
- 인터넷에 연결된 서로 다른 호스트에 있는 프로세스 사이의 통신 방법
❓소켓 연결
- 서버가 소켓을 만든다.
- 클라이언트가 소켓을 만든 후 서버에 연결 요청을 한다.
- 서버가 클라이언트의 연결 요청을 수락하여 소켓 연결이 이루어진다.
❓소켓 연결 과정
- socket() 호출을 이용하여 소켓을 만들고 이름을 붙인다.
- listen() 호출을 이용하여 대기 큐를 만든다.
- 클라이언트로부터 연결 요청을 accept() 호출을 이용하여 수락
- 소켓 연결이 이루어지면
- 자식 프로세스를 생성하여 클라이언트로부터의 요청을 처리, 클라이언트에게 응답한다.
- socket() 호출을 이용하여 소켓을 만든다.
- connection() 호출을 이용하여 서버에 연결 요청을 한다.
- 서버가 연결 요청을 수락하면 소켓 연결이 만들어진다.
- 서버에 서비스를 요청하고 서버로부터 응답을 받아 처리한다.
❓TCP 소켓
1. 연결 : 소켓 객체를 생성하고 3-way-handshaking를 통해 TCP 연결을 맺는다.
_**2. 데이터 송수신 : 연결된 소켓을 통해 데이터를 전송할 때는 send(), 데이터를 수신할 때는 recv()를 통해 데이터를 주고받는다.
3. 연결 해제 : 처음 연결을 맺을 때와는 달리 4-way-handshaking을 통해 TCP 연결을 끊는다.
❓UDP 소켓
- 데이터를 데이터그램 단위로 전송한다.
참고
윤성우의 열혈 TCP/IP 소켓 프로그래밍
개발자를 위한 레시피 - 소켓 프로그래밍이란?