1. 클라이언트 - 서버 프로그래밍 모델
클라이언트-서버 모델은 분산 애플리케이션 구조로, 클라이언트(서비스 요청자)와 서버(서비스 제공자)가 네트워크를 통해 메시지를 교환하는 형태입니다.
- 클라이언트는 서버에 요청(request)을 보내고, 서버는 요청을 처리한 후 응답(response)을 반환합니다.
- 클라이언트와 서버는 물리적 호스트가 아니라 프로세스 단위로 구분되며, 같은 호스트 내 여러 프로세스가 동시에 동작할 수 있습니다.
전체 흐름도 : 요청 전송 → 서버 처리 → 응답 전송 → 클라이언트 처리
- 요청 전송
클라이언트가 필요한 서비스를 얻기 위해 서버에 요청(request)을 보냅니다. 예를 들어 웹 브라우저가 HTML 파일을 받기 위해 HTTP GET 메시지를 전송합니다. - 서버 처리
서버는 요청을 수신하여 해석한 뒤, 파일 읽기나 DB 조회 등 해당 리소스를 조작합니다. - 응답 전송
처리 결과를 클라이언트에 응답(response)으로 보내고, 다음 요청을 기다립니다. - 클라이언트 처리
클라이언트는 응답을 수신하여 결과를 화면에 표시하거나 후속 작업을 수행합니다.
2. 네트워크(Networks)
클라이언트와 서버는 종종 서로 다른 호스트에서 실행되며, 컴퓨터 네트워크의 하드웨어·소프트웨어 자원을 통해 데이터를 주고받습니다. 이 절에서는 프로그래머 관점에서 ‘호스트에서 네트워크가 어떻게 보이고, 동작하는지’를 살펴보겠습니다.
2.1 호스트 관점에서 본 네트워크는 또 하나의 I/O 장치
운영체제와 프로세스에게 네트워크는 디스크나 키보드처럼 I/O 장치일 뿐입니다.
- 네트워크 어댑터(NIC): I/O 버스의 확장 슬롯에 꽂혀 물리적 인터페이스를 제공합니다.
비유하자면 우체국의 소포 분류기처럼, 전기신호(프레임)를 물리 매체로 보내고 받습니다. - DMA 전송: 어댑터 ↔ 메인 메모리 간 버스 다이렉트 전송으로, CPU 개입 없이 대량 데이터를 빠르게 주고받습니다.
비유하자면 공장 자동 이송 로봇이 작업자 대신 화물을 옮기듯, CPU를 해방시켜 다른 연산에 집중하게 해 줍니다.
호스트 관점
CPU → 시스템 버스 → I/O 브리지 → I/O 버스 → 네트워크 어댑터
- CPU 내부 레지스터 ↔ 버스 인터페이스
- 애플리케이션이 send() 같은 시스템 콜을 호출하면, CPU는 해당 데이터를 레지스터나 캐시에서 버스 인터페이스로 넘깁니다.
- 시스템 버스(System Bus)
- 버스 인터페이스를 통해 시스템 버스에 데이터가 올라가면, 메모리나 I/O 브리지로 전송 신호가 전달됩니다.
- I/O 브리지(I/O Bridge)
- 시스템 버스 쪽과 I/O 버스(PCIe 등) 쪽을 잇는 다리 역할을 하며, CPU 쪽 신호를 I/O 버스로 변환·전달합니다.
- I/O 버스(I/O Bus)
- PCIe, USB 같은 확장 버스 상에서 동작하며, 네트워크 어댑터에 데이터를 보냅니다.
- 네트워크 어댑터(NIC)
- 최종적으로 네트워크 프레임으로 포장된 데이터가 물리 매체(이더넷 케이블, 무선 신호 등)로 송출됩니다.
반대로, 수신된 프레임도 같은 경로를 거꾸로 타고 들어와 I/O 버스 → I/O 브리지 → 시스템 버스 → CPU로 전달된 뒤, 커널과 애플리케이션으로 복사됩니다.
2.2 LAN : Ethernet 세그먼트 확장
2.2.1 단일 이더넷 세그먼트
- 구성: 트위스티드 페어 케이블 + 허브(hub)
- 특징:
- 최대 대역폭(100 Mb/s, 1 Gb/s 등)을 공유
- 허브는 수신한 모든 비트를 모든 포트로 복사 → 브로드캐스트 도메인
비유하자면 허브는 들어온 비트를 모든 포트로 무차별 복사하는 "광장" 같은 장치입니다. - 각 NIC는 고유 48비트 MAC 주소를 가집니다
2.2.2 브리지드 이더넷
- 브리지(bridge): 각 세그먼트 간 트래픽을 선별 전달
- 동일 세그먼트 향 프레임은 폐기 → 불필요 대역폭 절약
- 타 세그먼트 목적 프레임만 전달
- 확장 구조: 허브와 브리지를 함께 연결해 캠퍼스·빌딩 단위 LAN 구성 가능
2.3 인터넷(internet): 라우터로 LAN과 WAN 연결
2.3.1 라우터와 WAN
- 라우터(router): 서로 다른 LAN/WAN을 연결
- 각 네트워크별 포트(인터페이스) ○ 개 보유
- IP 패킷 목적지 주소 기반 포워딩
- WAN(Wide Area Network): 도시·국가 간 장거리 연결
- 전용 회선, MPLS, 광섬유 등 다양한 물리 매체
2.3.2 캡슐화(encapsulation)의 힘
여러 네트워크가 하나의 인터넷처럼 작동하려면 계층별 캡슐화가 필수입니다:
- 네이밍(Naming scheme): LAN별 MAC·토큰링 주소를 IP 주소 하나로 통일
- 전달(Delivery mechanism): LAN별 프레임 헤더(Ethernet 등) 바깥에 IP 패킷을 실어 전송
2.4 데이터 전송 예시 : LAN1 → LAN2
- 시스템 콜로 사용자 버퍼 → 커널 버퍼 복사
- 호스트 A 프로토콜 소프트웨어
- IP 헤더(목적지: B) + LAN1 프레임 헤더(목적지: 라우터) 추가 → LAN1 어댑터 전달
- LAN1 어댑터 → 물리 매체 전송
- 라우터 LAN1 어댑터 → 수신 프레임 커널로 전달
- 라우터 프로토콜 소프트웨어
- IP 헤더 목적지 확인 → 라우팅 테이블 조회 → LAN2 인터페이스 결정
- 기존 LAN1 헤더 제거 → LAN2 프레임 헤더(목적지: B) 추가 → LAN2 어댑터 전송
- 라우터 LAN2 어댑터 → 물리 매체 전송
- 호스트 B LAN2 어댑터 → 수신 프레임 커널로 전달
- 호스트 B 프로토콜 소프트웨어
- LAN2 헤더 제거 → IP 헤더 분석 → 페이로드만 분리
- 사용자 프로세스가 read 호출 시 커널 버퍼 → 사용자 버퍼 복사
이처럼 IP 패킷은 LAN 프레임 안에서 운송되고, 라우터가 물리 네트워크 경계를 넘을 때마다 적절한 프레임 헤더로 재캡슐화됩니다.
3. 글로벌 IP 인터넷
전 세계 수십억 호스트를 연결하는 글로벌 IP 인터넷은 1969년 ARPANET 출범 이래 TCP/IP 프로토콜 스위트를 기반으로 발전해 왔습니다. 내부 구조는 끊임없이 진화하지만, 클라이언트–서버 애플리케이션 모델은 1980년대 초반부터 거의 변함없이 유지되어 왔습니다.
Internet 클라이언트–서버 애플리케이션의 하드웨어·소프트웨어 계층을 한눈에 보여줍니다.
- User code: 애플리케이션은 BSD 소켓 API(socket(), bind(), connect() 등)와 Unix I/O(read(), write()) 호출을 혼합하여 네트워크 통신을 구현합니다.
- Kernel code: 커널 모드에서 실행되는 TCP/IP 스택은 패킷 캡슐화/디캡슐화, 주소 해석, 전송 계층 제어(흐름·혼잡 제어) 등을 수행합니다.
- Hardware: NIC(Network Interface Card)는 물리 계층과 데이터 링크 계층을 담당하며, 인터럽트를 통해 CPU와 데이터를 교환합니다.
전화기 비유:
소켓 = 전화기, 커널 = 전화 교환국, 네트워크 어댑터 = 전화 선
socket()은 전화기를 꺼내는 단계,
connect()는 상대방 번호(IP:포트)를 누르는 단계,
read/write는 음성(데이터)을 주고받는 단계,
close()는 통화 종료 후 수화기를 내려놓는 단계입니다.
3.1 IP Address
32비트 IPv4 주소
- IP 주소는 32비트 부호 없는 정수로 표현되며, C 언어의 struct in_addr에 저장됩니다:
struct in_addr {
uint32_t s_addr; /* 네트워크(big-endian) 바이트 순서 */
};
비유: IP 주소는 소포의 “우편번호”처럼, data packet이 어느 나라(호스트)로 가야 할지 알려 줍니다.
네트워크 바이트 순서 변환
- 서로 다른 호스트 엔디언(리틀 vs 빅)에 대응하기 위해 네트워크 바이트 순서(big-endian)를 사용합니다.
- 함수:
- htonl/ntohl (32비트)
- htons/ntohs (16비트)
비유: 택배 상자를 여는 순서(바이트 순서)가 다를 때, 모두 같은 방식으로 열도록 “개봉 매뉴얼”을 정해 통일합니다.
점십진 표기법 & 변환
네 바이트를 0–255 십진수 네 개로 “.”으로 구분해 사람이 읽기 쉽게 표시합니다:
$ hostname -i
128.2.210.175
- 변환 함수(arpa/inet.h):
- inet_pton(AF_INET, src, &dst)
- inet_ntop(AF_INET, &src, dst, size)
비유: ‘도로명 주소’를 숫자 우편번호로 바꾼 뒤, 다시 사람이 읽는 주소로 바꾸는 것과 비슷합니다.
3.2 Internet Domain Names
계층적 도메인 이름
‘www.example.com’처럼 단어를 점으로 구분해 네임스페이스를 트리 구조로 나눕니다:
- 루트(‘.’) → 최상위(.com, .edu…) → 2단계(example.com) → 3단계(www.example.com)
DNS(Domain Name System)
- 분산 전화번호부 역할로, 도메인 이름 ↔ IP 주소 매핑을 전 세계에 걸쳐 관리합니다.
- 주요 레코드:
- A: IPv4 주소
- AAAA: IPv6 주소
- CNAME: 별칭
- MX: 메일 서버 등
$ nslookup twitter.com
Address: 199.16.156.102
Address: 199.16.156.230
비유: DNS는 ‘인터넷의 전화번호부’로, 기억하기 쉬운 이름을 실제 전화번호(IP)로 찾아 연결해줍니다.
3.3 Internet Connections
소켓(Socket)과 포트(Port)
- 소켓: 프로세스가 네트워크에 손을 내미는 끝점(endpoint)입니다.
- 포트: 16비트 숫자로 서비스 구분
- 웰-노운 포트(0–1023): 서버가 고정 사용 (예: HTTP=80, SMTP=25)
- 에페메랄 포트(1024–65535): 클라이언트가 자동 할당
비유: IP는 ‘집 주소’, 포트는 ‘방 번호’, 소켓은 그 방 현관문입니다.
연결 식별: 소켓 페어
- 프로세스 간 연결은 두 소켓 주소 (cliIP:cliPort, servIP:servPort)의 쌍으로 고유 식별됩니다.
e.g.
(128.2.194.242:51213, 208.216.181.15:80)
- TCP 연결은 전이중(full-duplex)·신뢰성 있는 스트림 통신을 제공합니다.
비유: 소켓 페어는 ‘전화 통화’에서 양쪽 전화기의 번호(주소:포트)를 기록해두는 것과 같습니다.
추가 내용
프로토콜 스위트
인터넷 프로토콜 스위트(일명 TCP/IP)는 IP, UDP, TCP 등으로 구성됩니다.
- IP (Internet Protocol)
- 역할: 호스트 간 비신뢰성(datagram) 전달 메커니즘 제공
- 특징: 패킷 손실·중복 시 복구 기능 없음
- UDP (User Datagram Protocol)
- 역할: IP 위에서 프로세스 간 비연결형 전송 제공
- 특징: 순서 보장·재전송·흐름 제어 기능 없음, 실시간·멀티캐스트 애플리케이션에 적합
- TCP (Transmission Control Protocol)
- 역할: IP 위에서 연결형, 신뢰성·흐름 제어·혼잡 제어 제공
- 특징: 바이트 스트림 전송, 순서·무결성 보장
주소 체계 및 네임 서비스
- IPv4: 32비트 주소 체계로 설계되었으며, 오늘날 인터넷 트래픽의 대다수를 차지합니다.
- IPv6: 128비트 주소 체계로 확장된 버전이나, 전 세계 트래픽 중 5% 남짓이 사용 중이며(2024년 기준) 아직 보편적 채택 전입니다.
- DNS (Domain Name System): 사람이 읽기 쉬운 도메인 이름을 IP 주소로 매핑해 주는 분산 데이터베이스 서비스입니다.
클라이언트 - 서버 모델
단계 | 클라이언트 | 서버 |
소켓 준비 | socket() | socket() + bind() + listen() |
연결/수락 | connect() | accept() |
데이터 송수신 | write() → read() | read() → write() |
종료 | close() | close() |
- 클라이언트는 getaddrinfo()→socket()→connect()를 호출해 서버에 연결합니다.
- 서버는 getaddrinfo(NULL,…)→socket()→setsockopt(SO_REUSEADDR)→bind()→listen()으로 수신 대기 소켓을 준비합니다.
- 클라이언트 연결 요청이 들어오면 accept()가 새 소켓을 반환하고, 그 소켓으로 데이터 입출력을 수행합니다.
'CSAPP > 11장' 카테고리의 다른 글
[CSAPP] 11장 네트워크 프로그래밍(Network Programming) 11.4 (0) | 2025.05.03 |
---|---|
소켓 (1) | 2025.05.02 |