2.2 웹과 HTTP(1)
2.2.1 HTTP 개요
- 웹의 애플리케이션 계층 프로토콜인 HTTP(HyperText Transfer Protocol)는 웹의 중심이다.
- 웹 페이지(Web page, 문서)는 객체(object)들로 구성된다.
- 객체(object)는 단순히 단일 URL로 지정할 수 있는 하나의 파일(HTML 파일, JPEG 이미지, 자바스크립트, CCS 스타일 시트 파일, 비디오 클립 등)이다.
- 대부분의 웹 페이지는 기본 HTML 파일과 여러 참조 객체로 구성된다.
- 각 URL은 2개의 요소를 갖고 있다.
- 객체를 갖고 있는 서버의 호스트 이름
- 객체의 경로 이름
- 웹 브라우저(Web browser)는 HTTP의 클라이언트 측을 구현하기 떄문에 웹의 관점에서 클라이언트와 브라우저는 혼용된다.
- HTTP는 TCP를 전송 프로토콜로 사용한다.
- 과정
- HTTP 클라이언트가 먼저 서버에 TCP 연결을 시작
- 브라우저와 서버 프로세스는 각자의 소켓 인터페이스를 통해 TCP로 접속.
- 소켓 인터페이스는 각 프로세스와 TCP 연결 사이에서의 출입구다.
- 서버와 클라이언트는 메시지를 소켓 인터페이스에게 보낸다.
- 이후 부터는 TCP의 몫이다.
- HTTP는 비상태 프로토콜(stateless protocol)이다. 클라이언트에 대한 정보를 유지하지 않기 떄문이다.
2.2.2 비지속 연결과 지속 연결
- 클라이언트-서버 상호작용이 TCP상에서 발생할 때, 각 요구/응답 쌍이
- 분리된 TCP 연결을 통해 보내지면 비지속 연결(non-persistent connection)
- 모든 요구와 해당하는 응답들이 같은 TCP 연결상으로 보내지면 지속 연결(persistent connection)
- HTTP/1.0가 디폴트 모드로 지속 연결을 사용하지만 HTTP 클라이언트와 서버는 비지속연결을 사용하도록 설정될 수 있다.
비지속 연결 HTTP
- 클라이언트가 서버에게 URL을 통해 html 파일을 요청한다고 가정해보자. HTML 파일은 여러 개의 참조 객체 이미지를 가진다.
- HTTP 클라이언트는 HTTP 기본 포트 번호 80을 통해 서버로 TCP 연결을 시도한다. 그 결과 클라이언트와 서버는 각각 소켓을 가진다.
- 클라이언트가 자신의 소켓을 통해 HTTP 요청 메시지를 보낸다. 이 요청에는 필요한 html의 경로 이름을 포함한다.
- 서버는 소켓으로 요청 메시지를 받고 필요한 html 객체를 추출한다. 응답 메시지에 객체를 캡슐화하고 소켓을 통해 클라이언트로 보낸다.
- HTTP 서버는 TCP에게 TCP 연결을 끊으라고 한다(하지만 실제로는 클라이언트가 응답을 올바로 받을 때까지 끊지 않는다).
- 클라이언트가 응답 메시지를 받으면 TCP 연결이 중단된다. 필요한 참조 객체(이미지) 10개를 가져오기 위해 각각의 객체에 대한 TCP 연결이 시작된다(1~4 반복).
- 비지속 연결에선 총 11개의 TCP 연결이 발생한다.
- 순차적으로 하지 않고 동시 연결(동시에 11개의 연결을 구성하여 각각 처리)로 응답 시간을 줄일 수 있다.
- 세 방향 핸드셰이크(three-way handshake)
- SYN(Synchronize) : 클라이언트가 서버에 연결을 요청하는 메시지를 보냄
- SYN-ACK(Synchronize-Acknowledment) : 서버가 클라이언트의 연결 요청을 수락하고, 클라이언테에게 확인 응답을 보냄
- ACK(Acknowledgment) : 클라이언트가 서버의 확인 응답을 받고, 다시 서버에 확인 메시지를 보내 연결을 완료한다.
- RTT(round-trip time) : 패킷이 클라이언트로부터 서버까지 가고, 다시 클라이언트로 돌아오는 데 걸리는 시간
- 세 방향 핸드셰이크 중 2단계가 완료될때 까지의 시간이 RTT다.
- ACK는 2단계가 완료된 후 요청 메시지를 보낼 때 같이 보낸다.
- 서버에 요청을 보낼 떄는 (TCP 연결 + 요청)이 필요하다.
- 따라서 서버의 응답시간은 (2RTT + 파일 전송 시간)이다.
지속 연결 HTTP
- 비지속 연결의 단점
- 각 요청 객체에 대한 새로운 연결이 설정되고 유지되어야 함. 이를 위해 필요한 TCP 버퍼는 서버에게 부담이 될 수 있음.
- 응답시간 (2 RTT)
- 지속 연결은 하나의 지속 TCP 연결로 여러 웹페이지와 관련 객체를 통신할 수 있다.
- 파이프라이닝(pipelining) : 각 객체에 대한 요구는 진행 중인 요구에 대한 응답을 기다리지 않고 연속해서 만들어질 수 있음.
- HTTP 서버는 타임아웃 기간동안 사용되지 않으면 연결을 닫기 떄문에, HTTP 디폴트 모드는 파이프라이닝을 이용해 지속 연결한다.