2009년 9월 29일 화요일

네트워크 Pipe와 RTT의 상관 관계

네트워크를 사용하는 응용 프로그램 성능의 주요 팩터는 바로 네트워크 처리량입니다. 응용 프로그램에 대한 네트워크 처리량에 따라 응용 프로그램의 응답성 및 사용자가 느끼는 성능에 차이가 발생할 수 있습니다.

이러한 네트워크 처리량에 영향을 줄수 있는 팩터는 여러가지가 있습니다. 그중 첫번째는 바로 네트워크의 물리적인 특징입니다. 네트워크 자체를 파이프라고 생각하시면, 대역폭(Bandwidth)는 바로 파이프의 지름이라고 볼 수 있습니다. 지연(Latency), RTT(Rount Trip Time)은 파이프의 길이라고 해야할까요? 만약 여러분께서 1GB의 데이터를 전송하고자 한다면, 더 굵고, 짧은 파이프가 길고 얇은 파이프보다 빠르게 데이터를 전송할 수 있습니다. 높은 대역폭과 낮은 지연은 높은 처리량에 대한 필수 팩터라고 볼 수 있습니다.

네트워크의 사용량은 두번째 팩터가 되게 됩니다. 사용자/응용 프로그램이 주어진 네트워크 링크를 공유해서 사용하기 때문에, 응용 프로그램의 처리량 증가는 자연스럽게 링크의 감소로 이어지게 됩니다. 링크 대역폭은 TCP 프로토콜을 사용하는 응용 프로그램간에 공평하게 나누어서 사용하기 때문에, TCP 연결의 대역폭에 대해 응용 프로그램 연결을 제한하지 않는다면, 해당 링크는 혼잡(Congestion)이 발생하게 됩니다. 당연한 이야기죠? 혼잡이 발생하면 패킷의 누락과 전체적인 처리량의 감소가 생기는 것도 너무 당연하죠. 이러한 것을 막기 위해, TCP 프로토콜은 혼잡을 방지하고, 감지할수 있는 메커니즘을 가지고 있고 이를 통해 대역폭을 공평히 나누어 쓰게 됩니다.

세번째 팩터는 네트워크 프로토콜로부터 발생하게 됩니다. TCP는 두가지 메커니즘을 통해 연결에 대한 처리량을 제한합니다. 한가지가 혼잡 제어(Congestion Control), 또하나가 흐름 제어, 흔히 이야기하는 Receiving Windows입니다. 혼잡 제어는 TCP 프로토콜에 네트워크내 혼잡을 발생시키지 않고, 공평하게 네트워크를 나눠 사용할 수 있도록 하며, Receiving Windows는 수신자가 처리할 수 있는 데이터량보다 많이 송신자가 전송하는 것을 막아줍니다. 이러한 제어는 TCP 프로토콜에 대한 이야기이며, UDP는 이러한 처리를 하지 않습니다.

 

TCP Receive Window 제한은 TCP 연결시 사용할 수 있는 처리량에 제한을 가하게 됩니다. 이론적으로 Receive Window R이라고 하고, 양 종단간의 RTT(Rount Trip Time) T라고 했을 때...

Throughput =  R/T

가 되게 됩니다. 저도 처음에 잘 이해가 안가는 공식이었지만(Bandwidth-Latency 기술을 공부할 때 봤었던 공식이었습니다.), 조금 이해를 돕기 위해.. 다시 공식을 바꿔 써보면..

Throughput X T = R

최대 처리량은 초당 전송량이기 때문에, 실제 전송되기 까지의 지연(시간이죠)을 곱해주면 상대방이 받을 수 있는 한번에 수신할 수 있는 최대 처리량.. = TCP가 받을 수 있는 최대 Window 크기가 되게 됩니다.

 

예를 들어, Windows Server 2003, XP TCP Receive Window 기본 크기는 64KB였었습니다. 양단간의 RTT 100ms 일 때, 최대 처리량은 64KB/100ms = 5.12Mbps가 되게 됩니다.
64*8=512/100=5.12
사용 응용 프로그램이 어떠한 제한 사항도 없다면, TCP 송신자는 네트워크에 가용할 수 있는 최대 대역폭을 다 사용할 수 있습니다.

이미 언급한 데로, 기존의 Windows는 전체 시스템에 대해서 TCP Receive Window 64KB로 고정되어져 있었습니다. 이러한 접근 방식은 대역폭이 점점 커져가는 현실에, 처리량을 제한하는 요소중 하나였습니다. 레지스트리 키중에 TCPWindowSize가 원하는 값으로 Receive Window 크기를 입력할 수 있었지만, 이러한 입력은 시스템 전체에 영향을 주었기 때문에, 특정한 TCP 연결, 다시 말해, 무선에 대한 설정, 유선에 대한 설정은 할 수 없었습니다.

위의 그림은 Receive Window 크기와 RTT값에 따른 최대 처리량을 보여주는 그래프입니다. 보시는 데로, 기본 크기인 64KB Receive Window 크기를 사용했을 경우, RTT 값이 커질 수록(다시 말해, 거리가 멀어질 수록) 사용가능한 최대 처리량이 줄어들어는 것을 볼 수 있습니다. 거의 5Mbps 밑이죠. 두 지점간 대역폭이 아무리 좋더라도 실제 사용 가능한 대역폭은 5Mbps이상을 쓰기가 어려웠다는 것입니다. 그렇다고 무조건 Receiving Window 크기가 커야 한다는 의미는 아닙니다. 시스템간이 단일 스위치, 다시 말해, 매우 거리가 가까운 경우에는 RTT값이 매우 작으므로, 무조건 크기를 키우는 것이 능사만은 아닙니다.

이에, Windows Server 2008, Windows Vista에서는 Receive Window 크기에 대해 자동으로 튜닝하는 기능이 추가되었습니다. 모든 연결시, 환경을 파악하여, TCP Receive Window 크기를 조절합니다. 이러한 기능을 통해, 네트워크로 더 많은 양의 데이터를 전송하고, 이를 통해 사용자는 빠른 처리 시간을 기대할 수 있습니다. 높은 대역폭, 높은 지연률을 가진, 대륙간, 지역간 네트워크일수록 Windows Server 2008, Windows Vista의 네트워크 튜닝 기능이 매우 유용해질 수 있습니다. Receive Window가 커져서, 네트워크에 문제가 발생할 수 있지 않냐는 질문을 하시지만, 이미 이전 포스팅에 언급드린 데로, TCP Congestion Control도 역시 메커니즘의 하나로 가지고 있었습니다.

TCP Receive Windows 제어는 송신자가 수신자에게 데이터를 보낼때, 얼마나 많은 양의 확인되지 않은(Unacknowledged) 데이터를 보낼 수 있느냐의 의미입니다.

응답이 빠르다면(거리가 가깝다면), 구지 Receiving Window 크기를 키울 필요가 없다는 것도 이제는 이해가 되실 것입니다. 그러나, RTT가 커졌을 경우, 데이터를 보냈을 때, 이에 대한 확인을 받는 시간이 오래걸리므로, 그만큼 송신자는 네트워크 파이프를 채울 수 있는 많은 시간이 남게 됩니다, 이 경우, Receiving Window 값이 네트워크 파이프를 다 사용하지 못하는 팩터가 된다.. 는 의미입니다. 헥헥..

가장 최적의 크기는 송신자가 네트워크가 유지되는 한도에서 보낼 수 있는 크기라고 볼 수 있습니다. Windows Vista에서부터 해당 기능은 이미 사용중에 있습니다. 이러한 자동 튜닝이 적용되기 위해서는 아래의 몇가지 사항이 만족되어야 합니다.

1. 연결에 대한 지연 > 10ms (RTT)
2. Bandwidth * Latency > 64KB
3.
응용 프로그램에 수신 버퍼 크기가 지정되지 않은 경우

4.
응용 프로그램이 보내주는 데이터의 크기에 상관없이 처리가 되는 경우

이제 또하나의 문제를 제기해야 합니다. TCP Receive Window 크기를 지정하는 레지스트리는 16비트입니다. 2 16승이 65535.. 64KB이므로, Window 크기를 더 늘리려면 레지스트리의 비트가 늘어나던지, 무언가 다른 방법론이 취해져야 합니다. 이에 Windows TCP Receive Window Scailing에 관련된 레지스트리를 추가적으로 사용합니다. Window Scailing 옵션을 Windows Vista, Windows Server 2008은 기본적으로 사용합니다.

TCP 연결 시도를 하는 동안, 송신자와 수신자는 Scailing 옵션을 상호 교섭합니다. 만약 원격지에서 이를 지원한다면, Window Scailing 옵션이 사용되게 됩니다, Windows Vista Scale 팩터로 8 (2 8 = 256)을 사용합니다. 256배가 된다는 뜻이죠.. 64KB X 256 = 16MB Receiving Window가 되죠.. 기존값에 비하면 매우 높은 값이며, 이러한 값을 무작정 사용하는 것이 아니라, 원격지 시스템, 네트워크 상태에 따라 자동으로 조절하게 된다는 뜻입니다.

 

Http Header 정리

HyperText Transfer Protocl은 www(World Wide Web)으로 접속하는 통신 수단이고 오늘날의 웹에 적용해서 사용되고 있습니다. 정적인 페이지에서 동적인 페이지로 만들기위해 발전되었고 복잡하고 웹 애플리케이션을 지원하기 위하여 만들어진 프로토콜입니다. HTTP는 고객이 Request를 보낸 메시지에 근거한 모델을 사용합니다. 그리고 서버는 Response를 돌려줍니다. 덧붙여 HTTP 필터가 가끔 사용자들에게 돌아가는 경우도 있다. 예를 들어 서버에서 발생한 오류 코드들을 브라우저로 보여줄 때가 있다.

 HTTP Request

 다음은 전형적인 HTTP request 내용이다.

