본문 바로가기

프로그래밍/네트워크

네트워크(6) - Web and HTTP

1990년대 초, 새로운 애플리케이션인 world wide web(www)이 등장했다. 

웹의 등장으로 이전과 다르게 사용자들은 그들이 원할 떄 원하는것을 수신할 수 있게 되었다.

이를 on-demand 방식이라 하는데 이것은 라디오 처럼 제공자의 시간에 우리가 주파수를 맞추어야 하는것과 다르다.

 

HTTP는 웹의 애플리케이션 계층 프로토콜이다. 이 덕분에 우리는 웹 페이지를 자유롭게 식별가능하게 되었다.

다시말해, HTTP는 클라이언트가 웹 서버에게 웹 페이지를 어떻게 요청하는지와

서버가 클라이언트로 어떻게 웹 페이지를 전송하는지 정의한다.

 

이번글은 이에 대해 알아보도록 할 것이다.

 

 

 

 


 

 

HTTP

 

 

우리가 주소를 검색할때 생략하는 http는 웹에서 사용되는 web application layer protocol 이다.

 

client 는 서버에 주소를 요청한다.

서버는 URL 정보를 가지고 있는데 요청에 해당하는 주소를 보내주는 방식이다.

 

HTTP는 TCP전송 프로토콜을 사용한다. (웹은 신뢰성이 중요하기 때문에 TCP 사용)

클라이언트는 일단 서버에 TCP연결을 시작하고, 연결이 이루어지면 브라우저와 서버 프로세스는 그들의 소켓을 통해 TCP로 접속한다.

(소켓은 TCP와 클라이언트 프로세스 연결의 통로, 서버 입장에서는 서버와의 통로)

 

HTTP의 중요한 특성은 서버는 클라이언ㅌ에 관해 어떠한 상태 정보도 저장하지 않는다는 것이다.

클라이언트에 대한 정보를 유지하지 않으므로, 이를 stateless 하다고 한다. 

그냥 무언가가 오면 상응하는 답을 보낼 뿐이다. 

 

 


HTTP connections

비지속 연결과 지속 연결

 

1. non-persistent HTTP

 TCP connection에 한 오브젝트만 보내고 connection을 닫아버린다.

 web 브라우저 띄울 때마다 connection을 열고 닫고 하는 것이다.

 

1a. HTTP client가 HTTP server한테 TCP connection을 요청함

1b. HTTP 서버는 accept함. accept했다는 사실을 request 메시지 통해 전달

2.  그러면 connection이 만들어졌고, 특정 주소에 들어가서 클릭에 해당하는 주소(path name)에 해당하는 URL을 보냄

3.  HTTP는 response 메시지를 보냄 (해당하는 데이터 or 에러 메시지)

4.  HTTP server는 하나 주고 받았으니 TCP connection 닫음

5.  HTTP client는 닫았다는 소식 받고, 클릭에 해당하는 것을 display

6.  1~5번 과정 반복

 

와 같이 브라우저를 띄울때 마다 connection을 열고 닫는다.

 

 RTT (Round Trip Time) : 메시지가 갔다가 온데까지 시간

 

하나의 TCP connection을 만드는데 하나의 RTT를 소요한다. HTTP 보내고 response 받는데 걸리는 시간으로

또 RTT 하나 소요한다. 위의 굵은 선은 transmission time이다.

결론은, 2RTT + transmission time이 걸린다.

 

Non-persistent HTTP에서는 하나의 데이터를 주고 받으려면 2RTT + transmission delay만큼의 delay가 생긴다.

두 배 정도 오래걸리는 것이다.

 

이 문제를 해결하기 위해 Persistent HTTP가 등장했다.

 

 

2. Persistent HTTP 

TCP connection을 하나 열고, 복수개의 objects가 전달하고, 전달이 끝나면 connection을 닫는다.

 

Persistent HTTP server가 하나의 response를 보내도, connection을 열어놓는다. 그리고 일정시간동안 데이터가 오지 않으면 connection을 닫는다.

 이렇게 처음 데이터에 대해서 connection을 열고, 바로 닫지 않기 때문에 여러 개의 데이터를 받아도

delay time이 Non-persistent HTTP보다 짧아지는 것이다.

 

만약 10개의 objects를 주고 받는다면 delay time은

1RTT(connection) + 10RTT(objects) + 10 transmission time

이 될 것이다.

 

 

 


HTTP message format

 

header : body 를 전달하는데 필요한 값, version or URL

body : 진짜 전달하는 내용물

 

request message를 보시라.

간단한 예시이다. 첫줄은 요청라인 이후의 줄들은 헤더라인이다.

 

요청라인(request line) 먼저 살펴보자.

3개의 필드 method , URL , version 을 가질수 있다.

method는 GET,POST,HEAD,PUT,DELETE를 포함하는 여러가지 값을 가진다.

 

대부분은 GET 방식을 사용한다. 버전은 특별한 설명을 필요로 하지 않는다.

 

GET은 지정된 리소스의 표현을 요청한다.

일반적으로 우리가 해당 화면을 볼 때 요청한다. 

 

POST는 웹에서 수정된 데이터를 포함할 때 가령 파일을 업로드하거나 완성된 웹 양식을 제출할 때 사용한다.

 

요청을 보냈으니 해당하는 응답 메세지를 알아보자

 

 

HTTP 응답 메세지

첫째 줄 초기 상태라인6개의 헤더 라인,개체 몸체로 이루어졌다.

 

대략적인 형식은 위에 있는 response message 의 포맷을 참고하고

 

 

HTTP response status codes

200 OK : 성공했다. (우리가 볼 일은 없을 것임)

301 Moved Permanently : 요청된 오브젝트가 서버의 로케이션에서 사라졌다. 옮겨졌다.

400 Bad Request : 서버가 이해할 수 없는 request가 왔다.

404 Not Found : 서버에 request가 없다.

505 HTTP Version Not Supported : HTTP의 버전이 안 맞다. (오래된 프로토콜을 전부 지원해준다. 보기 힘들 것임)

 

 

 

 

아래의 포스트를 많이 참고했습니다.

https://inyongs.tistory.com/57