컴퓨터 시스템 : CSAPP 11장 정리 - 11.1 ~ 11.2

CSAPP 11장은 네트워크 프로그래밍(Network Programming)을 다루며, 도입부에서는 우리가 웹 브라우징, 이메일 전송, 온라인 게임 등을 할 때마다 네트워크 응용 프로그램을 사용하고 있음을 강조한다. 흥미로운 점은 이러한 다양한 네트워크 응용 프로그램들이 모두 동일한 기본 프로그래밍 모델을 기반으로 한다는 것이다. 즉, 구조적으로 유사하며, 같은 프로그래밍 인터페이스(주로 소켓)를 사용한다는 점이다.

이러한 네트워크 응용 프로그램들은 이미 시스템 프로그래밍에서 배운 개념들—프로세스, 시그널, 바이트 순서, 메모리 매핑, 동적 메모리 할당 등—에 의존한다. 동시에, 클라이언트-서버 모델이라는 새로운 개념도 습득해야 한다. 마지막에는 이 모든 아이디어를 종합하여 실제 웹 브라우저가 접속 가능한 간단한 웹 서버를 개발하는 것으로 마무리한다.


11.1 클라이언트-서버 프로그래밍 모델 (The Client-Server Programming Model)

모든 네트워크 응용 프로그램은 클라이언트-서버 모델에 기반한다. 이 모델에서 하나의 애플리케이션은 서버 프로세스와 하나 이상의 클라이언트 프로세스로 구성된다. 서버는 특정 자원을 관리하며, 이 자원을 조작함으로써 클라이언트에게 서비스를 제공한다. 예를 들어, 웹 서버는 디스크 파일을 관리하고, 이를 클라이언트 요청에 따라 읽거나 실행한다. FTP 서버나 이메일 서버도 각각 디스크 파일이나 메일 스풀을 관리한다.

기본적인 연산 단위는 트랜잭션(transaction)이다. 클라이언트-서버 트랜잭션은 다음 네 단계로 이루어진다:

  1. 클라이언트가 서비스가 필요할 때 서버에게 요청(request)을 보낸다.
  2. 서버는 요청을 수신하고 해석한 후 자원을 적절하게 조작한다.
  3. 서버는 결과를 응답(response)으로 클라이언트에게 전송한다.
  4. 클라이언트는 이 응답을 받아 처리한다.

이러한 트랜잭션은 데이터베이스의 트랜잭션과 달리 원자성(atomicity) 등의 특성을 가지지 않는다. 단순히 클라이언트와 서버 간에 요청과 응답이 오가는 과정을 의미한다.


11.2 네트워크 (Networks)

클라이언트와 서버는 일반적으로 서로 다른 호스트에서 실행되며, 이들은 컴퓨터 네트워크의 하드웨어와 소프트웨어 자원을 통해 통신한다.

네트워크에 대한 기본 개념

  • 네트워크는 입출력 장치(I/O device) 중 하나로, 데이터를 주고받는 원천(Source)과 저장소(Sink)로 동작한다.
  • 예를 들어, 데이터를 디스크로 보내는 대신 네트워크 어댑터로 전송하여 다른 호스트에 전달한다.

네트워크의 물리적 구조

  • 이더넷(Ethernet): 가장 널리 사용되는 LAN(Local Area Network) 기술로, 수십 년 동안 3Mb/s에서 10Gb/s까지 발전했다.
  • 이더넷 세그먼트는 일반적으로 허브(hub)를 중심으로 여러 호스트가 연결된 형태다.
    • 모든 비트가 허브를 통해 모든 포트로 복사되므로 모든 호스트가 모든 데이터를 수신하지만, 목적지 주소에 해당하는 호스트만 이를 처리한다.

그림 11.3: 이더넷 세그먼트

브리지와 라우터

  • 브리지(Bridge): 여러 이더넷 세그먼트를 연결하여 브리지드 이더넷을 구성한다.
    • 스마트하게 네트워크 트래픽을 학습하고 필요할 때만 프레임을 복사함으로써 대역폭을 절약한다.

