> For the complete documentation index, see [llms.txt](https://jeuxdeau.gitbook.io/http-the-definitive-guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jeuxdeau.gitbook.io/http-the-definitive-guide/v./20.redirection-and-load-balancing.md).

# 20. 리다이렉션과 부하 균형

## 20.1 왜 리다이렉트인가?

* HTTP 애플리테이션의 요구사항
  * 신뢰할 수 있는 HTTP 트랜잭션 수행
  * 지연 최소화
  * 네트워크 대역폭 절약

### 요구사항을 충족하기 위한 방안

* 여러개의 end point
  * fault tolerance
  * 지연이 더 낮은 end point 로 접근
  * 요청이 분산되어 네트워크 혼잡을 줄임
* 리다이렉션과 부하 균형은 동반되는 개념이다

## 20.2 리다이렉트 할 곳

* 서버, 프락시, 캐시, 게이트웨이는 클라이언트 입장에선 모두 서버이다
  * 모두 리다이렉션을 지원
* 특정 종류의 end point만을 위해 설계된 리다이렉션도 존재함
* 웹 서버
  * IP 별로 요청을 다룸
  * 동일한 URL 요청에 대한 리다이렉션 처리
* 프락시
  * 프로토콜별로 요청을 다룸

### 20.3 리다이렉션 프로토콜의 개요

* HTTP를 가장 빠른 가용한 웹 서버로 보내는 것이 리다이렉션의 목표이다
  * HTTP 애플리케이션과 라우팅 장치에 영향을 받음
    * 브라우저가 메세지를 프락시 서버로 보내도록 설정이 가능
    * DNS resolver 는 클라이언트의 위치에 따라 다른 IP 주소를 내려줄 수 있음
    * 스위치 또는 라우터 장비에서 TCP/IP 주소를 기반으로 라우팅할 수 있음
    * 웹 서버는 HTTP 리다이렉트를 사용해 요청을 다른 웹 서버로 가도록 할 수 있다
* 일반 리다이렉션 방법

![](/files/-M3641YcIQDELa_EhWUe)

* 프락시와 캐시 리다이렉션 기법

![](/files/-M3641Yebe0STcnZ7Gzy)

## 20.4 일반 리다이렉션 기법

### 20.4.1HTTP 리다이렉션

* 리다이렉팅 서버가 콘텐츠 서버의 부하나 거리를 고려하여 최선의 서버로 요청을 리다이렉트
  * 어떻게 최선의 서버를 결정하나?
* 특징
  * 클라이언트의 IP 주소에 기반한 결정
* 단점
  * 리다이렉팅 서버의 부하가 커질 수 있음
  * RTT 가 한번 더 발생하기 때문에 지연이 커짐
  * SPF (리다이렉팅 서버)

### 20.4.2 DNS 리다이렉션

* DNS는 하나의 도메인에 여러 IP 주소가 등록되는 것을 허용
* 웹 서버들을 모니터링하는 authoriative server 가 존재
* 다양한 resolving 알고리즘이 있음
  * 라운드 로빈
    * 웹 서버 팜 전체에 대한 부하 균형 유지에 초점
    * 서버의 위치와 상태에 대한 고려가 없음
    * 다중 주소 집합의 첫 번째 주소만 사용하는 클라이언트를 고려해 룩업 당 주소를 순환시켜 첫 번째에 위치하는 주소를 다르게 한다
  * 부하 균형 알고리즘
    * 웹 서버의 부하를 추적하여 부하가 가장 낮은 서버를 목록의 첫 번째에 위치시킴
  * 근접 라우팅 알고리즘
    * 사용자와 가장 가까운 위치의 웹 서버로 라우팅
  * 결함 마스킹 알고리즘
    * 네트워크 상태를 모니터링하여 장애 지점을 피해 라우팅
* 단점
  * DNS 캐싱
    * 하나의 클라이언트에 대한 부하 분산에 실패
  * 클라이언트가 아닌 로컬 DNS 서버의 아이피 주소에 기반한 결정

### 20.4.3 임의 캐스트 어드레싱

* 백본 라우터의 최단거리 라우팅에 의존하는 방법
* 특징
  * advertise 를 통해 백본 라우터는 최단거리의 웹 서버를 알고 있음
  * 백본 라우터가 임의 캐스트 주소를 목적지로 하는 패킷을 받으면 자신이 알고 있는 최단거리 웹 서버로 라우팅
* 단점
  * 반드시 라우팅 프로토콜이 사용해야 함
  * 주소 충돌을 처리할 수 있어야 함, 라우팅 누수 위험

    ![](/files/-M3641YgfFDALu8MQr01)

### 20.4.4 아이피 맥 포워딩

* 레이어-4 스위치를 사용해 특정 IP 주소와 포트번호에 대한 요청을 특정 MAC 장비로 포워딩
* 단점
  * 웹 서버들은 스위치와 한 홉 거리에 위치해야 함

![](/files/-M3641YiConNJsmJGGgG) ![](/files/-M3641YkbI3L9an-uGi7)

### 20.4.5 아이피 주소 포워딩

* 레이어-4 스위치를 사용해 특정 IP 주소와 포트번호에 대해 목적지 IP 주소의 변경에 따라 라우팅
* 맥 포워딩과 유사하지만 IP 주소에 기반한 라우팅이며, 한 홉 거리에 있을 필요가 없다
* NAT
  * 클라이언트와 서버 사이의 스위치가 중간에서 목적지와 출발지 주소를 번역해줌
  * 출발지 주소가 클라이언트의 주소 그대로 남는다면 스위치를 거치지 않고 응답을 내려줄 수 있는 경로가 없다

![](/files/-M3641Ym5rTLWYq59nqR)

### 20.4.6 네트워크 구성요소 제어 프로토콜

* Network Element Control Protocol 은 네트워크 구성요소들과 서버 구성요소들의 통신 수단이다
* 명시적으로 부하 균형을 지원하지는 않는다
  * SE 가 NE 에 부하 균형 정보를 제공
  * MAC 포워딩, GRE 캡슐화, NAT 와 같은 패킷 전달 방식들을 제공
* 예외에 대한 개념을 지원

![](/files/-M3641YolFYBl4n_D1yR) ![](/files/-M3641Yq8vWknUKWLtIi)

## 20.5 프락시 리다이렉션 방법

### 20.5.1 명시적 브라우저 설정

* 브라우저는 프락시 이름, 아이피 주소, 포트번호를 설정할 수 있는 메뉴가 존재
  * 미리 설정되있는 브라우저를 제공하기도 함
* 단점
  * 프락시로부터 응답이 없어도 원 서버에 접촉하지 않음
  * 네트워크 아키텍쳐가 변경에 유연하게 대처하기 어렵다

    **20.5.2 프락시 자동 설정**
* 브라우저가 동적으로 자신의 프락시 설정을 변경
  * URL 마다 프락시가 지정되어 있는 PAC 파일을 받아온다
  * PAC 파일이 존재하는 서버는 미리 지정되어 있음
  * 매 재시작 시 PAC 파일을 받아온다
* PAC 파일은 도메인에 대해 프락시와 원 서버 중 어느쪽으로 먼저 접근해야하는지 반환하는 자바스크립트 파일이다
  * DNS 주소나 서브넷, 호스트명과 관련된 매개변수들에 기반한 결과를 반환할 수 있다
* 네트워크 아키텍쳐가 변경될 경우 PAC 파일에 반영 -> 브라우저 설정과 무관

### 20.5.3 웹 프락시 자동발견 프로토콜

* 웹 브라우저가 수동 설정이나 트래픽 인터셉터에 의존하지 않고 프락시를 발견할 수 있는 방법을 제공
* PAC 파일 자동발견
  * WPAD 는 HTTP 클라이언트가 PAC 파일 위치를 알아내 적절한 프락시 서버 이름을 알 수 있게 한다
  * 부하균형이나 장애 대처 등의 추가 기능을 위해 직접적으로 프락시 서버 이름을 알아내진 않는다
* WPAD 프로토콜 클라이언트 예시
  * WPAD 로 PAC CURL 탐색
  * URL 에 해당하는 PAC 파일을 받아옴
  * PAC 파일을 실행해 프락시 서버 알아냄
  * 프락시 서버에 요청

![](/files/-M3641YscNNdtwQgVnWE)

* WPAD 알고리즘
* 성공할 때 까지 순차실행
  * DHCP (Dynamic Host Configuration Protocol)
  * SLP (Service Location Protocol)
  * DNS에게 잘 알려진 호스트 명
  * DNS SRV 레코드
  * TXT 레코드의 DNS 서비스 URL 들
* WPAD 클라이언트는 DHCP 와 DNS 에게 잘 알려진 호스트명만 요구됨
* 모든 프로세스를 실패하면 프락시를 사용 안하는 것으로 설정
* DHCP를 이용한 CURL 발견
  * WPAD 클라이언트가 DHCP 질의를 통해 CURL 을 얻음
  * DHCP 서버가 CURL 을 저장하고 있어야 함
    * DHCP 옵션코드 252에 저장
* DNS A 레코드 룩업
  * 프락시 서버의 IP 주소들이 DNS 서버에 저장되어있어야 함
  * 모든 룩업 요청은 wpad 접두어가 붙은 QNAME 을 가짐
* PAC 파일 가져오기
  * 위의 방법으로 얻어온 CURL 로 GET 요청
  * 클라이언트가 다룰 수 있는 CFILE 포맷 정보가 담긴 Accept 헤더가 포함되어야 함

#### WPAD 가 실행되는 시점

* 웹 클라이언트가 시작될 때
* 클라이언트 호스트 아이피 주소가 변경된 네트워크 스택으로부터 특정 이벤트를 받을 때마다
* PAC 파일이 만료되었을 때
  * 전체 WPAD 프로세스를 재실행해야 함
  * 조건부 요청으로 PAC 파일을 받아올 수 없다

## 20.6 캐시 리다이렉션 방법

* 고성능, 높은 신뢰성, 콘텐츠 지각 디스패칭까지 고려해야 해서 일반적인 리다이렉션 프로토콜보다 복잡하다

  **20.6.1 WCCP 리다이렉션**
* 라우터와 캐시 사이 통신을로 라우터가 캐시를 검사하고 특정 트래픽을 특정 캐시로 포워딩
* WCCP 리다이렉션 동작
  * WCCP 를 제공하는 라우터, 다른 캐시와 의사소통이 가능한 캐시가 포함된 네트워크
  * 라우터들의 집합과 그 대상이 되는 캐시들이 WCCP 서비스 그룹을 구성
    * 서비스 그룹 설정으로 트래픽 분류와 로드밸런싱 방법에 대해 명시한다
  * HTTP 트래픽 리다이렉션 설정이 되있다면 HTTP 요청을 서비스 그룹의 캐시로 보낸다
  * 서비스 그룹 라우터는 HTTP 요청을 아이피 주소의 해시나 마스크/값 집합 대조 스킴 중 하나에 근거하여 서비스 그룹의 캐시를 선택
  * 라우터는 요청 패킷을 캐시의 아이피 주소와 함께 캡슐화하거나 아이피 맥 포워딩하여 캐시로 보냄
  * 캐시가 요청을 처리할 수 없다면 라우터로 돌아온다
  * 서비스 그룹의 구성원들은 지속적인 하트비트 메세지로 다른 구성원들의 가용성을 체크
* WCCP2 메세지들

![](/files/-M3641YuxRycimWIlh6c)

* 메세지 구성요소
  * 각 WCCP2 메세지를 헤더와 구성요소로 되어있다
  * 헤더는 메세지 종류, 버전, 길이를 포함
  * 각 구성요소는 종류와 길이를 서술하는 4바이트 헤더로 시작한다
    * 구성요소 길이는 헤더의 길이를 포함하지 않음

![](/files/-M3641YwBMp13wIIHCJ5)

* 서비스 그룹
  * 서비스 그룹은 WCCP 메세지를 교환할 수 있는 라우터와 캐시들의 집합
  * 라우터들은 웹 트래픽을 서비스 그룹의 캐시로 포워딩
  * 라우터와 캐시는 Here I am 과 I See You 메세지로 서비스그룹 설정 정보를 교환
* GRE 패킷 캡슐화
  * WCCP 지원 라우터들은 HTTP 패킷을 특정 서버의 IP 주소와 함께 캡슐화해서 리다이렉트함
  * GRE 임을 나타내는 IP 헤더 proto 필드로 식별
  * 클라이언트 IP 주소를 잃어버리지 않는다

![](/files/-M3641YycJXj_ydg-bm2)

* WCCP 부하 균형
  * 라우터들과 서버들은 지속적인 하트비트 메세지로 가용상태를 체크
  * 가용불가로 판단되면 라우터는 트래픽을 리다이렉트하지 않고 인터넷으로 포워딩

## 20.7 인터넷 캐시 프로토콜

* 형제 캐시에 일어난 캐시 적중을 확인할 수 있도록 하는 프로토콜
* 원 서버보다 형제 캐시로부터 컨텐츠를 받아오는 비용이 더 적을 것을 전제로 함
* 근처 모든 캐시에 특정 URL 을 가지는지 질의
  * 응답은 HIT / MISS
  * HIT 응답을 준 캐시에 HTTP 커넥션을 열 수 있다
* Network byte order 를 따르는 32비트 구조체, UDP 기반
  * OP 코드
  * 버전
  * 길이
  * 요청번호
  * 옵션
  * 옵션 데이터
  * 발송자 호스트 주소
  * 페이로드

## 20.8 캐시 배열 라우팅 프로토콜

* 여러개의 프락시 서버 배열이 하나의 캐시처럼 보이도록 관리해주는 프로토콜
* 하나의 그룹 안에 중복 엔트리가 허용되는 ICP 와 달리 CARP는 해시를 사용해 중복을 허용하지 않음
  * ICP는 질의를 주변 모든 캐시에 브로드캐스팅하지만, CARP 는 특정 캐시 서버에만 질의
* 단점
  * 몇몇 캐시 서버가 다운되면 해시 함수가 수정되어야하고, 캐시된 컨텐츠들의 재배치로 인한 비용이든다

## 20.9 하이퍼텍스트 캐싱 프로토콜

* 형제 캐시에 질의할 때 URL 과 모든 요청 및 응답 헤더를 사용
  * HTTP/0.9 기반으로 설계된 ICP 한계 보완
* 자체 인증기능을 제공&#x20;
* 캐싱 정책
  * SET 메세지로 캐시된 문서들에 대한 정책 변경이 가능

![](/files/-M3641Z--xX7zdlVDgGf)
