웹페이지는 다양한 object들도 이루어져 있다. object들은 html 파일, 이미지, java, audio 등 다양하다.
html 코드는 다음과 같은 형태이다.
HTTP
http는 hypertext transfer protocol의 약자로 웹의 application-layer 프로토콜이다.
client / server 모델로 이루어져 있다. client가 브라우저로 http protocol을 통해서 request, receive를 실행하고, web object를 표시한다.
server는 client의 response와 request에 대응하여 object를 http protocol을 통해 전달한다.
HTTP는 TCP를 사용한다.
server는 port 80으로 약속되어있다. server와 client는 TCP connection이 이루어지고, HTTP message를 브라우저 사이에서 서로 주고 받는다.
HTTP를 stateless라고 하는데, client가 과거에 보낸 request에 대한 정보가 남지않고 요청에 대한 응답만 한다.
state가 있으면 protocol이 복잡해지므로 HTTP는 state관리를 하지 않는다.
HTTP connections
HTTP connection에는 Non-persisten HTTP, Persistent HTTP의 두 가지 타입이 있다.
Non-persistent HTTP
client가 TCP 연결을 한 이후에도 여러 object를 요청하면 connection을 여러번 해야한다.
Non-persistent HTTP : example
유저가 특정 URL을 들어가서 HTML 파일을 요청하였을 때, text와 10개의 jpeg images가 있다고 하자.
가장 먼저 client가 server로 TCP 연결을 요청한다.
server는 port 80에서 TCP연결을 허용하여 TCP 연결이 되면
client가 HTML파일을 요청한다.
server는 client의 요청에 대한 응답 HTML파일을 보내준다.
그러고 나서 TCP연결을 close한다.
client는 HTML을 받고 parsing하면서 10개의 web object jpeg images를 발견하고 요청을 보내야한다.
보내는 10개의 object에 대해서 각각 TCP를 연결하고 close하는 과정을 전부 거친다.
non-persistent는 object 하나 당 2 RTT + file transmission time 만큼의 시간이 걸린다.
- obj 하나당 2RTT 만큼이 걸린다.
- TCP 연결과 종료에 대한 OS의 overhead가 발생한다.
- 브라우저가 TCP를 여럿 연결하여 object를 평행하게 받기도 한다.
이러한 단점들 때문에 HTTP 1.1에서 Persistent HTTP로 개선하여 다음과 같은 점들이 생겼다.
- server가 object response이후 TCP를 open한 상태로 둔다.
- client는 server에서 계속 open해놓은 TCP connection으로 HTTP message를 보낸다.
pipelined GETs (HTTP 1.1)
pipelining이 없는 왼쪽 그림같은 경우 TCP연결 및 HTML파일을 받은 후 object를 한 개씩 요청하고 받은 후 다음 object를 요청한다.
pipelining이 있는 경우, object를 순차적으로 여러개 요청하는 식으로 시간을 단축한다.
non-persistent의 경우 TCP를 연결하고 끝는 과정을 매 object마다 하지만, persistent HTTP는 TCP를 연결한 상태로 유지하고 또한 pipelining을 통해 순차적으로 object을 요청하는 방식으로 진행된다.
HTTP request message
HTTP message는 request, response 2개의 타입이 있고, request message는 ASCII 코드로 이루어져 있으며 다음과 같은 구조로 이루어져 있다.
GET을 통해 요청할 file의 정보를 전달하고, header에 여러가지 정보가 들어간다.
일반적인 구조로 보면 다음과 같다.
method에는 POST method, GET method, HEAD method, PUT method 등이 있다.
HTTP response message
response format은 다음과 같다.
HTTP status code의 종류는 다음과 같다.
200 OK
request succeeded, requested object later in this message
301 Moved Permanently
requested object moved, new location specified later in this message (in Location: field)
400 Bad Request
request msg not understood by server
404 Not Found
requested document not found on this server
505 HTTP Version Not Supported
Trying out HTTP (client side)
클라이언트에서 웹서버로 요청하는 방법을 알아보자.
- netcat을 이용하여
% nc -c -v gaia.cs.umass.edu 80와 같이 사용하면,
TCP connect로 해당 주소에 port 80번에 연결하라는 의미이다. - GET으로 HTTP request를 typing하는 방법
GET /index.php HTTP/1.1
Host: hostname
이와 같이 입력하면 - server가 이를 받고 response message를 보낸다.
HTTP/2
HTTP 1.0은 non-persistent, HTTP 1.1은 persistent & pipelined 로 데이터를 주고받는다.
HTTP 1.1의 단점으로는 크게 head-of-line (HOL) blocking 으로 먼저 보내는 object의 크기가 너무 클 경우, 다음 object를 받는게 block되는 상황이 있다.
HTTP 2는 multi-object HTTP request에 대해 delay를 줄여주는데 목적이 있다.
method, status code, header filed가 HTTP 1.1과 다르지 않지만,
object를 frame 단위로 나누어 보내어 HOL blocking을 방지한다.
HTTP/2 : mitigating HOL blocking
HTTP 1.1에서는 큰 object 뒤에 작은 object들을 request했을 시 위와 같이 뒤에 따라오는 object들이 block 되어 앞의 큰 object를 기다린다.
같은 상황에서 HTTP/2는 object를 일정 크기로 쪼갠다. 쪼갠후 object 별로 돌아가며 일정 크기만큼 보낸다.
따라서 작은 object들은 빨리 전송되고, 먼저 request한 큰 object는 다소 delay된다.
HTTP의 역사
1996년에 첫 상용화 버전인 HTTP/1.0가 발표되었고, 1999년에 HTTP/1.1, 그리고 2015년 HTTP/2를 공식으로 발표하였다.
현재 HTTP/1.1을 대부분 사용 중이지만 구글 계열의 사이트는 HTTP/2와 HTTP/1.1을 동시에 지원하고 있고, 다른 국내외 사이트들도 점차적으로 HTTP/2로 바꾸는 추세다. HTTP/2는 HTTPS 연결에서만 작동하며, HTTP 연결일 경우에는 브라우저와 서버에서 HTTP/2를 지원하더라도 HTTP/1.1로 연결된다.
HTTP/2는 구글이 발표한 SPDY라는 기술을 기반으로 했는데, HTTP/3에도 구글이 발표한 QUIC의 기술이 적용되는 것으로 방향이 정해진 모양이다. HTTP/2까지는 TCP 연결을 기반으로 하는데, HTTP over QUIC(HTTP/3)은 UDP 연결을 기반으로 한다.
Keep-Alive
header 속에서 Keep-Alive라는 것을 설정해서 보내면, 데이터를 보내고 나서 종료하지 않고 timeout 설정값만큼 대기한 후 종료한다. max 설정값만큼에 걸쳐 진행할 수 있다.
Non-persistent HTTP와 Persistent HTTP의 통신과정을 그림으로 요약하면 다음과 같다.
Non-persistent는 HTML전송 및 object마다 TCP connection와 close를 각각하는 것을 확인할 수 있고,
Persistent는 한 번의 연결로 여러 object를 요청하고 전달하는 것을 알 수 있다.