그림 11.4: 브리지로 연결된 이더넷 세그먼트

여러 이더넷 세그먼트를 브리지(bridge)를 통해 연결하여 더 큰 LAN을 형성한 구조이다. 각 브리지는 학습 알고리즘을 통해 어떤 호스트가 어떤 포트로 도달 가능한지 알아내며, 프레임이 필요할 때에만 다른 세그먼트로 전달함으로써 대역폭을 절약한다. 예를 들어, A에서 B로 가는 프레임은 같은 세그먼트 내에 있기 때문에 브리지 X는 프레임을 폐기하지만, C로 가는 경우에는 브리지 X가 브리지 Y로 프레임을 전달한다.

  • 라우터(Router): 서로 다른 LAN이나 WAN을 연결하여 인터넷(internet)을 구성한다.
    • 라우터는 각 네트워크에 대한 포트를 가지고 있으며, 패킷이 목적지까지 도달할 수 있도록 전달 경로를 선택한다.

그림 11.6: 작은 인터넷 구성

이 그림은 서로 다른 두 개의 LAN과 두 개의 WAN이 세 개의 라우터를 통해 연결된 구조를 보여준다. 라우터는 서로 다른 기술을 가진 네트워크 간의 중계 역할을 하며, 인터넷을 형성한다. 이 구조는 다양한 기술이 혼합된 환경에서도 통합된 통신이 가능하도록 한다.

프로토콜과 캡슐화 (Encapsulation)

서로 호환되지 않는 네트워크 간에도 통신이 가능하도록 하기 위해, 각 호스트와 라우터에는 프로토콜 소프트웨어가 설치되어 있다.

  • 이 소프트웨어는 두 가지 핵심 기능을 제공한다:
    1. 이름 지정 스킴(Naming Scheme): 다양한 LAN 기술의 주소체계를 통일.
    2. 전달 메커니즘(Delivery Mechanism): 데이터를 패킷(packet) 단위로 캡슐화하여 일관된 방식으로 전송.

그림 11.7: 데이터가 한 호스트에서 다른 호스트로 이동하는 과정

이 그림에서는 LAN1에 연결된 호스트 A에서 LAN2에 연결된 호스트 B로 데이터를 보내는 과정을 설명한다. 핵심은 인터넷 패킷을 다른 네트워크의 프레임에 실어 전송하는 것이다. 각 단계는 다음과 같다:

  1. 클라이언트 시스템 호출: 호스트 A의 클라이언트가 시스템 호출을 통해 데이터를 커널 버퍼에 복사한다.
  2. 프레임 생성: A의 프로토콜 소프트웨어가 사용자 데이터를 감싼 인터넷 헤더와 LAN1 프레임 헤더를 생성하고, 이를 어댑터에 전달한다.
  3. 프레임 전송: LAN1 어댑터가 프레임을 네트워크에 전송한다.
  4. 라우터 수신: 라우터의 LAN1 어댑터가 프레임을 받아 프로토콜 소프트웨어로 전달한다.
  5. 헤더 재작성: 라우터는 목적지 주소를 확인하고, 새로운 LAN2 프레임 헤더를 붙여 B에게 전송할 준비를 한다.
  6. 라우터 전송: 라우터의 LAN2 어댑터가 새로운 프레임을 네트워크에 보낸다.
  7. 수신 호스트 처리: 호스트 B가 프레임을 수신하고 프로토콜 소프트웨어가 이를 처리한다.
  8. 서버 데이터 수신: 서버는 시스템 호출을 통해 사용자 데이터를 자신의 주소 공간으로 읽어 들인다.

이 절의 핵심 메시지는 다음과 같다: 인터넷에서의 데이터 전달은 "프레임 속의 패킷 속의 데이터"라는 계층적 캡슐화를 통해 이루어진다. 이는 네트워크의 이질성을 숨기고, 표준화된 방식으로 데이터를 전달할 수 있게 해 준다.