CSAPP/11장

[CSAPP] 11장 네트워크 프로그래밍(Network Programming) 11.1 ~ 11.3

넌뭐가그렇게중요해 2025. 5. 2. 15:03

1. 클라이언트 - 서버 프로그래밍 모델

클라이언트-서버 모델은 분산 애플리케이션 구조로, 클라이언트(서비스 요청자)와 서버(서비스 제공자)가 네트워크를 통해 메시지를 교환하는 형태입니다.

  • 클라이언트는 서버에 요청(request)을 보내고, 서버는 요청을 처리한 후 응답(response)을 반환합니다.
  • 클라이언트와 서버는 물리적 호스트가 아니라 프로세스 단위로 구분되며, 같은 호스트 내 여러 프로세스가 동시에 동작할 수 있습니다.

클라이언트 - 서버 트랜잭션

전체 흐름도 : 요청 전송서버 처리응답 전송클라이언트 처리

  1. 요청 전송
    클라이언트가 필요한 서비스를 얻기 위해 서버에 요청(request)을 보냅니다. 예를 들어 웹 브라우저가 HTML 파일을 받기 위해 HTTP GET 메시지를 전송합니다.
  2. 서버 처리
    서버는 요청을 수신하여 해석한 뒤, 파일 읽기나 DB 조회 등 해당 리소스를 조작합니다.
  3. 응답 전송
    처리 결과를 클라이언트에 응답(response)으로 보내고, 다음 요청을 기다립니다.
  4. 클라이언트 처리
    클라이언트는 응답을 수신하여 결과를 화면에 표시하거나 후속 작업을 수행합니다.

2. 네트워크(Networks)

클라이언트와 서버는 종종 서로 다른 호스트에서 실행되며, 컴퓨터 네트워크의 하드웨어·소프트웨어 자원을 통해 데이터를 주고받습니다. 이 절에서는 프로그래머 관점에서 ‘호스트에서 네트워크가 어떻게 보이고, 동작하는지’를 살펴보겠습니다.


2.1 호스트 관점에서 본 네트워크는 또 하나의 I/O 장치

운영체제와 프로세스에게 네트워크는 디스크나 키보드처럼 I/O 장치일 뿐입니다.

  • 네트워크 어댑터(NIC): I/O 버스의 확장 슬롯에 꽂혀 물리적 인터페이스를 제공합니다.
    비유하자면 우체국의 소포 분류기처럼, 전기신호(프레임)를 물리 매체로 보내고 받습니다.
  • DMA 전송: 어댑터 ↔ 메인 메모리 간 버스 다이렉트 전송으로, CPU 개입 없이 대량 데이터를 빠르게 주고받습니다.
    비유하자면 공장 자동 이송 로봇이 작업자 대신 화물을 옮기듯, CPU를 해방시켜 다른 연산에 집중하게 해 줍니다.

네트워크 호스트의 하드웨어 구성

 

호스트 관점

CPU → 시스템 버스 → I/O 브리지 → I/O 버스 → 네트워크 어댑터

  1. CPU 내부 레지스터 ↔ 버스 인터페이스
    • 애플리케이션이 send() 같은 시스템 콜을 호출하면, CPU는 해당 데이터를 레지스터나 캐시에서 버스 인터페이스로 넘깁니다.
  2. 시스템 버스(System Bus)
    • 버스 인터페이스를 통해 시스템 버스에 데이터가 올라가면, 메모리나 I/O 브리지로 전송 신호가 전달됩니다.
  3. I/O 브리지(I/O Bridge)
    • 시스템 버스 쪽과 I/O 버스(PCIe 등) 쪽을 잇는 다리 역할을 하며, CPU 쪽 신호를 I/O 버스로 변환·전달합니다.
  4. I/O 버스(I/O Bus)
    • PCIe, USB 같은 확장 버스 상에서 동작하며, 네트워크 어댑터에 데이터를 보냅니다.
  5. 네트워크 어댑터(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)의 힘

여러 네트워크가 하나의 인터넷처럼 작동하려면 계층별 캡슐화가 필수입니다:

  1. 네이밍(Naming scheme): LAN별 MAC·토큰링 주소를 IP 주소 하나로 통일
  2. 전달(Delivery mechanism): LAN별 프레임 헤더(Ethernet 등) 바깥에 IP 패킷을 실어 전송

2.4 데이터 전송 예시 : LAN1 → LAN2

internet에서 데이터가 하나의 호스트에서 다른 호스트로 이동하는 방법

  1. 시스템 콜로 사용자 버퍼 → 커널 버퍼 복사
  2. 호스트 A 프로토콜 소프트웨어
    • IP 헤더(목적지: B) + LAN1 프레임 헤더(목적지: 라우터) 추가 → LAN1 어댑터 전달
  3. LAN1 어댑터 → 물리 매체 전송
  4. 라우터 LAN1 어댑터 → 수신 프레임 커널로 전달
  5. 라우터 프로토콜 소프트웨어
    • IP 헤더 목적지 확인 → 라우팅 테이블 조회 → LAN2 인터페이스 결정
    • 기존 LAN1 헤더 제거 → LAN2 프레임 헤더(목적지: B) 추가 → LAN2 어댑터 전송
  6. 라우터 LAN2 어댑터 → 물리 매체 전송
  7. 호스트 B LAN2 어댑터 → 수신 프레임 커널로 전달
  8. 호스트 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 등으로 구성됩니다.

  1. IP (Internet Protocol)
    • 역할: 호스트 간 비신뢰성(datagram) 전달 메커니즘 제공
    • 특징: 패킷 손실·중복 시 복구 기능 없음
  2. UDP (User Datagram Protocol)
    • 역할: IP 위에서 프로세스 간 비연결형 전송 제공
    • 특징: 순서 보장·재전송·흐름 제어 기능 없음, 실시간·멀티캐스트 애플리케이션에 적합
  3. 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()

 

  1. 클라이언트는 getaddrinfo()→socket()→connect()를 호출해 서버에 연결합니다.
  2. 서버는 getaddrinfo(NULL,…)→socket()→setsockopt(SO_REUSEADDR)→bind()→listen()으로 수신 대기 소켓을 준비합니다.
  3. 클라이언트 연결 요청이 들어오면 accept()가 새 소켓을 반환하고, 그 소켓으로 데이터 입출력을 수행합니다.

 

 

'CSAPP > 11장' 카테고리의 다른 글

[CSAPP] 11장 네트워크 프로그래밍(Network Programming) 11.4  (0) 2025.05.03
소켓  (1) 2025.05.02