[Computer Network] WEB, HTTP
HTTP
HyperText Transfer Protocol
는 웹의 응용계층 프로토콜이며, 웹의 핵심이다.RFC1945, RFC2616
에 정의되어있다.- 웹에서 브라우저와 웹서버에 구현되어있다.
- 브라우저와 서버는 HTTP message를 교환해 통신한다.
- HTTP는 message의 구조와 client와 server가 어떻게 이 message를 어떻게 교환하는지에 대해 정의한다.
Web용어
웹페이지와 객체
Web page
: document라고도 불리는데, 이는 객체(object)로 구성된다.object
: HTML 파일, JPEG 이미지, Java applet, 비디오 클립 등단일 URL에 주소로 표현 가능한
것들을 의미.- 대부분의 웹페이지는
base HTML file꽈 참조하는 객체들로 이루어져있다.
- 만약, 웹페이지가 1개의 HTML text(base HTML file)와 5개의 JPEG 이미지를 가지고있다면, 해당 웹페이지는 6개의 객체를 가지고 있는 것이다.
- base HTML 파일은 다른 객체를
주소를 통해 참조
한다. - 따라서, URL은
1. server의 hostname
과2. 객체의 경로
를 가지게된다. - 가령,
http://info.cern.ch/picture.jpeg
이라는 주소가 있다면,http://info.cern.ch/
은 hostname,/picture.jpeg
은 객체의 경로이다.
- 대부분의 웹페이지는
Web browser
: client측의 HTTP를 구현한다.Web server
: URL로 주소화가 가능한 객체를 담는 서버측의 HTTP를 구현한다.
HTTP
-
- 사용자가 HTTP request Message를 보내면, 서버가 HTTP response message를 보낸다.
- 예를들어, 사용자가 하이퍼링크를 누르면, 해당 페이지의 객체에 대한
HTTP request message를 서버에 보내게되고, 그 message를 받은 서버는 해당 객체를 담은 HTTP response message를 보내게된다.
- 소켓 인터페이스를 통해 보내진 데이터들은 client의 손에서 벗어나게된다.
- 계층적 아키텍처 하에서 HTTP입장에서는 TCP를 사용하기에 receiver에게 전달된다는 것이 보장된다는 것을 알기에, TCP가 패킷손실을 어떻게 복구하고, 순서를 어떻게 재조정하는지에 대해서는 알 필요가 없다.
stateless protocol
- HTTP는 stateless protocol이라고도 불린다.
서버가 클라이언트의 상태를 가지고있지 않는다
는 것을 의미한다.- 만약 서버가 클라이언트의 상태를 가지고있다고한다면,
- 서버나, 클라이언트가 crash됐을때, 이전 상태에 대한 정보는 일관성이 없어진다.
- 또한, 수백만 브라우저를 감당하는 서버가 각 브라우저의 상태를 가지고 있는 건 부하가 심할 것이다.
Non-persistent and persistent HTTP
- HTTP request, response 쌍마다 TCP 연결을 다시 해줘야할까?
- Non-persistent connection은 HTTP 쌍마다 연결을 해주고,
- persistent connection은 서버가 HTTP response를 보낸 후에 연결을 열어둔다.
Non-persistent HTTP
- 만약 10개의 객체를 요청한다고 생각해보자
- 클라이언트가 80포트로 서버에 TCP 연결을 시도한다.
- 서버는 80번포트에서 TCP연결을 대기하고있다가, 클라이언트의 TCP연결을 허용하고 알린다.
- 클라이언트는 이제 HTTP request message를 TCP connection socket에 보낸다.
- 서버는 HTTP request message를 TCP소켓으로부터 받고, 요청받은 객체를 HTTP response message에 캡슐화해 보낸다.
- 서버가 TCP에게 연결을 종료해도 된다고 알린다. 다만, TCP는 여기서 바로 연결을 끊는게 아닌, 클라이언트가 response message를 받았는지 확인하고 종료한다.
- 클라이언트는 받은 HTTP response message에서 파일을 추출하고, HTML파일을 분석하고, 10개의 객체를 참조하고 있다는것을 알아낸다.
위 과정이 10개의 객체에 대해 반복되어 이뤄진다.
최초에 연결한 TCP connection이 유지되지 않기에, 유저가 10개의 객체를 참조하는 웹페이지를 요청하면 총 11번의 TCP connection이 만들어진다.
non-persistent RTT
RTT(Round-Trip-Time)
- 패킷 하나가 클라이언트로부터 보내져서 서버에서 다시 클라이언트에 도달하기까지 걸리는 시간
- 패킷 전송 지연 + 라우터와 스위치에서의 패킷 큐 딜레이 + 패킷 처리 지연을 포함
three-way Handshake
- TCP는 전송계층에서 다룰거긴한데, HTTP 요청, 응답에 걸리는 시간을 이해하기위해선
three-way handshake
에 대해서 이해할 필요가 있다.- 클라이언트에서 TCP연결을 위해 서버에
[SYN]
패킷을 전송한다. - 서버는 이에대한 응답으로
[ACK]
패킷을 전송한다. - 클라이언트는 다시
[ACK]
패킷을 전송한다.
- 클라이언트에서 TCP연결을 위해 서버에
- Request를 요청하기 전에 TCP 연결을 초기화하는 시간에 1 RTT가 들게된다.
- 이제 클라이언트는 HTTP request를 요청하게되는데, 서버는 이 패킷을 받으면 연결된 TCP를 통해 요청한 데이터를 HTTP response로 전달한다.
- HTTP request, response가 왔다갔다하는 시간에 1 RTT를 더 소요하게되며,
전송해야하는 파일의 크기에따라 transmission time
이 더해지게된다. - 총 시간은 : 2 RTT +
file transmission time
- TCP는 전송계층에서 다룰거긴한데, HTTP 요청, 응답에 걸리는 시간을 이해하기위해선
non-persistent의 단점
- TCP 연결마다 2 RTT를 필요로하기에 OS에 오버헤드가 발생한다.
- 참조 객체를 패치할때마다 브라우저는 TCP연결을 해야하고, 전송하는동안 연결을 유지해야한다.
이런 단점이 있기에, HTTP 1.1은 persistent connection을 사용한다.
Persistent-HTTP(HTTP 1.1)
- 서버가 HTTP response를 보낸 후에도 연결을 끊지않음.
- 연속적인 HTTP request, response 메세지가 열려있는 TCP 연결을 통해 보내진다.
- 클라이언트는 참조 객체에 대해서 연속적인 request를 전달
- HTTP서버는 TCP연결이 특정시간동안 사용되지 않을때 연결을 종료한다.
HTTP 패킷
- 사람이 읽을 수 있는 형태로 패킷을 전송한다.(ASCII형태)
HTTP request message 형식
-
HTTP request message의 특징으로는 다양한 method를 요청할 수 있다는 것이다.
- GET :
request-URI를 통해 데이터를 전송
한다.- request-URI는 URL-query string으로 끝날 수 있는 절대경로의 URL을 의미한다.
- 헤더필드에 IF-None-Match등이 있다면
conditional GET
으로 변경된다. - 일반적으로 서버로부터 데이터를 받아올때 사용한다.
-
HEAD : GET method와 동일하나, 서버의 응답에 메세지 본문이 들어있지않고, 헤더정보만 들어있다.
- POST : 서버에 데이터를 전송한다.
- form data, 파일 업로드에 주로 사용된다.
- form data의 키-밸류 값으로
패킷의 body에 포함해 전송
하게된다. - 멱등성을 가지고 있지 않다.
동일한 데이터로 POST를 여러번 요청하면 여러개의 데이터가 생성된다.
- 일반적으로 새로운 데이터를 생성할때 사용한다.
- PUT : POST와 마찬가지로 서버에 데이터를 전송한다.
- POST와 차이점은 멱등성(indemponent)이다.
멱등성을 가지고있기에, 동일한 내용으로 여러번 PUT요청을 보내면 내용을 업데이트하지 않는다.
- 데이터를 업데이트할때 주로 사용된다.
- DELETE : 지정한 리소스의 삭제를 요청한다.
HTTP response message 형식
- HTTP response status code
- 클라이언트가 요청한 HTTP request의 상태에 대한 정보를 전송한다.
info.cern.ch 접속해보기
- 웹 페이지에서 하이퍼링크를 타고 다른 페이지로 이동했을때
-
TCP 연결을 다시 하는게 아닌, 하이퍼링크에 대한 HTTP request를 바로 날리는 것을 볼 수 있다.
-
TCP를 통해 관련 데이터를 segment로 전송하며, 요청한 데이터의 마지막에는 TCP를 사용한 HTTP response를 통해 TCP segment에는 보내야하는 데이터의 나머지 부분과 HTTP 요청이 완료됐다는 정보도 함께 보낸다.
- HTTP response 패킷을 보면, 이전에 받았던 TCP segment들을 reassemble을 하고있는 것을 볼 수 있다.
댓글남기기