소켓 프로그래밍(Socket Programming)은 주로 클라이언트-서버 모델을 기반으로 통신을 처리합니다. 클라이언트와 서버는 서로 다른 역할을 수행하며, 레이어 4(전송 계층, TCP/UDP) 이상부터 이러한 클라이언트-서버 개념이 나타납니다. 서버와 서버 간의 통신이라는 개념은 존재하지 않으며, 서버-클라이언트 또는 클라이언트-서버 간의 통신이 이뤄집니다.
이유: 레이어 4에서의 클라이언트-서버 모델
OSI 모델의 레이어 4(전송 계층)부터는 클라이언트-서버 모델이라는 개념이 등장합니다. 이는 통신의 양쪽이 다르게 정의된다는 의미입니다.
서버: 클라이언트의 요청을 수신하고, 그 요청에 대한 응답을 처리하는 쪽을 서버라고 합니다. 서버는 주로 정적인 IP 주소와 포트를 가지고, 클라이언트로부터 오는 연결 요청을 항상 대기합니다.
클라이언트: 서버로 요청을 보내고, 서버로부터 응답을 받는 쪽이 클라이언트입니다. 클라이언트는 동적으로 IP 주소나 포트를 할당받는 경우가 많고, 필요한 순간에 서버에 연결을 시도합니다.
서버 간 통신은 존재하지 않는 이유:
서버와 서버 간의 통신은 소켓 프로그래밍의 개념에서는 존재하지 않습니다. 이유는 서버는 항상 클라이언트로부터의 요청을 기다리며, 스스로 다른 서버에 요청을 보내지 않기 때문입니다.
- 클라이언트는 요청을 보냄: 통신을 시작하는 주체는 항상 클라이언트입니다.
- 서버는 요청을 받음: 서버는 클라이언트로부터의 요청을 대기하고 처리하는 역할을 합니다.
소켓 프로그래밍에서 클라이언트-서버 모델:
- 서버는 특정 포트 번호를 열어 두고, 클라이언트로부터의 연결을 기다립니다. 서버는 소켓을 생성하고
bind()
를 통해 특정 포트를 할당받습니다. - 클라이언트는 서버의 IP 주소와 포트 번호를 알고 있으며, 서버에 소켓 연결 요청을 보냅니다. 클라이언트는 서버의 IP와 포트로 소켓을 연결하여 데이터를 전송합니다.
- 서버는 클라이언트로부터 요청을 받으면, 연결을 수락(
accept()
)하고, 클라이언트와 데이터를 주고받습니다.
소켓 통신의 흐름 (클라이언트-서버 모델 예시):
서버 측:
- 소켓 생성 → 포트 바인딩 → 연결 대기(리슨) → 클라이언트 연결 요청 수락(accept) → 데이터 처리
클라이언트 측:
- 소켓 생성 → 서버에 연결 요청(connect) → 데이터 송수신
클라이언트-서버 모델 예시 (TCP 기반):
// 서버 코드 예시 (Java TCP 소켓)
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(12345); // 12345 포트에서 연결 대기
System.out.println("서버 대기 중...");
Socket clientSocket = serverSocket.accept(); // 클라이언트 연결 수락
System.out.println("클라이언트 연결됨!");
// 데이터 송수신
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("받은 메시지: " + inputLine);
out.println("서버 응답: " + inputLine);
}
in.close();
out.close();
clientSocket.close();
serverSocket.close();
}
}
// 클라이언트 코드 예시 (Java TCP 소켓)
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 12345); // 서버에 연결 요청
// 데이터 송수신
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println("안녕하세요 서버!"); // 서버로 메시지 전송
System.out.println("서버로부터 응답: " + in.readLine()); // 서버 응답 출력
out.close();
in.close();
socket.close();
}
}
통신 과정:
- 서버는
ServerSocket
을 사용해 12345 포트에서 연결 요청을 대기합니다. - 클라이언트는
Socket
을 생성해localhost
와 포트 12345로 연결 요청을 보냅니다. - 서버는 연결을 수락하고, 클라이언트와 데이터를 주고받습니다.
요약:
- 클라이언트-서버 모델은 레이어 4에서 시작되며, 서버는 클라이언트의 요청을 대기하고 응답을 처리합니다.
- 소켓 프로그래밍에서는 서버와 서버 간의 통신이라는 개념은 없으며, 항상 클라이언트-서버 모델로 이루어집니다.
- 클라이언트는 서버에 요청을 보내고, 서버는 그 요청을 수락해 데이터를 처리하는 방식으로 통신이 이루어집니다.
'Network' 카테고리의 다른 글
LAN과 인터넷 간의 통신 흐름 (0) | 2024.09.26 |
---|---|
소켓(Socket) (0) | 2024.09.26 |
HTTP(하이퍼텍스트 전송 프로토콜)의 각 버전 (2) | 2024.09.26 |
유저(User)와 클라이언트(Client)의 차이점 (1) | 2024.09.26 |
아파치 서버와 아파치 톰캣 서버의 차이점 (1) | 2024.09.26 |