소켓 프로그래밍을 위한 클라이언트-서버 모델 개념 잡기
이번 포스트에서는 CS:APP 11장의 첫걸음인 클라이언트-서버 모델에 대해 정리합니다. 소켓을 왜 써야 하는지, 서버는 어떤 방식으로 동작하는지, 전체 흐름을 한눈에 이해할 수 있도록 정리해 보았는데요. 본격적으로 소스 코드를 읽기 전에 이 구조를 머릿속에 그릴 수 있다면, line-by-line 분석이 훨씬 수월해질 것입니다.
클라이언트-서버 모델이란?
- 서버(Server)
- 서비스를 제공하는 프로그램
- 클라이언트 요청을 수신하고 응답을 반환한다
- 클라이언트(Client)
- 서비스를 요청하는 프로그램
- 사용자를 통해 능동적으로 실행된다
이 둘은 네트워크로 연결되며, 클라이언트가 요청을 보내면 이를 기다리고 있던 서버가 응답을 보내주는 비대칭적 관계입니다.
서버 구현 방식: 반복적 vs 동시적
- 반복적 서버(Iterative Server)
- 하나의 클라이언트 요청을 처리하고 나서야 다음 요청을 처리하는 순차적인 방식
- 구현은 간단하지만 병목이 발생할 수 있다
- 동시적 서버(Concurrent Server)
- 여러 클라이언트의 요청들을 병렬로 처리하는 방식
- 프로세스/스레드/이벤트 기반 등 다양하게 구현되며, 실제 서비스에서 필수적이다
서버와 클라이언트의 연결 절차
서버와 클라이언트의 연결 절차는 무전기를 통해 서로 소통을 하는 경우와도 같습니다.
클라이언트 측
socket()
: 소켓 생성- 무전기를 꺼내 전원을 켜는 작업 (통신 준비)
connect()
: 서버로 연결 요청- 특정 채널(서버의 IP와 포트 번호)에 연결 요청을 보내는 작업
서버 측
socket()
: 소켓 생성- 무전기를 꺼내 전원을 켜는 작업 (통신 준비)
bind()
: IP와 포트 지정- 무전기의 채널(IP와 포트 번호)을 맞추는 작업
listen()
: 연결 요청 대기- 해당 채널에서 누가 말을 걸어오는지 귀를 기울이기
accept()
: 클라이언트 연결 수락 (blocking)- 클라이언트가 연결 요청을 보내면, 이를 수락하고 연결 맺기
이후 read()
/ write()
또는 recv()
/ send()
를 통해 통신하며, close()
로 종료합니다.
왜 이 구조를 알아야 할까?
- 상태 관리
- HTTP처럼 매번 연결이 새롭게 생성되는 stateless 통신일지라도, 세션/쿠키 등으로 상태를 관리할 수 있다
- 동시성 처리
- 여러 클라이언트를 처리해야 하는 서버라면 반복적 방식으론 버티지 못한다
- 이후 배우게 될 fork, 스레드, I/O multiplexing이 중요한 이유
마치면서
이번 포스트에서는 소켓 프로그래밍에 들어가기 전에 꼭 이해하고 넘어가야 할 클라이언트-서버 모델의 구조와 연결 흐름을 정리해 보았습니다. 이 개념을 잡고 나면, 이후 책에서 등장하는 socket()
, connect()
, accept()
같은 함수들이 왜 그런 순서로 호출되는지를 자연스럽게 이해할 수 있게 됩니다.
다음 편에서는 네트워크 계층 구조와 TCP/UDP의 차이, 그리고 우리가 다루게 될 계층이 어디까지인지 정리해보겠습니다. 감사합니다!
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 11장 완전 정복] 11.3 IP, 포트, DNS, 바이트 순서까지, 실전 소켓 프로그래밍 개념 정리 (0) | 2025.05.01 |
---|---|
[CSAPP 11장 완전 정복] 11.2 소켓 프로그래밍을 위한 네트워크 구조 제대로 잡기 (0) | 2025.05.01 |
[CSAPP 6장 완전 정복] 6.6~6.7 캐시가 프로그램 성능에 미치는 영향 및 6장 전체 요약 (0) | 2025.04.30 |
[CSAPP 6장 완전 정복] 6.5 캐시 친화적인 코드 최적화 전략 알아보기 (0) | 2025.04.30 |
[CSAPP 6장 완전 정복] 6.4 캐시 메모리 핵심 정리 (0) | 2025.04.29 |