본문 바로가기

HTTP 정리

1부 4장 - 커넥션 관리 - 2

4.4 병렬 커넥션


HTTP는 클라이언트가 여러 개의 커넥션을 맺음으로써 여러 개의 HTTP 트랜잭션을 병렬로 처리할 수 있게 함.



4.4.1 병렬 커넥션은 페이지를 더 빠르게 내려 받는다.


단일 커넥션의 대역폭 제한과 커넥션이 동작하지 않고 있는 시간을 활용하면, 객체가 여러 개 있는 웹 페이지를 더 빠르게 내려받을 수 있다.


각 커넥션의 지연 시간을 겹치게 하면 총 지연 시간을 줄일 수 있고, 클라이언트의 인터넷 대역폭을 한 개의 커넥션이 다 써버리는 것이 아니라면 나머지 객체를 내려받는 데 남은 대역폭을 사용할 수 있다.

(그림 p103 참조)


4.4.2 병렬 커넥션이 항상 더 빠르지는 않다.


클라이언트의 네트워크 대역폭이 좁을 때는 대부분 시간을 데이터를 전송하는 데만 사용함. 이 제한된 대역폭 내에서 각 객체를 전송 받는 것은 느리기 때문에 성능 상의 장점은 거의 없어진다.


다수의 커넥션은 메모리를 많이 소비하고 자체적인 성능 문제를 발생 시킴.


브라우저는 실제로 병렬 커넥션을 사용하긴 하지만 대부분 6~8개를 허용한다.


서버는 특정 클라이언트로부터 과도한 수의 커넥션이 맺어졌을 경우, 그것을 임의로 끊어버릴 수 있다.


4.4.3 병렬 커넥션은 더 빠르게 느껴질 수 있다.


병렬 커넥션이 실제로 페이지를 더 빠르게 내려받는 것은 아니지만, 화면에 여러 개의 객체가 동시에 보이면서 내려받고 있는 상황을 볼 수 있기 때문에 사용자는 더 빠르게 내려받고 있는 것 처럼 느낄 수 있다.



4.5 지속 커넥션


삿이트 지역성 (site locality): 웹 클라이언트는 보통 같은 사이트에 여러 개의 커넥션을 맺음. 따라서 서버에 HTTP 요청을 하기 시작한 애플리케이션은 웹 페이지 내의 이미지 등을 가져오기 위해서 그 서버에 또 요청하는 것을 말함.


지속 커넥션


- HTTP / 1.1 을 지원하는 기기는 처리가 완료된 후에도 TCP 커넥션을 유지하여 앞으로 있을 HTTP 요청에 재사용할 수 있음.

- 처리가 완료된 후에도 계속 연결된 상태로 있는 TCP 커넥션을 말함.


클라이언트나 서버가 커넥션을 끊기 전 까지는 트랜잭션 간에도 커넥션을 유지함.


이미 맺어져 있는 커넥션은 TCP의 느린시작으로 인한 지연을 피함으로써 더 빠르게 데이터 전송 가능.



4.5.1 지속 커넥션 vs 병렬 커넥션


지속 커넥션의 장점


- 커넥션을 맺기 위한 사전 작업과 지연을 감소시킴

- 튜닝된 커넥션 유지

- 커넥션의 수를 줄여줌


단점 (잘못 관리할 경우)


- 계속 연결된 상태로 있는 수 많은 커넥션이 쌓임 => 로컬의 리소스, 원격의 클라이언트와 서버의 리소스에 불필요한 소모를 발생시킴.


지속 커넥션은 병렬 커넥션과 함께 사용될 때 가장 효과적임.


4.5.2 HTTP / 1.0의 Keep-Alive 커넥션


많은 HTTP / 1.0의 브라우저와 서버들은 일찍부터 Keep-alive 커넥션이라는 지속 커넥션을 지원하기 위해 확장됨.


현재 많은 클라이언트와 서버는 초기 keep-alive 커넥션을 사용하고, 설계상의 문제는 HTTP / 1.1 에서 수정됨.


4.5.3 Keep-Alive 동작


keep-alive는 HTTP / 1.1 명세에서는 빠짐. 그러나 아직 널리 사용하고 있어서 HTTP 애플리케이션은 그것을 처리할 수 있게 해야함.


HTTP / 1.0 Keep-alive 커넥션을 구현한 클라이언트는 커넥션을 유지하기 위해서 요청에 Connection: Keep-alive 헤더를 포함시킨다. 요청을 받은 서버는 그 다음 요청도 이 커넥션을 통해 받고자 한다면, 응답 메시지에 같은 헤더를 포함시켜 응답한다.


4.5.4 Keep-Alive 옵션


Keep-Alive 헤더는 커넥션을 유지하기를 바라는 요청일 뿐, 요청을 받았다고 해서 무조건 그것을 따를 필요는 없다.


timeout 파라미터: 커넥션이 얼마나 유지될 것인지를 의미

max 파라미터: 커넥션이 몇 개의 HTTP 트랜잭션을 처리할 때까지 유지될 것인지를 의미.


Keep-Alive 헤더는 option 이지만, Connection: Keep-Alive 헤더가 있을때만 사용 가능하다.


ex ) Connection: Keep-Alive

Keep-Alive: max=5, timeout = 120


위 예는 서버가 약 5개의 추가 트랜잭션이 처리될 동안 커넥션을 유지하거나, 2분 동안 커넥션을 유지하라는 내용이다.


4.5.5 Keep-Alive 커넥션 제한과 규칙


keep-alive는 HTTP / 1.0 에서 기본으로 사용되지 않음. 사용하려면 Connection: Keep-Alive 요청 헤더를 보내야 함.


커넥션이 끊어지기 전에 엔터티 본문의 길이를 알 수 있어야 커넥션을 유지할 수 있다. 즉, 엔터티 본문이 정확한 Content-Length 값과 함께 멀티 파트 미디어 형식을 가지거나 청크 전송 인코딩으로 인코드 되어야 함을 뜻한다. 


프락시와 게이트웨이는 Connection 헤더의 규칙을 철저히 지켜야 한다. 프락시와 게이트웨이는 메시지를 전달하거나 캐시에 넣기 전에 Connection 헤더를 제거해야 한다.


정석대로라면, Keep-alive 커넥션은 Connection 헤더를 인식하지 못하는 프락시 서버와는 맺어지면 안된다.



'HTTP 정리' 카테고리의 다른 글

1부 4장 - 커넥션 관리 - 1  (0) 2019.01.12
1부 3장 - HTTP 메시지  (0) 2019.01.01
1부 2장 - URL과 리소스  (0) 2018.12.25
1부 1장 - HTTP 개관  (0) 2018.12.16