GET /books/search.asp HTTP/1.1

Accept: image/gif, image/xxbitmap, image/jpeg, image/pjpeg,

application/xshockwaveflash, application/vnd.msexcel,

application/vnd.mspowerpoint, application/msword, */*

Referer: http://wahh-app.com/books/default.asp

Accept-Language: en-gb,en-us;q=0.5

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)

Host: wahh-app.com

Cookie: lang=en; JSESSIONID=0000tI8rk7joMx44S2Uu85nSWc_:vsnlc502

(                           공백행                               )


GET /books/search.asp HTTP/1.1

- GET메소드를 이용하여 search.asp라는 문서를 요청하며, 이 때 HTTP1.1버전을 사용한다.


User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)

  Accept: image/gif, image/xxbitmap, image/jpeg, image/pjpeg,

- 클라이언트는 서버에게 옵션헤더 정보를 보내 자신이 설정한 내용과 받아들일 문서의 형식을 알린다. 모든 헤더 정보는 각 헤더 이름과 값을 가즌 행별로 주어진다. 그리고 사용자는 헤더의 끝을 알리기 위해 공백행을 보낸다.


- 요청과 헤더를 보낸 후에, 클라이언트는 추가로 다른 데이터를 보낼수있다. 이 때 POST메소드를 사용하는 CGI프로그램을 이용한다.


Request에는 크게 세가지 부분으로 이루어져있다.

첫번째 라인에는 HTTP명령어와 사용자가 질의한 파일이나 자원을 표시하는 URL, 그리고 HTTP 버전 번호로 이루어진다. 두번째 부분은 사용자와 서버에서 보내는 데이터ENTITY에 대한 정보를 제공하는 헤더 정보가 포함되고, 세번째 부분은 사용자 요청으로 서버에게 보내는 데이터인 ENTITY의 몸체이다.


 메소드

메소드는 사용자 요구 사항의 첫째 라인에서 시작한다. 서버에게 사용자의 목적을 알리는 역할을 하는데, HTTP에서는 미리 정의 된 GET, HEAD, POST가 있다. 물론 다른 메소드도 지원하지만 현재 서버에서 폭넓게 지원하지는 않는다. 참고로 메소드는 대소문자를 구분한다.


 GET 메소드

GET 메소드는 서버에서 명시된 URI에 위치 정보에 대한 요청으로 웹 브라우저가 문서를 받아 보는데 사용되는 일반적인 방법이다. GET 요청의 결과는 서버에서 접근할 수있는 파일, 프로그램이나 CGI등의 결과 값, 하드웨어 장치로부터의 출력등의 여러방식으로 생성될 수 있다.

 사용자가 GET 메소드를 사용하여 요청할 때, 서버는 상태 표시줄, 헤더, 요청된 데이터로 응답한다. 서버에서 오류가 발생하거나 권한이 아닌 상태로 인해 요청을 진행시킬수 없다면 서버는 적절한 오류 메세지를 보낸다.


GET이 요청하는 실제 데이터 부분은 항상 비어있다. GET메소드는 근본적으로 파일을 달라는 요청상태로 이용된다. 사용자가 요청하는 파일이나 프로그램은 일반적으로 서버에서 전체 경로명에 의해 식별된다. 또한 GET 메소드는 폼 태그를 통해 CGI같은 프로그램으로 입력된 데이터를 보내는데 사용되기도 한다. 위에서도 언급했듯이 비어있는 ENTITY몸체를 가지고 있으므로 입력된 자료는 요청의 GET행에 있는 URL에 덧붙혀진다.

GET /books/search.asp?q=wahh HTTP/1.1

위의 예는 서버에서 클라이언트가 입력한 q의 값 wahh를 나타낸다.

q와 wahh는 <form>태그의 키와 값을 나타내며 2개 이상의 키와 값을 전송할때는 &기호에 의해 추가 할수있다.


 HEAD 메소드

 HEAD 메소드는 서버가 응답해야 할 데이터를 보내지 않는다는 것을 제외하면 GET 메소드와 같다.  HEAD 메소드는 파일이나 자원에 대한 헤더 정보만을 요구한다.

 클라이언트는 다음과 같은 예의 정보를 원한다.

 - 캐시 관련 질의에 유용한 문서의 수정 시간

 - 도착 시간을 측정하거나 문서의 더 작은 버전을 요청을 결정하는 페이지

 레이아웃에 유용한 문서의 크기

 - 클라이언트가 특정 문서만 검색할 수 있도록 해주는 문서의 유형

 - 주문형 서버 질의를 가능하게 하는 서버의 유형

 서버가 제공하는 헤더 정보의 대부분은 선택적이며 모든 서버들이 제공하는 것은 아니다. 또한 클라이언트에게 유익한 설계는 요구하는 헤더 정보를 서버가 전달하지 못할 경우, 서버가 융통성 있게 응답하고 기본적인 조치를 취하도록 하는것이다.


POST 메소드

 POST 메소드는 클라이언트가 요청한 데이터를 서버에게 보내게 한다. 데이터는 서버에서 접근할 수 있는 데이터를 다룰 수 있는 프로그램(CGI등)에 전달된다.

POST 메소드는 다음과 같은 애플리케이션에서 사용될 수 있다.

 - 글을 올릴수 있는 네트워크 서비스

 - 명령행에서 실행되는 프로그램

 - 서버에 있는 문서의 주석

 - 데이터베이스 조작

서버는 POST 메소드와 각종 헤더들을 처리한 후, ENTITY 몸체를 URI에 지정된 프로그램에 전달한다. POST 메소드에서 가장 일반적으로 사용되는 인코딩 방법은 URL인코딩이다. 폼으로부터 전달된 데이터가 CGI처리를 위한 변수와 값으로 변환되게 한다.


기타 메소드들에는 LINK, UNLINK, PUT, DELETE, OPTIONS, TRACE, CONNECT 등이 있다.(자세한 정보는 구글신에게 기도를 드리자!)



HTTP Response

다음은 전형적인 HTTP Respose 내용이다.

HTTP/1.1 200 OK

Date: Sat, 19 May 2007 13:49:37 GMT

Server: IBM_HTTP_SERVER/1.3.26.2 Apache/1.3.26 (Unix)

Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc

Pragma: no-cache

Expires: Thu, 01 Jan 1970 00:00:00 GMT

Content-Type: text/html;charset=ISO-8859-1

Content-Language: en-US

Content-Length: 24246

(                                공백행                                    )


HTTP/1.1 200 OK

서버는 HTTP버젼, 상태코드, 설명으로 응답을 한다. HTTP버전은 서버가 응답하기 위해 사용하는 HTTP의 버전을 나타내며, 상태코드는 사용자가 요청한 서버의 결과를 나타내는 세자리 숫자이다. 설명은 우리들이 이해할 수 있는 텍스트로 되어있다.

 위의 내용의 서버가 사용자의 요청에 HTTP 1.1버전을 사용했다는 것을 나타내고 200이란 상태 코드는 사용자의 요청이 성공적으로 됐다는 것을 의미한다. OK는 200에 대한 우리들이 이해할 수 있는 텍스트이다.


공백행은 헤더의 끝을 나타낸다.


HTTP Header

 HTTP 헤더는 클라이언트와 서버 사이에서 모든 종류의 정보를 전송하는데 이용되며 크게 4가지로 분류할 수 있다.

 General - 클라이언트, 서버 또는 HTTP와 관계된 정보

 Request - 문서 양식과 서버의 매개 변수들

 Response - 응답을 보내는 서버에 대한 정보

 Entitiy - 클라이언트와 서버 사이에 전송되는 데이터에 대한 정보

HTTP메시지에 있는 모든 헤더는 헤더 이름을 포함하여 콜론, 공백, 헤더의 값 순으로 구성된다. 헤더 이름은 대소문자를 구별하지 않는다. 또한 헤더의 값은 적어도 하나의 공백이나 탭 문자를 각행에 붙임으로써 여러 줄로 확장하여 쓸 수 있다.

일반 헤더와 ENTITY헤더는 서버와 클라이언트 모두 동일하다.


 General Header

 일반 헤더는 클라이언트의 요청과 서버의 응답 양쪽에서 사용될 수있다.

일반 헤더는 다음과 같은 내용을 가지고 있다.

- Cache-Control

 Cache-control:  directives

 쉼표로 구분된 목록에 캐싱 지시문을 지정


캐시 요청 지시문

 ㄱ. no-cache           캐시 하지 않는다.

 ㄴ. no-store            신속히 넘긴 후에 정보를 제거한다.

 ㄷ. max-age = seconds      seconds에 지정한 것보다 오래된 응답은 보내지 않는다.

 ㄹ. max-stale [=seconds] 만료된 데이터를 보낸다. 만약 seconds가 지정되어

있다면 지정한 숫자보다 적은 만료된 데이터를 보

낸다.

 ㅁ. min-fresh = seconds     명시된 seconds의 수 이후의 변경된 새 데이터만 보낸다.

 ㅂ. only-if-cached   새로운 데이터를 검색하지 않고 캐시에 있는 데이터만 반환한다.


캐시 응답 지시문

 ㄱ. public                 어떠한 캐시라도 캐시할수 있다.

 ㄴ. private               공유된 캐시는 캐시하지 않는다.

 ㄷ. no-cache           캐시하지 않는다.

 ㄹ. no-transform      데이터를 변환하지 않는다.

 ㅁ. must-revalidate  클라이언트는 데이터를 재확인 해야 한다.

 ㅂ. proxy-revalidate 개인적인 클라이언트 캐시를 제외하고 데이터를 재확인 해야한다.

 ㅅ. max-age=seconds        문서는 지정된 seconds만큼만 변화가 없는 상태라고 생각


Connection

Connection:  options

 options에서는 연결을 위해 지정하는데 프록시 서버에 의한 연결은 포함하지 않는다. close연결 옵션은 클라이언트나 서버 둘 중 하나가 연결을 해제하기를 원한다는 것을 알린다.


Date

 Date:  dateformat

 현재의 날짜와 시간을 표시한다.

예) Mon, 11 May 2000 07:45:00 GMT

때로는 이전과 호환을 위해 RFC-850과 ANSI C asctime() 도 사용할 수 있다.

Monday, 11-May-98 07:45:00 GMT

Mon May 11 07:45:00 2000

단 년도 항목에 2자리를 사용으로 인한 문제가 발생할 수 있다.


MIME-Version

MIME-Version:  version

HTTP 트랜젝션에서 사용되는 MIME(RFC-2045[7])의 버전을 말한다.

메시지의 ENTITY몸체가 MIME를 따르지 않으면 이 헤더는 생략될 수 있다. 만약 틀랜잭션에서 MIME-encoded데이터를 호출하지만 이 헤더가 삭제되었다면 디폴트로 1.0을 사용한다.


Progma

 Pragma: no-cache

 프록시 시스템에 대한 지시문을 말한다. 이 헤더는 목표가 되는 서버에서는 무시된다.

HTTP는 이 헤더를 위해 no-cache라는 지시어만 정의 한다. HTTP 1.0에서, 이 것은 그 로컬 캐시 대신 서버로부터의 문서를 요구하도록 프록시 서버에 명령한다.

단, HTTP1.1은 Cache Control:no-cache를 주로 사용한다.


Transfer-Encoding

 Transfer-Encoding:  encoding_type

안전한 전송을 위해 메시지 본체에 어떤 종류의 변환이 적용이 됐는지 나태낸다.


Upgrade

 Upgrade:  protocol/version

 우선하는 프로토콜을 명시한다. 응답 코드 101 Switching Protocols과 연결하여 사용된다.

예) Upgrade: HTTP/1.2


Via

 Via:  protocol host   [comment]…

 게이트웨이와 프록시에 의해 사용되어 클라이언트와 서버 간의 트랜잭션을 처리하는 프로토콜과 호스트를 표시한다.



클라이언트 요청 헤더


Accept

 Accept:  type/subtype [; q=qvalue]

 클라이언트가 우선적으로 받아들이는 미디어 형을 명시한다. 여러 개의 미디어 형을 쉼표로 구분해서 나열할 수있다. 옵션인 qbalue는 받는 형태의 수준 순서로써 0 에서 1까지 나타낸다.


Accept-Charaset

 Accept-Charset: character_set [;q=qvalue]

 클라이언트가 우선하는 문자 세트를 지정한다. 여러 개의 문자 세트는 쉼표로 구분하여 나열한다. 옵션인 qvalue는 우선하지 않는 문자 세트의 수준 순서로 0 에서 1까지 나타낸다.


Accept-Encoding

 Accept-Encoding:  endoding_types

 compress 또는 gzip과 같은 클라이언트가 받아들일 수 있는 인코딩 방식을 지정한다.
여러 개의 인코딩 방식을 쉼표로 구분하여 나열한다.
만약 인코딩 형태를 지정하지 않으면 어떤 형태도 클라이언트에게 받아들여지지 않는다.


Accept-Language

Accept-Language: language [; q=qvalue]

 클라이언트가 우선적으로 지원하는 언어를 지정한다.
쉼표로 구분해서 여러 개의 언어를 지정할 수 있다.
옵션인 qvalue는 우선하지 않는 언어 순서로 0에서 1까지로 나타낸다.
 언어는 두문자로 축약해서 쓴다.(예)en, fr, kr 등


Authorization

Authorization: scheme credentials

 URI에 클라이언트가 데이터에 접근할 수 있는 권한을 제공한다. 요청된 문서가 권한을 요구하면 서버는 요구된 권한의 유형을 설명하는 WWW-Authenticate헤더를 반환한다. 그리고 나서 클라이언트는 적당한 권한 정보를 요청할 때마다 이것을 반복한다.

 HTTP에 일반적으로 사용된 권한 계획은 BASIC이며, BASIC방식에서는 권한을 인증하기 위해 base64로 인코딩된 username:password 형태를 따른다. 예를 들면, 사용 자명이 ‘webmaster’ 이고 패스워드가‘zrma4v’라면 authorization 헤더는 이것을 다음과 같이 보이게 한다.

Authorization: BASIC d2VibWFzdGVyOnpycW1hNHY=

이것의 디코딩 값은 webmaster : zrma4v이다


Cookie

Cookie: name=value

 URL을 위해 저장된 정보의 이름=값을 포함한다. 여러 개의 쿠키는 세미콜론으로 구분하여 나열된다. 넷스키이프도 쿠키를 지원한다. HTTP표준에는 포함되어 있지 않다.


From

From: email_address

 현재 사용하고 있는 클라이언트의 전자 우편 주소를 반환한다.


Host

Host: hostname[:port]

 호스트의 이름과 URI의 port번호를 지정한다. 클라이언트는 HTTP1.1에 반드시 이정보를 공급해야 하는데 이것은 여러 개의 호스트명이 갖는 애매한 URL을 쉽게 구별하는 데 도움이 된다.


If-Modified-Since

If-Modified-Since: date

 헤더의 값으로 주어진 날짜 이후 수정이 되었다면 URI데이터를 보낸다는 것을 명시한다. 이것은 클라이언트 측 캐시에 대해 유용하다. 만약 문서가 수정되지 않았다면 서버는 304코드를 반환하여 클라이언트에게 로컬에 있는 사본을 보여준다. 단 지정한 날짜는 Date헤더 아래에 설명된 형식을 따라야 한다.


If-Match

If-Match: entity_tag

 조건적으로 요청하는 것으로 주어진 ENTITY태그와 매치된다. *기호는 어떠한 ENTITY와도 매치되며, ENTITY가 존재해야만 트랜잭션이 계속된다.


If-None-Match

If-None-Match: entity_tag

조건적으로 요청하는 것으로 주어진 엔티티 태그와 어떠한 것도 매치되지 않는다.

*기호는 어떠한 엔티티와도 매치되며 엔티티가 존재하지 않아야만 트랜잭션이 계속된다.


If-Range

If-Range: entity_tag | date

 조건적으로 요청하는 것으로 실체의 일부가 변하지 않았는데 찾을 수 없고, 그것이 실체의 전부를 나타낸다. Range헤더와 함께 사용되어야 한다. ENTITY 태그나 날짜 둘 중 하나는 이미 주어진 실체의 일부분을 식별할 수 있다.


If-Unmodified-Since

If-Unmodified-Since: date

 주어진 날짜 이후로 수정되지 않았다면 URI데이터를 보내도록 지정한다. 지정한 날짜는 Date헤더 아래에 설명된 형식을 따라야 한다.


Max-Forwards

Max-Forwards: n

 요청을 전달한 프록시나 게이트 웨이의 개수를 제한한다. TRACE 메소드와 함께 사용하여 디버깅에 유용하며, 무한 루프를 피할 수 있다.


Proxy-Authorization

Proxy-Authorization: credentials

 클라이언트가 권한을 요구하는 프록시에 대해 자신을 식별하기 위해 사용한다.


Range

Range: bytes= n-m

 문서가 요구하는 부분적인 범위를 명시한다. 여러 개의 범위는 세미콜론으로 구분하여 나열한다. 만약 쉼표로 구별된 바이트 범위인 첫번째 숫자가 없다면 범위는 문서의 끝에서부터 없어진다고 가정한다. 만일 두번째 숫자가 없다면 범위는 끝에서 n바이트까지이다. 첫번째 바이트는 0바이트이다.


Referer

Referer: url

 요청된 URI를 참조하는 문서의 URI에 전달한다.


User-Agent

User-Agent: string

클라이언트 프로그램에 대한 식별 가능한 정보를 준다.



서버 응답 헤더


Accept-Ranges

Accept-Ranges: bytes|none

 URI를 위한 요청 범위의 승인을 나타내며 또는 받아들인 요청의 범위가 없을 경우 none을 지정한다. 범위의 단위는 byte이다.


Age

Age: seconds

seconds에 문서의 나이를 지시한다.


Proxy-Authenticate

Proxy-Authenticate: scheme realm

 확인 계획과 이URI와 그 현재의 연결에 대해 프록시에 대한 적용할 수 있는 매개변수를 나타낸다. 응답으로 407을 사용한다.


Retry-After

Retry-After: dateseconds

응답코드 5 0 3(Service Uncavailable)과 함께 사용된다. 정수나GMT 날짜와 시간(D a t e헤더 형태를 설명)둘 중 하나를 포함한다. 만일 값이 정수이면 seconds의 숫자로 해석하여 요청이 발생한 후 지정한 seconds만큼 기다린다.

예) Retry-After: 3500

Retry-After: Fri, 17 May 1999 12:24:17 GMT


Server

Server: string

서버의 이름과 버전 번호를 포함한다.

예) Server: NCSA/1.3


Set-Cookie

Set-Cookie: name=value [; option ]

U R L을 위해 보유한 정보의 이름/값 쌍을 포함한다. 넷스케이프 쿠키를 지원하기 위

한 것으로 HTTP 표준에는 포함되어 있지 않다.

옵션의 예)

expires=date

지정된 날짜가 지나면 쿠키가 유효하지 않게 된다.

path=pathname

쿠키가 유효한URL 범위

domain=domain_name

쿠키가 유효한 도메인명의 범위

secure

보안이 적용된 연결에서만 쿠키를 반환한다.


Vary

Vary: *| headers

엔티티가 다중 자원을 가지고 있으므로 요청한 헤더를 지정한 목록이 상황에 따라 변할 수 있다는것을 지정한다. 여러 개의 헤더는 세미콜론으로 구분하여 나열한다.

*기호는 요청한 헤더가 반환되는 문서에 영향을 미칠 수도 있는 다른 요인을 의미 한다.


Warning

Warning: code host [ :port] string

 프록시 캐싱에서 사용하기 위한 상태 코드의 추가 정보를 나타낸다. host필드는 이름 또는 서버 호스트의 익명을 포함하며, 선택적으로 포트 번호를 포함한다. 두 자리 경고 코드와 그것을 설명하는 문자열은 다음과 같다.

10 Response is stale

응답 데이터는 오래된 것으로 알려져 있다.

11 Revalidation failed

응답 데이터는 오래된 것으로 알려져 있으며 그 이유는 프록시가 데이터를 재검증하는 데 실패했기 때문이다.

12 Disconnected operation

캐시가 네트워크로부터 연결되지 않았다.

13 Heuristic expiration

데이터는2 4시간 이상 된 것이며, 캐시는2 4시간 보다 더 이전에 만들어진 것을 사용한다.

14 Transformation applied

프록시는Content-Encoding이나 Content-Type 헤더에 명시한 대로 인코딩이나 문서의 미디어 형을 변경시켰다.

99 Miscellaneous warning

임의의 정보가 클라이언트에게 접속되거나 나타났다.


WWW-Authenticate

WWW-Authenticate: scheme realm

 401(Unauthorized) 응답 코드와 함께 사용된다. 요청된 URI에서 클라이언트로부터 요청된 권한의 범위와 권한의 계획을 명시한다. 많은 다른 권한 범위는 서버에 존재한다. 일반적인 권한 계획은 BASIC이며 사용자명과 패스워드를 요구한다.

예) WWW-Authenticate: BASIC realm="admin"



ENTITY Header

Allow

Allow: methods

지정한 URI에서 허락하는 메소드를 쉼표로 구분된 목록을 포함한다. 요청된 정보에 유용한 메소드들을 클라이언트에게 알리는 코드 405(Method Not Allow)를 서버 응답에 사용한다.


Content-Encoding

Content-Encoding: encoding_schemes

엔티티 몸체를 전송할 때 사용할 인코딩 체계(scheme)를 지정한다. 값으로는gzip(또는 x-gzip)과 compress(또는 x-compress)를 사용할 수 있다. 만약 여러 개의 인코딩 체계(쉼표로 구별한 목록 안에)가 지정되어 있다면 소스 데이터에 적용한 명령을 나열해야 한다.


Content-Language

Content-Language: languages

전송될 엔티티 몸체에서 의도하는 언어를 지정한다. 언어는 두 자리 숫자 코드로 나타낸다.(예, en, kr 등)


Content-Length

Content-Length: n

이 헤더는 전송된 엔티티 몸체가 가진 데이터의 길이(byte 단위로)를 지정한다. 어떤요청은 동적인 성질을 가질 수 있기 때문에 컨텐츠의 길이를 알 수 없을 경우도 있고, 이 경우에는 이 헤더를 제거한다.


Content-Location

Content-Location: uri

엔티티에 대한 URI를 제공한다. 이 경우 문서가 독립적으로 접근 가능한 위치에 다중 엔티티를 갖고 있을 수 있다. U R I는 절대 혹은 상대 경로로 지정할 수 있다.


Content-MD5

Content-MD5: digest

인수한 메시지의 완전성을 검사하기 위해 엔티티의 MD5 다이제스트를 제공한다.


Content-Range

Content-Range: bytes n-m/length

수반하는 엔티티 몸체 일부에 삽입되며, 전체 엔티티 몸체의 크기를 지정한다.

예)Content-Range: bytes 6143-7166/15339


Content-Transfer-Encoding

Content-Transfer-Encoding: scheme

네트워크에 전달되는 엔티티 몸체에 적용되는 어떤 변화를 지정한다. 일반적인 값으로는 7bit, 8bit, binary, base64, 그리고 quoted-printable이 있다.


Content-Type

Content-Type: type/subtype

엔티티 몸체의 미디어 형과 부미디어 형을 설명한다. 이는 같은 값을 클라이언트의Accept 헤더로 사용하며, 서버는 그 클라이언트가 우선적으로 지원하는 포맷 양식에 따르는 미디어 형을 반환해야 한다.


ETag

ETag: entity_tag

If-Match와 If-None-Match 요청 헤더를 위한 태그를 정의한다.


Expires

Expires: date

문서가 변경될 수도 있을 때의 시간 또는 그것의 정보가 유효하지 않을 때의 시간을명시한다. 그 시간 이후, 문서는 변경 또는 삭제되거나 그렇지 않을 수 있다. 값은 Date 헤더에서 설명한 것과 같은 유효한 형태의 날짜와 시간이다.


Last-Modified

Last-Modified: date

지정한 URI가 마지막으로 변경된 때를 명시한다. 값은Date 헤더에 설명한 것과 같은 유효한 형태의 날짜와 시간이다.


Location

Location: uri

문서의 새로운 위치를 지정한다. 일반적으로 응답 코드 201(Created), 301(MovedPerm anently), 또는302(Moved Temporarily)와 함께 사용된다. 주어진URI는 절대 주소로 지정해야 한다.


쿠키

항구적인 상태에 있는 클라이언트측 쿠키는 넷스케이프 네비게이터에서 소개한 것으로, 서버가 클라이언트의 장치에서 클라이언트가 지정한 정보를 저장할 수 있게 하기 위한 것이다. 서버는 클라이언트에 의해 다시 특정한 페이지나 서버에 접근할 때 그 정보를 이용할 수 있다. 쿠키 작동 형태는 서버가 각 클라이언트에 보내는 페이지를 개별화할 수 있도록 해주거나 사이트의 다양한 페이지들을 브라우징할 때 클라이언트가 선택했던 것들을 기억할 수 있게 해준다. 따라서 서버측에서 복잡한 CGI나 데이터베이스 시스템을 사용하지 않아도 된다.

쿠키는 다음과 같은 방법으로 작동한다. CGI 프로그램은 새로운 사용자를 식별할 때,서버가 클라이언트의 입력에서 조금씩 모아둔 정보와 그 사용자에 대한 식별자를 포함에 부가 헤더를 추가한다. 이 헤더는 클라이언트의 쿠키 파일에 사용자의 쿠키정보를 추가하라고 쿠키를 사용할 수 있는 브라우저에 알린다. 그러면, 웹 브라우저 URL의 모든 요청은 기타 헤더의 요청에 그 쿠키 정보를 포함시킬 것이며, CGI 프로그램은 특정한 사용자에게 맞추어진 문서를 보여줄 때 이 정보를 사용한다.

쿠키는 클라이언트의 하드 드라이브에 저장되므로 정보는 웹 브라우저가 닫히고 다시 열어도 남아 있다.


Set-Cookie 응답 헤더

사용자가 처음으로 사이트나 페이지를 방문하면 쿠키가 생성된다. CGI 프로그램은 사용자 요청을 받으면 이전의 쿠키 정보를 검색한다. 만약 쿠키가 없다면 Set-Cookie 헤더를 포함하는 응답을 보낸다. 이 헤더에는 클라이언트에 대해 유지하고자 하는 정보를 담고 있는 이름/값 으로 포함되어 있다. 헤더에 다른 선택 필드들도 포함시킬 수 있다.

Set-Cookie 헤더는 다음과 같은 구문을 사용한다.

Set-Cookie: name=value; expires=date;

path=pathname; domain=domain-name; secure

여러 개의 Set-Cookie 헤더는 서버 응답에 포함될 수 있다. ‘이름=값’으로 이루어진쌍은 이 헤더에 요구되는 유일한 속성이며, 처음에 와야 한다. 그 다음 속성들은 순서 없이 사용할 수 있고 다음과 같이 정의한다.

name=value

이름과 값 모두에 세미콜론, 공백(space), 또는 탭(tab)을 포함하지 않는 문자열을 지정한다. 스크립트를 다룰 준비가 되는 한, 실체가 그 이름이나 값에서URL 인코딩과 같은 인코딩을 요구한다면 사용할 수 있다.

expires=date

이 속성으로 쿠키의 유효 기간이 끝나는 날짜를 설정한다. 날짜의 형식은 표준적인 방법을 따르지 않고 다음과 같이 지정한다.

Wednesday, 01-Sep-96 00:00:00 GMT

이 날짜가 지나면 쿠키의 유효성이 만료하여 웹 브라우저가 더 이상 쿠키를 보내지 않는다. 만료일 표시에는 G M T(Greenwich Mean Time)만 사용된다. 만료일을 지정하지 않으면 쿠키는 현재 세션에서만 사용된다.

path=pathname

path 속성은 쿠키가 유효한 URL의 범위를 제공한다. 예를 들어, 경로명을/ pub라고 설정하면 /pub에 있는 /pub/docs나 /pub/images와 같은 하위 수준의 URL에도 쿠키를 보낸다. ‘/’의 pathname을 나타낸다면 쿠키가 지원하는 사이트의 모든 URL에 쿠키를 사용할 것이라는 뜻이다. path 속성이 없다면 쿠키는 URL에 지원하는 곳에서만 유효하다는 것을 뜻한다.

domain=domain-name

이 속성은 쿠키가 반환되는 범위의 도메인 이름을 지정한 것이다. domain-name에는 적어도 두 개의 점(.)이 포함되어 있어야 한다. 예를 들면,  .naver.com이라는 값은 www.naver.com와 cafe.naver.com, 그리고 기타 다른 naver.com 도메인을 갖는 서버 전체를 포괄한다.

secure

이 속성은 보안이 되는 연결(SHTTP와 SSL을 통한)에서만 쿠키를 반환한다는 것을 뜻한다. 이 속성이 없으면 쿠키는 연결에 상관없이 항상 반환된다.



쿠키 요청 헤더

웹 브라우저는 매번 웹 페이지로 가서 U R L을 위해 저장된 쿠키에 대한 쿠키 파일이있는지 검사한다. 파일이 있으면 웹 브라우저는 요청에 쿠키의‘이름=값’쌍을 포함하는 Cookie 헤더를 포함시킨다.

Cookie: name1=value1;name2=value2;…

쿠키 파일 안에 반환된 쿠키가 여러 개의 항목으로 구성되어 있다면, 경로명 범위와도메인의 범위로 구성한다. 다음 헤더에 같은 사이트에 대해 두 개의 쿠키가 설정되어 있는 예이다.

Set-Cookie: AbcBook=book; path=/

Set-Cookie: AbcBook=Bitems; path=/books

브라우저가 /books 경로에 있는 사이트의 한 페이지를 요청하면, 그것을 반환한다.

Cookie: AbcBook=Bitems; AbcBook=Bitems

양쪽 항목이 같은 이름을 공유하지만, 그것은 별개의 쿠키이며, 양쪽 다 /books 같은 특정한 URL에 적용된다. 쿠키가 반환될 때, 웹 브라우저는 매치 여부를 따져 가장 정확한 경로명이나 도메인을 먼저 반환한다.

Cookie 헤더를 만나면 많은 서버들은 HTTP_COOKIE 환경 변수를 사용하는CGI 프로

그램으로 헤더의 값을 전달한다.

 또한 쿠키들의 개수와 크기에 대한 제약이 있다.

- 클라이언트는 합쳐서 적어도 3 0 0개의 쿠키를 지원할 수 있어야 한다. 서버는 사

용자가 더 이상 저장하는 것을 기대해서는 안 된다.

- 각 쿠키(이름과 값을 조합해서)의 크기는4 K B를 넘어서는 안 된다.

- 각각의 서버 또는 도메인은 최대 2 0개의 쿠키를 지원한다. 이 제약 사항은 각기 지정한 서버 또는 도메인에 적용되므로 www.naver.com에서 20개를 저장할 수 있고 cafe.naver.com에서도 20개가 가능하며, 쿠키들의 이름 전체를 각기 명시 할 수 있다.


하지만 문제는 헤더와 관련된 프록시 서버에서 일어난다. 페이지가 캐시되거나 수정되지 않았을지라도, Set-Cookie와 Cookie 헤더 모두는 프록시를 통해 전파되어야 한다(If-Modified-Since 조건에 따라서). 또한 Set-Cookie 헤더는 프록시에 의해 결코 캐시 되어서는 안 된다.



상태 코드

 위에서 언급한 서버의 응답에서 요청한 상태를 표시하는 세자리 숫자와 상태를 설명하는 짧은 문구를 포함하는 것을 다음과 같이 나눌 수 있다.

코드 범위
 응답의 의미
 
100 ~ 199

200 ~ 299

300 ~ 399

400 ~ 499

500 ~ 599
 정보

클라이언트의 요청이 성공적이다.

다른 동작이 더 필요해 클라이언트의 요청을 리다이렉트 했다.

클라이언트의 요청이 불완전하다.

서버오류
 


100 ~199 정보 응답

100 Continue

요청된 초기 부분은 접수되었고 클라이언트는 계속해서 요청할 수 있다.

101 Switching Protocols

서버는 Upgrade 헤더 필드에 명시된 프로토콜로 교환하기 위한 클라이언트 요청

에 따르고 있다.


200~299 클라이언트 요청의 성공 응답

200-299의 범위에 있는 응답은 클라이언트의 요청이 성공적이었다는 것을 의미한다.

200 OK

클라이언트의요청이성공적이였으며, 서버는요청한데이터를포함하여응답한다.

201 Created

이 상태 코드는 새로운 URI가 만들어질 때마다 사용된다. 결과 코드와 함께 새로

운 데이터가 위치한 곳을 지정하기 위해 Location 헤더가 서버에 의해 주어진다.

202 Accepted

요청은 받아들여 졌지만 즉시 실행되지는 않는다. 트랜잭션에 대한 심층 정보가 서버 응답의 엔티티 몸체에서 주어지기도 한다. 주의할 점은 요청이 정당한 것처럼 보였을 수도 있지만 서버가 요청을 실제로 승인하리라는 보장은 없다는 것이다.

203 Non-Authoritative Information

엔티티 헤더에 있는 정보는 원래 서버가 아니라 로컬이나 다른 서버로부터 온다.

204 No Content

이 코드는 응답할 때 주어지는 헤더이다. 그러나 응답된 실제 내용은 없다는 뜻이다. 이런 응답을 받는 이유는 웹 브라우저가 문서를 보기 위해 갱신을 하지 않았기 때문이다. 이미지맵에서 클라이언트가 이미지의 영역 중 사용하지 않거나 공백인 부분을 클릭했을 때를 처리할 때 유용하다.

205 Reset Content

웹 브라우저가 추가적인 입력을 위해 사용된 트랜잭션을 지우는 것이다. CGI 애플리케이션에서 데이터를 입력받을 때 적합하다.

206 Partial Content

서버가 요청된 크기의 부분 데이터를 반환하고 있다. Range 헤더 지정 요청에 응답하는 데 이용된다. 서버는 반드시 Content-Range 헤더와 응답에 포함된 범위를 지정해야 한다.


300~399 리다이렉션

300~399 범위에 있는 응답 코드는 요청이 수행되지 않았다는 것을 나타내며, 클라이언트는 요청을 성공시키기 위해 다른 행위가 필요하다는 것을 나타낸다.

300 Multiple Choices

요청된 URI는 하나 이상의 리소스를 참조한다. 예를 들면, URI는 여러 개의 언어로 변환된 문서를 참조할 수 있다. 서버에 의해 반환된 엔티티 몸체는 올바른 리소스를선택하는 방법에 대한좀 더 특정한 데이터의 목록을 가지고 있을수 있다.

301 Moved Permanently

요청된 URI는 더 이상 사용되지 않으며 요청에서 지정한 연산은 수행되지 않았다. 요청된 문서를 위한 새로운 위치는 Location 헤더에 명시한다. 앞으로 요청될 모든 문서는 새로운 URI를 사용할 것이다.

302 Found

요청된 URI는 일시적으로 새로운 URI를 가진다. Location 헤더는 새로운 장소를 가리킨다. 만일 이것이 GET이나 HEAD 메소드에 대한 응답이라면 클라이언트는 응답을 받자마자 요청을 해결하기 위해 새로운 URI를 사용해야 한다.

303 See Other

요청된 URI는 다른 URI(Location 헤더에 명시한)에서 찾을 수 있으며, 리소스는 GET 메소드로 구할 수 있다.

304 Not Modified

이것은 If-Modified-Since 헤더에 대한 응답 코드로써 지정한 날짜 이래로 수정되지 않았다. 엔티티 몸체는 보내지 않으며, 클라이언트는 자신의 로컬 사본을 사용해야 한다.

305 Use Proxy

요청된 URI는 Location 헤더에 있는 프록시를 통해서만 접근할 수 있다.

307 Temporary Redirect

요청된 URI가 일시적으로 옮겨졌다. Location 헤더가 새로운 장소를 가리킨다. 이 상태 코드를 받는 즉시, 클라이언트는 요청을 해결하기 위해 새로운 URI를 사용해야 하지만, 앞으로 모든 요청들은 이전의 URI를 사용할 것이다.


400~499 클라이언트 요청의 불안전 응답

400~499 범위에 있는 응답 코드는 클라이언트의 요청이 불안전하며, 클라이언트가 요

청을 성공시키려면 다른 정보가 필요하다는 것을 나타낸다.

400 Bad Request

이 응답 코드는 클라이언트의 요청에 문법적인 오류가 있는 것을 서버가 알아냈다는 것을 의미한다.

401 Unauthorized

이 결과 코드는 WWW-Authenticate 헤더와 함께 그 요청에 적당한 권한이 부족했다는 것을 나타내기 위해 주어지며, 이 URI를 다시 요구하면 클라이언트는 적당한 권한으로 접속해야 한다.

402 Payment Required

이 코드는 아직 HTTP로 구현되지 않았다. 하지만 언젠가는 서버의 문서를 받아 보기 위해 지불이 필요하다는 것을 나타낸다.

403 Forbidden

이 요청은 서버가 클라이언트를 가리키고 싶어하지 않아(또는 아무 이유 없이) 거부되었다.

404 Not Found

지정한 URI에 문서가 존재하지 않는다.

405 Method Not Allowed

이 코드는 Allow 헤더와 함께 클라이언트가 사용한 메소드가 이 URI에 대해 지원되지 않는다는 의미이다.

406 Not Acceptable

클라이언트가 지정한 URI는 존재하지만 클라이언트가 원하는 형식이 아니다. 이 코드와 함께 서버는 Content-Language, Content-Encoding, 그리고 Content-Type 헤더를 제공한다.

407 Proxy Authentication Required

프록시 서버는 요청된 문서를 보여주기 전에 권한을 필요로 한다. Proxy-Authenticate헤더와 함께 사용한다.

408 Request Time-out

이 응답 코드는 클라이언트의 모든 요청이 지정한 시간(일반적으로 서버의 구성할때 명시한다) 동안 처리되지 않았음을 뜻하며, 서버는 네트워크 연결을 끊는다.

409 Conflict

이 코드는 다른 요청이나 서버의 구성과 충돌이 있음을 나타낸다. 충돌에대한 정보는 응답되는 데이터의 일부로 반환된다.

410 Gone

이 코드는 요청된 URI가 더 이상 존재하지 않고, 서버에서 완전히 사라졌음을 나타낸다.

411 Length Required

서버는Content-Length 헤더가 없는 요청을 받아들이지 않는다.

412 Precondition Failed

하나 이상의 If…헤더에 의해 명시된 조건에 의해 요청을 평가하여 false 값을 가지는 경우이다.

413 Request Entity Too Large

서버는 실제 본문이 너무 커서 요청을 처리할 수 없다.

414 Request-URI Too Long

서버는 요청된 URI가 너무 커서 요청을 처리할 수 없다.

415 Unsupported Media Type

서버는 실제 본문이 지원되는 않는 형식이라 처리할 수 없다.

416 Requested Range Not Satisfiable

서버는 목표에 대해 어떤 유효한 값도 포함하지 않은 Range 헤더를 찾아냈다. 추

가로 If-Range 헤더는 없어졌다.

417 Expectation Failed

Expect 헤더에서 명시된 조건은 만족될 수 없다.


500~599서버 오류

500~599 범위에 있는 응답 코드는 서버가 오류를 만나거나, 클라이언트의 요청을 수행할 수 없음을 나타낸다.

500 Internal Server Error

이 코드는 서버의 일부(예를 들면, CGI 프로그램)가 멈추었거나 설정에서 오류가 났음을 나타낸다.

501 Not Implemented

이 코드는 클라이언트의 요청된 행위가 서버에서 수행할 수 없음을 나타낸다.

502 Bad Gateway

이 코드는 서버(또는 프록시)가 다른 서버(또는 프록시)로부터의 응답이 적절하지 않음을 나타낸다.

503 Service Unavailable

이 코드는 서비스를 일시적으로 제공할 수 없으나, 앞으로 복구된다는 의미이다.만일 서버가 복구될 때를 알기 위해서는 Retry-After 헤더도 함께 제공해야 한다.

504 Gateway Time-out

이 응답은 게이트웨이나 프록시의 시간이 경과했다는 것만 빼고는 408(Request Time-out)과 같다.

505 HTTP Version not supported

서버가 요청에 사용된HTTP 프로토콜 버전을 지원하지 않는다.

Http Header 중 Cache Value

캐시 요청 지시문

1. no-cache  캐시 하지 않는다.
2. no-store  신속히 넘긴 후에 정보를 제거한다.
3. max-age = seconds seconds에 지정한 것보다 오래된 응답은 보내지 않는다.
4 max-stale [=seconds]  만료된 데이터를 보낸다. 만약 seconds가 지정되어 있다면 지정한 숫자보다 적은 만료된 데이터를 보낸다.
5. min-fresh = seconds 명시된 seconds의 수 이후의 변경된 새 데이터만 보낸다.
6. only-if-cached 새로운 데이터를 검색하지 않고 캐시에 있는 데이터만 반환한다.


캐시 응답 지시문

1. public  어떠한 캐시라도 캐시할수 있다.
2. private  공유된 캐시는 캐시하지 않는다.
3. no-cache  캐시하지 않는다.
4. no-transform  데이터를 변환하지 않는다.
5. must-revalidate 클라이언트는 데이터를 재확인 해야 한다.
6. proxy-revalidate 개인적인 클라이언트 캐시를 제외하고 데이터를 재확인 해야한다.
7. max-age=seconds 문서는 지정된 seconds만큼만 변화가 없는 상태라고 생각

Cisco사의 UDLD

To be blackholing in your network or not to be that is question.

역시 cisco prorietary 한 protocol입니다. (spanning tree에 관한한 IEEE의 802.1s,802.1w에 관한 규정이 아무래도 시스코를 못따라가는 듯이 보입니다. 하지만 기존의 802.1d보다는 많은 진전이 있었져..)

77a.gif

위의 그림을 보시져..위의 그림에서 스위치 B의 link에 문제가 생겼읍니다. 어떤 문제냐 하면 스위치 B가 frame을 받는 것은 가능한데, 보내는 것이 불능인 상태에 빠졌읍니다.

(어떻게 이런일이 발생하냐고여..광케이블(sx,lx,zx)을 사용하다 보면  이런일을 경험하신 적이 있을 겁니다. )

이 상태라면 어떻게 될까요?  스위치 C는 스위치 B로 부터 BPDU를 받지 못합니다. ( blocking 상태에 있는 non-desinated port라고 할지라도 BPDU는 받을 수 있져..spannint tree에 대한 부분을 참조하세요..)

BPDU를 스위치 C는 스위치 B와 연결된 포트에 받지를 못하므로 max age(20초) 시간이 지난 다음에 listening-learning(30초)단계를 지나서 forwarding state로 가게 됩니다. 여기서 왜 무조건 forwarding state으로 가게 될까요.. 당연히 시간이 지났으므로 forwarding상태로 가는 것입니다. 이유가 없어여..답은 시간지났으니까요가 될겁니다.

자 시간이 지나서 forwarding상태로 간 것은 좋은데 네트워크 상태는 지금 어떨까요 ?

바로 위의 그림과 같이 한쪽방향으로만 looping이 발생하게 됩니다. (blackhole에 빠진거져..)

이런 상황에서는 해결책이 뭐가 있을까요... 다음과 같이 해결하면 됩니다.

1) 한쪽방향으로만 link가 fail시 이를 평상시에 감지를 하여 link 전체를 disable시키는 방법

         -- 이를 UDLD(UniDirectional Link Detection Protocol) 이라 합니다.

 2) 문제는 시간이 지나면 forwarding state으로 무조건 가는데 있읍니다. 이런경우 시간이 지난다고 무조건 forwarding을 할것이 아니라, 무언가 확실해 지기 전까지는 무조건 inconsistent state으로 내비두고 user traffic이 절대로 흐르지 못하게 하는 겁니다 . 무언가 확실해 진다는 말은 이 그림에서는 B switch에서 BPDU가 다시 들어오는게 확인 될때까지 이겠져..

      -- 이를 Loop guard 라고 합니다.

* 아래 그림으로 Loop guard를 다시한번 설명하겠읍니다.

   저 위 그림으로 loop guard가 이해 안가는 것이 있는데 위의 그림 상황에서는 Loop guard가 확실히 이해는 가지만 만약 실재 link가 끊어지는 상황에서 Loop guard가 enble되있으면 어떻게 하냐 라는 상황이 궁금할겁니다. 아마

위 그림을 보시면 Loop Guard가 설정되는 port가 명시되어 있읍니다. 우리가 알고 있는 non-desinated port는 모두 loop Guard를 설정하는 군요.( root port + non-desinated port )

위의 상황에서 A-B 스위치 사이의 Link가 끊어졌읍니다. 그럼 B switch는 어떻게 할까요..자신이 root라고 판단을 하고 C에게 inferior BPDU를 보낼 겁니다. B 스위치의 Loop guard가 설정되어 있는 port는 아마도 link가 실재로 끊어졌으므로 바로 port disable상태로 갈겁니다. 그러므로 B는 loop guard 있어도 되져..^^

자 C는 B switch로 부터 inferior한 BPDU를 받습니다. 뭐 생각나는게 있는데.. 아 Backbone fast가 동작을 하겠져.. backbone fast가 동작이 되면 max-age동안 기다릴 필요 없이 스위치 C는 root query를 스위치 A에게 날리고 응답이 돌아오므로 B switch와 연결된 포트를 바로 inconsistent state상태로 보냅니다. 

Loop guard를 설정해도 backbone fast와 uplinkfast를 같이 사용할 수 있읍니다. 다만 Root guard와 BPDU guard와 같은 경우는 desinated port에 설정을 하므로 같이 사용될 수 없겠져..

UDLD와 Loop guard를 비교해 놓은 표입니다. 주의할 사항은 STP failure일 경우 ( 예를 들어 위의 그림에서 link의 unidirectional 한 문제가 아니라 스위치 소프트웨어나 하드웨어등의 결함으로 BPDU를 보내지 못하는 경우의 black hole을 대비하는데는 Loop guard를 써야 한다는 말입니다.)

miswiring문제와 같은 경우 ( UDLD가 wiring문제에서 출발하져.. )

마지막으로 Loop guard는 per-vlan based하에서 동작하나 UDLD는 per-vlan based가 아니라는 것만 주의깊게 살펴보시면 될것 같습니다.

자 이제 설정예를 보셔야 겠져..

 UDLD의 경우 전역적으로 설정하거나 port별로 설정이 가능합니다.

Vega> (enable) set udld enable
UDLD enabled globally

Vega> (enable) set udld enable 1/2
UDLD enabled on port 1/2

IOS based switch는 해당 명령어를 찾으면 금방 나올겁니다. 아마..

UDLD의 경우도 global하게 설정되거나 port별로 설정이 가능합니다.

set spantree global-default loopguard enable

Nelix> (enable) set spantree guard loop 3/13
Enable loopguard will disable rootguard if it's currently enabled on the port(s).
Do you want to continue (y/n) [n]? y
Loopguard on port 3/13 is enabled.

 이 메세지는 loop guard가 동작하였을때 보여지는 log입니다.

SPANTREE-2-LOOPGUARDBLOCK: No BPDUs were received on port 3/2 in vlan 3. Moved to loop-inconsistent state.

HTTP Profile

Managing Application Layer  HTTP Traffic.

Specifying a realm for basic authentication

The value of the Basic Auth Realm setting is a string that you provide. The BIG-IP system sends this string to a client as part of client authentication.

To configure this setting, locate the Basic Auth Realm setting and type a value.

 

Specifying a fallback host

Another feature that you can configure within an HTTP profile is HTTP redirection. HTTP redirection allows you to redirect HTTP traffic to another protocol identifier, host name, port number, or URI path.

Redirection to a fallback host occurs if all members of the targeted pool are unavailable, or if a selected pool member is unavailable. (The term unavailable refers to a member being disabled, marked as down, or having exceeded its connection limit.) When one or more pool members are unavailable, the BIG-IP system can redirect the HTTP request to the fallback host, with the HTTP reply Status Code 302 Found.

Although HTTP redirection often occurs when the system generates an LB_FAILED iRule event, redirection can also occur without the occurrence of this event, such as when:

The selected node sends an RST after a TCP 3WHS has completed, but before the node has sent at least a full response header.

The BIG-IP system finds the selected node to be unreachable while receiving the body portion of a request or a pipelined request.

When configuring the BIG-IP system to redirect HTTP traffic to a fallback host, you can specify an IP address or a fully-qualified domain name (FQDN). The value that you specify becomes the value of the Location header that the servers sends in the response.

Virtual Server limit도달했을 경우에는 동작하지 않음

 

Specifying fallback error codes

In addition to redirecting traffic when a target server becomes unavailable, you can also specify the HTTP error codes from server responses that should trigger a redirection to the fallback host. Typical error codes to specify in the Fallback Error Codes setting are 500, 501, and 502.

When you type the error codes in the Fallback Error Codes box, you separate the codes with a space, such as 500 501 502. You can also specify a range of error codes, as in this example: 505-515.

 

Inserting headers into HTTP requests

An optional setting in an HTTP profile is HTTP header insertion. The HTTP header being inserted can include a client IP address. Including a client IP address in an HTTP header is useful when a connection goes through a secure network address translation (SNAT) and you need to preserve the original client IP address.

The format of the header insertion that you specify is generally a quoted string. Alternatively, however, you can insert a Tools Command Language (Tcl) expression into a header that dynamically resolves to the desired value. When you assign the configured HTTP profile to a virtual server, the BIG-IP system then inserts the header specified in the profile into any HTTP request that the BIG-IP system sends to a pool or pool member.

To insert a header into an HTTP request, locate the Request Headers Insert setting and type a value.

Request header에 특정항목을 추가하는 기능으로 이미 존재하는 항목의 값은 바꿀 수 없다.

  

Erasing content from HTTP headers

Another optional setting is the Header Erase setting. Using this setting, you can configure a profile to erase the contents of a header from an HTTP request that is being sent from a client to a server. With this feature, you can erase header content from HTTP requests before forwarding the requests over the network. Such headers might contain sensitive information, such as user IDs or telephone numbers, that must be erased before the information is forwarded.

When you use this setting, the BIG-IP system erases the contents of the specified header and replaces that content with blank spaces. The header itself is retained.

Note: This feature does not apply to HTTP responses being sent from a server to a client.

The client header with the contents to be erased must be specified as a quoted string. To erase a header from an HTTP request, locate the Request Headers Erase setting and type a value.

Request header중 특정항목을 제거하는 기능이다.

 

 

Allowing headers in an HTTP response

Using the Configuration utility, you can specify any headers within an HTTP response that you want the BIG-IP system to allow. To do this, type a value in the Response Headers Allowed box. If you are specifying more than one header, separate the headers with a blank space. For example, if you type the string Content-Type Set-Cookie Location, the BIG-IP system then allows the headers Content-Type, Set-Cookie, and Location.

Response Header에 허용할 항목을 정의하는 기능이다. 테스트 결과 Content관련내용이 삭제가 되지 않는다. 이유는 잘 모르겠음.

  

HTTP1.1은 컨텐츠 전송 인코딩 개념을 Content-Encoding Transfer-Encoding으로 2단계 분리했다. 첫번째는 HTTP 메시지에 있는 실체를 변환하기 위해 사용하는 컨텐트 인코딩이다. 두 번째는 안전한 전송을 보장하기 위해 HTTP 메시지 전체를 인코딩하는 전송 인코딩이다. 통신의 효율성을 향상시키기 위해 실체를 압축할 컨텐트 인코딩을 쓴다. 그리고 주로 메시지의 끝을 식별하는 문제를 해결하기 위해 전송 인코딩을 사용한다.

그러나 TCP의 중요한 성질 중 하나는 구조화되지 않은 바이트 스트림으로 모든 데이터를 전송한다는 것이다. TCP 자체는 데이터의 시작과 끝을 구분하는 어떠한 방법도 제공하지 않으며, 이 문제를 어플리케이션에 위임했다. HTTP는 이미 Content-Length 헤더를 가지고 있었기 때문에 TCP의 문제점을 해결할 수 있었다. 그러나 동적 자원이 많은 오늘날의 웹 트래픽에서는 파일의 길이를 전송시에 알 수 없다는 한계에 직면하게 되었다
.

HTTP Chunking
파일의 길이를 알 수 없는 문제를 처리하기 위해 HTTP 개발자들은 Chunking이라는 특별한 전송 인코딩 방법을 개발했다. 청크 기술을 사용할 경우, 실체는 바이트 배열 그대로 전송되는 대신 청크로 나뉜다. 이는 HTTP가 동적으로 생성되는 자원을 소프트웨어에서 데이터를 처리할 때마다 한 번에 한 조각씩 전송하는 것을 가능하게 한다. 이 메소드를 사용했다는 것을 표시하기 위해 Transfer-Encoding: chunked가 메시지 안에 삽입된다. 그리고 청크를 구분하기 위해 HTTP 메시지의 본문에 특수한 형식이 사용된다.
  청크의 길이는 16진수로 지정되며, ASCII 문자를 이용하여 표시된다. 모든 청크 길이와 청크 데이터는 CRLF로 끝난다. 수신자는 길이가 0인 청크를 받으면 마지막 청크를 수신했음을 알게 된다.

 

Configuring chunking

Sometimes, you might want to inspect and/or modify HTTP application data, such as compressing the content of an HTTP response. Such inspections or modifications require that the response be unchunked, that is, not in chunked encoding. Using the Response Chunking settings, the BIG-IP system can unchunk a chunked response before performing an action on that response.

Possible values for this setting are Unchunk, Rechunk, Selective, and Preserve. The default value is Selective.

Table 6.3 describes each of these values and the action that the BIG-IP system takes, depending on whether an original response is chunked or unchunked.

Table 6.3 Chunking behavior of the BIG-IP system

Setting

Original response is chunked

Original response is unchunked

Unchunk

The BIG-IP system unchunks the response and processes the HTTP content, and passes the response on as unchunked. The connection closes when all data is sent to the client as indicated by the Connection: Close header.

The BIG-IP system processes the HTTP content and passes the response on untouched.

Rechunk

The BIG-IP system unchunks the response, processes the HTTP content, re-adds the chunk trailer headers, and then passes the response on as chunked. Any chunk extensions are lost.

The BIG-IP system adds transfer encoding and chunking headers on egress.

Selective

Same as Rechunk.

The BIG-IP system processes the HTTP content and then passes the response on untouched.

Preserve

The BIG-IP system leaves the response chunked, processes the HTTP content, and passes the response on untouched. Note that if HTTP compression is enabled, the BIG-IP system does not compress the response.

The BIG-IP system processes the HTTP content and then passes the response on untouched.

HTTP/1.0 프로토콜의 문제점

HTTP/1.0 프로토콜의 특징은 단순성에 있다. 그래서 연결을 만들고 동작하고 연결을 해제하는 단순한 과정으로 구성되어 있으며, 하나의 URL은 하나의 TCP 연결이 되도록 만들어져 있다. 연결의 설립/동작/해제의 단순 동작이 계속 반복됨으로해서 네트워크의 congestion에 대한 정보를 확보할 수가 없었다. 연결이 계속 지속되어 있다면 정보 축적과 분석을 통해 트래픽의 혼잡을 인식할 수 있는 것이다. 또한 잦은 연결 설립과 동시에 여러 개의 연결을 설립하는 동작을 통해 bandwidth가 낮은 링크에서 congestion 문제의 가능성을 높이고 사용자에게는 불만족스런 성능을 제공해주게 된다. 캐시 모델의 미흡함도 문제이다. 캐싱에 관해 설계한 모델이 초기적인 형태로 구성되었기 때문에 동작상의 오버헤드도 만들고 캐시된 데이타 관리에도 문제를 갖고 있었던 것이다. 이러한 문제들을 해결하고, 추가적인 고려 사항을 반영한 HTTP/1.1 프로토콜을 설계하게 된 것이다.

 

Enabling or disabling OneConnect transformations

This setting enables or disables part of the OneConnectTM feature. When enabled, this setting performs HTTP Connection header transformations on HTTP/1.0 requests, for the purpose of implementing Keep-Alive support for connection persistence. Thus, when a client sends an HTTP/1.0 request with a Connection: Close header, this feature forces the connection to remain open by transforming the header to Connection: Keep-Alive. The default value for this setting is Enabled.

Important: To enable this setting, you must also enable the connection pooling component of the OneConnectTM feature. You enable connection pooling by configuring a OneConnect profile. For more information on connection pooling and configuring a OneConnect profile, see Chapter 5, Understanding Profiles.

For general information on the OneConnectTM feature, see Chapter 1, Introduction to Local Traffic Management.

To enable OneConnect transformations, locate the OneConnect Transformations setting and check the box.

          address translation will be performed on the client IP address.

          클라이언트의 IP를 바꾸어 해당 기능을 수행하므로 web application에서 IP를 이용하여 기능구현을 하였을 경우 문제가 될 수 있음.

          web server must support HTTP Keep-Alive connections.

          해당기능을 사용할 경우 Mirror기능을 사용하지 않는다.

빅아이피는 Full proxy로 동작하므로 Client의 연결과 Server의 연결이 독립적이어서 클라이언트와의 연결만 끊고 서버와의 연결을 끊지 않아 재사용한다.

The following OneConnect profile settings control OneConnect behavior and affect server-side connections:

The Source Mask setting specifies the mask applied to the source IP address to determine the connection's eligibility to reuse a server-side connection. For more information, refer to SOL5911: Managing connection reuse using OneConnect source mask.

The Maximum Size setting represents the maximum number of idle server-side connections kept in the connection pool.

The Maximum Age setting represents the maximum number of seconds a server-side connection is allowed before the connection is deleted from the connection pool.

The Maximum Reuse setting represents the maximum number of requests to be sent over a server-side connection. This number should be slightly lower than the maximum number of HTTP Keep-Alive requests accepted by backend servers in order to prevent the backend server from initiating connection close and entering the TIME_WAIT state.

The Idle Timeout Override setting represents the maximum time idle server-side connections will be kept open. Lowering this value may result in a lower number of idle server-side connections, but may increase request latency and server-side connection rate.

 

Rewriting an HTTP redirection

Sometimes, a client request is redirected from the HTTPS protocol to the HTTP protocol, which is a non-secure channel. If you want to ensure that the request remains on a secure channel, you can cause that redirection to be rewritten so that it is redirected back to the HTTPS protocol.

Note that the rewriting of any redirection takes place only in the HTTP Location header of the redirection response, and not in any content of the redirection.

To enable the BIG-IP system to rewrite HTTP redirections, you simply specify, through the Configuration utility, the way that you want the system to handle URIs during the rewrite. Once enabled, this feature rewrites the protocol name port number

Possible values for this setting are Matching, All, Nodes, or None.

 

Selecting URIs to rewrite

When configuring the BIG-IP system to rewrite HTTP redirections, you specify whether the system should rewrite only those URIs matching the URI originally requested by the client (minus an optional trailing slash), or whether the system should rewrite all URIs. In the latter case, the system always rewrites redirected-to URIs, and rewrites those URIs as if they matched the originally-requested URIs.

If the URI contains a node IP address instead of a host name, you can configure the BIG-IP system to change that IP address to the virtual server address.

Table 6.4 shows examples of how redirections of client requests are transformed when the BIG-IP system is listening on port 443, and the Rewrite Redirections setting is enabled.

Table 6.4 Examples of rewriting HTTP redirections with the system listening on port 443

Original Redirection

Rewrite of Redirection

http://www.myweb.com/myapp/

https://www.myweb.com/myapp/

http://www.myweb.com:8080/myapp/

https://www.myweb.com/myapp/

Table 6.5 shows examples of how redirections of client requests are transformed when the system is listening on port 4443, and the rewrite feature is enabled.

Table 6.5 Examples of rewriting HTTP redirections with the system listening on port 4443

Original Redirection

Rewrite of Redirection

http://www.myweb.com/myapp/

https://www.myweb.com:4443/myapp/

http://www.myweb.com:8080/myapp/

https://www.myweb.com:4443/myapp/

 

Rewriting the protocol name

When configured to rewrite HTTP redirections, the BIG-IP system rewrites the HTTP protocol name to HTTPS. For example, a client might send a request to https://www.sample.com/bar and be initially redirected to http://www.sample.com/bar/, which is a non-secure channel. If you want the client request to remain on a secure channel, you can configure the BIG-IP system to rewrite the redirected URI to go to https://www.sample.com/bar/ instead. (Note the addition of the trailing slash.)

 

Encrypting and decrypting cookies

You can use the Configuration utility to encrypt one or more cookies that the BIG-IP system sends to a client system. When the client sends the encrypted cookie back to the BIG-IP system, the system decrypts the cookie.

To encrypt a cookie, use the Encrypt Cookie setting to specify the name of the cookie that you want to the BIG-IP system to encrypt. If you want to specify more than one cookie, simply separate the cookie names with a space.

After specifying one or more cookie names, use the Cookie Encryption Passphrase and the Confirm Cookie Encryption Passphrase boxes to type a passphrase for the cookie.

 

Specifying the maximum header size

With the Maximum Header Size setting, you can specify the maximum size that the BIG-IP system allows for HTTP headers. The default value is 32768 and is represented in bytes.

 

Enabling support for pipelining

Normally, a client cannot make a request until the previous request has received a response. HTTP/1.1 pipelining allows clients to make requests even when prior requests have not received a response. For this to succeed, however, destination servers must include support for pipelining. This feature enables that support on the BIG-IP system.

To enable pipelining, locate the Pipelining setting and check the box. By default, this feature is set to Enabled.

 

 

일반적으로 HTTP request들은 연속적으로 발생하며, 순서적으로 다음 request는 항상 이전 request에 대한 response가 완전히 'received' 되고 나서 issue 되어 서버로 전달된다. 이것은 종종 bandwidth의 제약이나 network latencies 문제들로 인하여, 서버상에서 '심각한' 지연 현상을 일으키는 것을 관찰 할 수 있다.

HTTP/1.1은 다수의 HTTP request들이 1개의 socket에 함께 write 되고 (response를 기다리지 않는다.) browser는 전달된 request들에 대한 response '순차적'으로 기다리는 메커니즘을 제공한다. 이것은 사실상 '서버' mechanism이 아니라 클라이언트의 mechanism에 의존하는 경향이 강하며, (대게의 경우 server TCP multiplexing을 통해 다수의 request '' socket에서 받아들일 준비가 되어 있다.) 이를 통해 network latency delay를 현명하게 줄일 수 있다. 이러한 기법을 HTTP/1.1에서 우리는'파이프라이닝(Pipelining)' 이라고 부른다.

Pipelining TCP/IP packet 수를 상당히 줄일 수 있다. typical MSS(Maximum Segment Size)는 보통 536 에서 1460 byte까지 가능한데, 몇 개의 HTTP request들을 하나의 TCP/IP packet으로 packing하는 것이 Pipelining을 통해 가능해진다. 하나의 페이지를 load 하는 데에 필요한 packet의 갯수를 줄임으로써, 전체 인터넷상의 bandwidth가 절약된다는 잇점이 바로 또하나의 piplining의 장점이 될 수 있는 것이다.

HTTP/1.1은 서버가 또한 pipelining을 지원하도록 요구하고 있다. 그러나 이것이 서버가 response pipeline 할 수 있어야 한다는 것을 의미하지는 않으며, 다만 서버들은 client request pipelining 했을 때 그 request를 성공적으로 읽어들일 수 있어야 한다는 것을 의미한다.

2) When should we pipeline requests?

Pipelining은 모든 METHOD에 적용될 수 있는 것은 아니다. idempotent METHOD , GET/HEAD 요청만이 Pipeline 화 될 수 있으며, POST PUT과 같은 방식에는 적용될 수 없다. 우리는 또한 '첫번째 request' pipeline 속에 넣을 수 없으며, Pipelining은 단지 존재하는 'KEEP-ALIVE' connection을 재사용할 수 있을 뿐이다.

3) How many requests should be pipelined?

많은 수의 request pipelining하는 것은 만약에 connection prematurely하게 close 되었다면 그 cost가 높을 수 있는데, 이는 우리는 보통 request network으로 'write' 하는데 wasted time을 가질 뿐만 아니라, 새로운 connection 상에서 이것들을 반복해야만 하기 때문이다. 게다가, longer pipe-line은 실제로 유저가 '인식할 수 있을' 만한 delay를 유발하며, 이전 request들이 실제 사용자 클라이언트 상에서 complete 되는데 꽤 시간이 걸릴 수 있다. HTTP/1.1은 따라서, 얼마나 '많은'수의 request piplelining하라는 권고를 하지는 않는다. 다만, 이것은 application에서 책임을 지는 부분이며, 일반적으로 서버 당 2개 이상의 keep-alive connection을 쓰지 않기를 권고한다. 하지만 이 부분도 application에 상당히 의존적이며, web browser의 경우 그것은 '장시간' 동안 pipeline을 위해 시간을 낭비하지 않도록 구성되어있다. 아마도 2개의 keep-alive 세션은 적절한 value 이나, 이것은 사용자 application에 따라 test 되어져야 한다.

4) What happens if a request is canceled?

만일 request가 취소된다면, 전체 pipeline이 취소되는 것인가? 혹은 cancel request simple 하게 버려지는 것일까? (response 상에서) Navie하게 접근해보면, pipeline cancel 되어지며, pipeline은 다시 모든 request를 재 issue하게 될 것이다.

5) What happens if a connection fails?

만일 connection fail 되거나 서버에 의해 특정 부분이 download되는 과정에서 '삭제' 된다면, web browser는 아마도 lost request '재시작' 할 것이다. 이 경우, cancel과 동일하게 동작될 수 있다.

 

Inserting an XForwarded For header

When using connection pooling, which allows clients to make use of existing server-side connections, you can insert the XForwarded For header into a request. When you configure the BIG-IP system to insert this header, the target server can identify the request as coming from a client other than the client that initiated the connection. The default setting is Disabled.

 

Configuring the maximum columns for linear white space

The LWS Maximum Columns setting specifies the maximum number of columns allowed for a header that is inserted into an HTTP request.

To configure the LWS Maximum Columns setting, specify a maximum value. The default value for this setting is 80.

 

Configuring a linear white space separator

The LWS Separator setting specifies the separator that the BIG-IP system should use between HTTP headers when a header exceeds the maximum width specified by the LWS Maximum Columns setting.

To configure the LWS Separator setting, specify a value for the separator. This setting has no default value.

 

Specifying a maximum number of requests

The Maximum Requests setting specifies the maximum number of requests that the system allows for a single Keep-Alive connection. When the specified limit is reached, the final response contains a Connection: close header is followed by the closing of the connection. The default setting is 0, which in this case means that the system allows an infinite number of requests per Keep-Alive connection.