● 전 세계 모든 HTTP 통신은, 컴퓨터와 네트워크 장비에서 널리 쓰이는
네트워크 프로토콜 집합인 TCP/IP를 통해 이루어진다
● TCP/IP 커넥션이 맺어지면 -> 메세지들의 손실, 손상이 없음을 보장한다
TCP는 IP패킷(IP 데이터그램) 이라고 불리는 작은 조각을 통해 데이터를 전송한다.
● HTTP는 IP,TCP,HTTP로 구성된 프로토콜 스택의 최상위 계층이다.
● HTTP에 보안기능을 더한 HTTPS는 TLS,SSL 이라고도 불리며 HTTP와
TCP사이에 있는 암호화 계층이다.
● TCP는 세그먼트 단위로 IP패킷으로 불리는 봉투에 담아 인터넷을 통해 데이터를 전달한다
PC는 여러개의 TCP 커넥션을 항상 가지고 있음 -> TCP 는 포트번호를 통해 여러개의 커넥션을 유지한다
ex) IP 주소 -> '회사 번호' , 포트번호 -> '회사 내선 번호'
● HTTP는 클라이언트와 서버 사이에 프락시 서버, 캐시 서버 등과 같은
중개 서버가 놓이는것을 허락한다
● 현재 맺고 있는 Connection 에 대한 정보 -> HTTP connection 헤더 필드
● Connection 헤더
커넥션 토큰이 HTTP 헤더 필드명을 가지고 있으면 ? -> 현재 커넥션 만을 위한 정보 -> 다음 커넥션에 전달하면 안됨
따라서, Connection 헤더에 있는 모든 헤더 필드는 메세지를 다른 곳으로 전달하는 시점에 삭제되어야 한다.
트랜잭션? -> 더이상 쪼갤수 없는 작업의 단위 , HTTP 트랜잭션은 응답과 요청으로 이루어져 있다.
● 커넥션 관리가 제대로 이루어 지지않으면 TCP 성능이 매우 안좋아 진다.
● 3개의 이미지가 있는 웹페이지가 있다면 네개의 HTTP 트랜잭션을 만들어야 함
● 1개는 해당 HTML을 받기 위해, 나머지 세개는 첨부된 이미지를 받기위해..
● 사용자는 보통 여러개의 이미지가 동시에 로드되는것을 더 좋아한다.
● 여러개의 커넥션을 맺어 HTTP 트랜잭션을 병렬로 처리한다
● 병렬 커넥션은 페이지를 더 빠르게 내려받는다 -> HTML 페이지를 먼저 내려받고
남은 세개의 트랜잭션이 각각 별도의 커넥션에서 처리
● 그렇다고 병렬 커넥션이 항상 빠른것은 아니다 -> 네트워크 대역폭이 좁을때
대부분 시간을 데이터 전송에만 쓰일것이다.
● 항상 빠른것은 아니지만 사용자 입장에서 더 빠르게 느껴질수는 있다.
● 병렬 커넥션은 트랜잭션마다 새로운 커넥션을 맺고 끊기 때문에 시간과 대역폭이 소모된다.
● 병렬 커넥션의 수에는 제한이 있다.
● 지속 커넥션은 처리가 완료된 이후에도 TCP 커넥션을 유지한다
● 지속 커넥션의 장점 ?
1. 커넥션을 맺기위한 사전 작업과 지연을 줄여준다.
2. 튜닝된 커넥션을 유지하며 커넥션의 수를 줄여준다.
Best : 지속 커넥션은 병렬 커넥션과 함께 사용될때 가장 효과적이다.
● keep-alive 커넥션은 지속커넥션을 지원하기위해 사용한다
● HTTP/1.0 Keep-alive 커넥션을 구현한 클라이언트는 커넥션을 유지하기 위해
Connection: Keep -Alive 헤더를 포함시킨다.
● Keep-alive는 커넥션을 유지하기를 바라는 요청일 뿐이다. 무조건, 그것을 따를 필요는 없다.
● Keep-alive는 기본으로 사용되지는 않는다. 계속 사용하기 위해
Connection:keep-alive 요청 헤더를 보내야 한다.
● Connection:keep-alive 헤더가 없다면 서버가 응답후에 커넥션을 끊을것이다.
● 웹 클라이언트의 요청에 Connection: keep-alive가 있으면 TCP 커넥션을 끊지 않고
계속 유지하려고 한다.
● 다만 프락시는 Connection 헤더를 이해하지 못해 해당 헤더를 삭제하지 않고
요청 그대로 다음 프락시에 전달한다
이로 인해 잘못된 통신이 발생한다. 따라서 프락시는 Connection 헤더와 Connection 헤더에 명시된 헤더들은 전달하면 안된다.
● HTTP 1.1 에서는 Keep-alive 커넥션을 지원하지 않는 대신에 더 개선된
지속 커넥션을 지원한다
● HTTP 1.1 클라이언트는 응답에 Connection:close 헤더가 없으면 응답 후에도
HTTP 1.1 커넥션을 유지하는 것으로 간주한다
클라이언트가 Connection:close 헤더를 포함해 보냈으면 그 커넥션으로 추가적인 요청이 불가능하다.
커넥션에 있는 모든 메세지가 자신의 길이 정보를 정확히 가지고 있어야 한다.
HTTP 1.1 프락시는 클라이언트와 서버 각각에 대해 별도의 커넥션 지속 커넥션을 가지고 있어야 한다