Network

응용 계층 정리

우당탕탕코딩일기 2023. 10. 21. 17:00

 

HTTP


 

HTTP 는 hyperText Transfer protocol 의 약자로 웹의 응용계층 프로토콜으로 웹의 심장이라고 할 수 있다.

 

HTTP 는 RFC 1945 , RFC 7230, RFC 7540 에 정의되어있다.

 

HTTP 는 두가지 프로그램에 구현되어있다. 하나는 클라이언트 프로그램이고 다른 하나는 서버 프로그램이다.

클라이언트와 서버 프로그램은 다른 end system 을 실행하며 서로서로 소통한다. 소통은 HTTp 메시지를 교환함으로써 이루어진다.

 

HTTP 는 이 메시지의 구조를 정의하고 클라이언트와 서버가 메시지를 교환하는 방법을 정의한다. 

HTTP 를 자세하게 설명하기 전에 우리는 웹 terminology 를 살펴봐야한다.

 

웹 페이지는 객체들로 구성된다. 객체란 파일을 생각하면 된다. 예를들어 HTML 파일이나 JPEG 이미지나 자바스크립트 파일이나 CSS 파일을 의미한다. 그리고 이것들은 하나의 URL 을 통해 접근 가능하다. 대부분의 웹 페이지들은 기본 HTML 파일에 몇개의 참조된 객체들로 구성된다 

 

URL 이란 두개의 파트로 구분할 수 있다. 호스트네임과 패쓰 네임이다.

 

예를들어 http://www.someSchool.edu/someDepartment/picture.gif 

라는 URL 이 있을때 www.someSchool.edu  란 호스트네임을 의미하고 /someDepartment/picture.gif 는 해당 호스트의 객체에 접근하기위한 path 이다.

 

웹 관점에서 웹 브라우저(크롬, 사파리)는 HTTP 의 클라이언트 입장이므로 여기서

우리는 브라우저와 클라이언트를 비슷한 개념으로 사용하게 될 것이다.

 

서버는 아파치나 마이크로소프트 인터넷 이포메이션 서버가 포함될 수 있다. 

 

HTTP 는 어떻게 웹 클라이언트가 웹 페이지를 서버에게 요청하고 어떻게 서버가 웹 페이지를 클라이언트에게 전송하는지에 대해 정의한다.

 

HTTP 는 TCP 를 사용한다. HTTP 클라이언트는 먼저 서버와 TCP 연결을 생성한다. 한번 연결이 구축되면, 브라우저와 서버프로세스들은 소켓 인터페이스를 통해 TCP에 접근한다. 

 

 

 

HTTP with Non-Persistent Connections

 

TCP 전송 시 three-way handshake 방식을 사용한다.

이 방식은 클라이언트카 작은 TCP 세그먼트를 서버에게 보낸다. 그 서버는 작은 TCP 세그먼트로 받았다는 확인을 보낸다. 그 후 클라이언트는 다시 알았다는 확인을 서버에 보낸다.

 

처음에 요청 메시지가 서버에 도착하면, 서버는 TCP 연결에 HTML 파일을 보낸다. 이 HTTP 요청/응답은 다른 RTT를 소모한다. 그래서 전체 응답 시간은 2개의 RTT 에 HTML 파일의 서버에서의 전송 시간을 더한 값이다.

 

 

HTTP with Persistent Connections

 

non-persistent 연결은 몇가지 단점을 가진다. 먼저 새로운 연결이 항상 생서되고, 각각의 요청 객체에 대해 유지되어야한다. 이러한 연결들을 위해 TCP 버퍼들은 반드시 할당되고 TCP variable들은 항상 클라이언트와 서버 모두에서 유지되어야만 한다.  수백개의 다른 클라이언트에게 동시에 요청을 수행해야해서 이것은 웹서버에 상당한 부담을 줄 수 있다.

 

따라서 HTTP/1.1 의 persistent 연결은 서버가 응답을 보낸후 TCP 연결을 연 채로 남겨둔다. 그 후 클라이언트와 서버 사이에서 2차적인 요청과 응답은 같은 연결로 보내질 수 있다. 특히 전체 웹페이지는 하나의 persistent TCP 연결로 전송된다. 

HTTP 서버는 만약 특정 시간동안 사용되지 않을 때 연결을 닫는다. 

HTTP 디폴트 버전은 파이프라이닝을 통해 persistent 연결은 사용한다.

 


HTTP 메시지 포맷

 

RFC 1945,RFC 7230, RFC 7540 에서 HTTP 메시지 포맷의 정의가 포함된다. HTTP 메시지는 요청과 응답 메시지로 구분되는데 둘다 이 정의 아래서 논의되고 있다.

 

요청 메시지

HTTP 요청 라인, 헤더라인, 공백, 데이터로 구성된다.

우선 요청 메시지는 ASCII 코드로 작성된다. 그리고 메시지는 5개의 라인으로 구성된다. 각각의 라인은 그 후, 캐리지 리턴과 라인피드가 따른다. <CR><LF> \r\n

마지막 라인은 추가적인 캐리지 리턴과 라인피드가 따르는데 이것은 공백을 의미한다. 

요청 메시지는 더 많은 라인을 가질 수 있고 더 적을 수 있다. HTTP 요청 메시지의 첫번째라인은 요청 라인으로 불린다. 부수적 라인들은 헤더라인으로 불린다.

요청라인은 세개의 필드를 가진다. method 필드, URL 필드, 그리고 HTTP 버전 필드이다.

메소드 필드는 각각의 다른 값을 가질 수 있다 ( GET, POST, HEAD, PUT , and DELETE) 

HTTP 의 가장 다수는 GET 이다. 이것은 브라우저가 객체를 요청할 때 사용한다. 

다음은 헤더라인이다. 헤더라인은

호스트, Connections (persistent connection이 끊겼는지) , User-agent, Accept-language 를 포함한다.

위 예시에서는 Host: www.someschool.edu  를 보면 호스트는 www.someschool.edu 이며, Connection: closer 를 보면 서버가 요청된 객체를 보낸 후 연결을 끊길 원한다는 의미를 지닌다. 그 후 User-agent: Mozilla/5.0 을 보면, 브라우저의 타입이 모질라/5.0 으로 파이어폭스 브라우저라는 것을 알 수 있다. 또 Accept-language: fr 로 헤더는 유저가 객체의 프랑스어 버전을 받길 원한다는 것을 나타낸다.

그 다음은 바디가 나온다. 

 

 

 

응답 메시지

아래의 전형적인 HTTP 응답 메시지를 보면, 이 응답 메시지는 아까 논한 요청 메시지에 대한 응답이 될 수 있다.

728x90