기록하는 습관

[북스터디] HTTP 완벽 가이드 4장 본문

스터디/HTTP 완벽 가이드

[북스터디] HTTP 완벽 가이드 4장

로그뉴 2021. 5. 28. 13:48

HTTP 완벽 가이드 4 

  

HTTP 커넥션 관리 

  • HTTP는 어떻게 TCP 커넥션을 사용하는가 
  • TCP 커넥션의 지연, 병목, 막힘 
  • 병렬 커넥션, keep-alive 커넥션, 커넥션 파이프라인을 활용한 HTTP의 최적화 
  • 커넥션 관리를 위해 따라야 할 규칙들 

4.1 TCP 커넥션

HTTP 프로토콜은 비연결성이 특징이다. 이런 특징을 보완하기 위해 TCP를 선행하여 사용한다. 

 

[그림1] 웹브라우저가 TCP 커넥션을 통해 웹 서버에 요청을 보냄.  

 

 

4.1.1 신뢰할  있는 데이터 전송 통로인 TCP 

HTTP 커넥션은 몇가지 사용 규칙이 추가된 TCP 커넥션이다.  TCP는 HTTP에게 신뢰할 만한 통신 방식을 제공한다. 

 

4.1.2 TCP 스트림은 세그먼트로 나뉘어 IP 패킷을 통해 전송된다. 

TCP는 IP 패킷(또는 IP 데이터그램)이라고 불리는 데이터 조각을 통해 데이터를 전송한다. 

HTTP는 IP, TCP, HTTP로 구성된 프로토콜 스택에서 최상위 계층이다. 

HTTPS는 HTTP에 보안 기능을 더한 프로토콜로, TLS, SSL로 불린다. 

 

TCP는 세그먼트라는 단위로 데이터 스트림을 잘게 나누고, 세그먼트를 IP 패킷이라고 불리는 봉투에 담아 전송한다. 

 4.1.3 TCP 커넥션 유지하기 

컴퓨터는 TCP 커넥션을 여러 개 가지고 있다. TCP는 포트 번호를 통해 여러 개의 커넥션을 유지한다. 

TCP 커넥션은 아래와 같이  가지 값으로 식별한다. 

 

<발신지 IP주소, 발신지 포트, 수신지 IP주소, 수신지 포트> 

 

서로 다른 두 개의 TCP 커넥션은 4가지 주소 구성요소의 값이 모두 같을 수 없다. (일부는 같을 수 있다.) 

1. AB / C, D는 같은 목적지 IP 주소를 가리킨다. 

2. C, D는 같은 목적지 포트(80)을 가리킨다. 

3. BC는 같은 발신지 IP 주소를 가리킨다.  

 

 

4.1.4 TCP 소켓 프로그래밍 

 

운영체제는 TCP 커넥션의 생성과 관련된 여러 기능을 제공한다. 소켓 API를 사용하면 TCP 종단 데이터 구조를 생성하고, 원격 서버의 TCP 종단에 그 종단 데이터 구조를 연결하여 데이터 스트림을 읽고 쓸 수 있다. 

 

4.3 HTTP 커넥션 관리 

 

4.3.1 흔히 잘못 이해하는 Connection 헤더 

 

Connection 헤더에는 3가지 종류의 토큰이 전달될 수 있다. 

  • HTTP 헤더 필드 명은, 이 커넥션에만 해당되는 헤더들을 나열한다. 
  • 임시적인 토큰 값은, 커넥션에 대한 비표준 옵션을 의미한다. 
  • Close 값은, 커넥션이 작업이 완료되면 종료되어야 함을 의미한다. 

 

커넥션 토큰이 HTTP 헤더 필드 명을 가지고 있으면, 해당 필드들은 현재 커넥션만을 위한 정보이므로 다음 커넥션에 전달하면 안된다. Connection 헤더에 있는 모든 헤더 필드는 메시지를 다른 곳으로 전달하는 시점에 삭제되어야 한다. 

 

4.4 병렬 커넥션   

 

 

특징 

  1. 병렬 커넥션은 페이지를 더 빠르게 내려받는다. 
  2. 병렬 커넥션이 항상 더 빠르지는 않다. 
  3. 네트워크 대역폭이 좁을 때 
  4. 병렬 커넥션은 더 빠르게 ‘느껴질 수’ 있다. 
  5. 화면에서 사진 일부가 동시에 내려받고 있는 모습을 보여준다면.. 

 

4.5 지속 커넥션 

처리가 완료된 후에도 계속 연결된 상태로 있는 TCP 커넥션이다. 

 

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

 

병렬 커넥션 단점 

  1. 각 트랜잭션마다 새로운 커넥션을 맺고 끊기 때문에 시간과 대역폭이 소요된다. 
  2. 각각의 새로운 커넥션은 TCP 느린 시작 때문에 성능이 떨어진다.
  3. 실제로 연결할 수 있는 병렬 커넥션의 수에는 제한이 있다. 

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

 

Head of line Blocking 

네트워크에서 같은 큐에 있는 패킷이 첫번째 패킷에 의해 지연될 때 발생하는 성능 저하 현상. 

 

HTTP 1.1에서 Persistent + Pipelining을 통해 다음과 같은 통신이 가능해졌다. 

 

 

3개의 요청을  번에 보내면 왕복 시간(Round-Trip time)을 줄일 수 있어 응답 지연(Latency)에 매우 좋은 효과가 있다.  

 

하지만, 만약 첫 번째 요청의 처리가 서버에서 오래 걸린다면? 두 번째, 세 번재 응답 지연도 같이 지연된다. 이것이 HOL 블로킹 개념. 

 

  • 궁금증? 
    • 꼭 순서대로 응답을 줘야만 하나, 먼저 처리된 것은 먼저 응답을 주면 안되나? 
    • HTTP 프로토콜의 규칙상 안되기 때문이다.   A client that supports persistent connections MAY "pipeline" its requests (i.e., send multiple requests without waiting for each response). A server MUST send its responses to those requests in the same order that the requests were received. 이를 해결하기 위해 HTTP/2에서 멀티플렉싱 도입. 

 

 

 

 

이를 해결하기 위해 HTTP/2에서 멀티플렉싱 도입. 

 

** 멀티플렉싱 

하나의 전송로를 통해 여러 개의 신호를 동시에 전달할 수 있도록 하는 기술 

 

 

 

Comments