Mulitipurpose Internet Mail Extensions
Content-type: image/jpeg // MIME
Content-length: 12984
Uniform Resource Identifier
http://www.test.com/test_dir/test.html
GET /test_dir/test.html HTTP/1.0
Host: www.test.com
HTTP/1.0 200 OK
Content-type: image/gif
Content-length: 12345
POST와 PUT의 차이
POST는 서버에 데이터를 보내기위해서 사용된다.
반면에, PUT은 서버에있는 리소스에 데이터를 입력하기위해서 사용된다.
GET /test_dir/test.html HTTP/1.0 //시작줄
Accept: test_dir/* //혜더
Accept-Language: en, fr //헤더
HTTP/1.0 200 OK //시작줄
Content-type: text/html //헤더
Content-lenght: 1234 //헤더
<HTML>
<HEAD><TITLE>hello world</TITLE></HEAD>
/* ... */ //본문
Transmission control Protocol (전송 제어 프로토콜)
http://www.test.com:80 // port번호가없다면, 기본값을 80으로 가정.
http:// // scheme (프로토콜)
www.test.com // DNS를 통해서 IP주소 추출
HTTP 요청과 응답의 순서는 다음과같다.
1. 클라이언트(웹 브라우저)는 서버의 URL에서 호스트명을 추출
2. 웹브라우저는 호스트명을 IP주소로 변환
3. URL에서 포트번호를 추출
4. 클라이언트는 서버와 TCP커넥션을 맺음
5. 클라이언트는 서버에 HTTP 요청을 보냄
6. 서버는 클라이언트에서 HTTP 응답을 보냄
7. 커넥션이 닫히면, 웹브라우저는 문서를 모니터에 출력함
TCP커넥션은 네가지 값으로 식별한다.
<발신지 IP, 발신지 port, 수신지 IP, 수신지 port>
따라서, 서로다른 두개의 TCP커넥션은 같을수 없다.
실습을 위한 도구
인자로 들어간 host 와 port로 tcp 연결을 한다.
telnet www.google.com 80
// TCP 커넥션이 연결된후에
// 요청을 보낸다.
GET /test.html HTTP/1.1
Host: www.google.com
telnet와 비슷함.
printf "GET /nc.1 HTTP/1.1\r\nHost: man.openbsd.org\r\n\r\n" | nc man.openbsd.org 80
웹서버는 HTTP 및 그와 관련된 TCP처리를 구현한것이다.
클라이언트와 서버사이에 이미 TCP커넥션이 연결되어있다면, 연결되어있는 커넥션을
사용한다. 그것이 아니라면, 커널영역의 네트워크 인터페이스와 TCP/IP 네트워크 스택을 통해
서버에 대한 새 커넥션을 열어야한다.
클라이언트가 웹 서버에 TCP커넥션을 요청하면, 웹서버는 그 커넥션을 맺고 TCP커넥션에서
IP주소를 추출하여, 클라이언트를 확인한다. 또한 서버는 새 커넥션을
커넥션 목록에 추가하고, 요청메세지를 기다린다.
TCP 커넥션을 조작하는 인터페이스와 자료구조는 운영체제마다 다르다.
유닉스 환경에서 TCP커넥션은 소켓으로 표현되며 클라이언트의 IP주소는 getpeername을
호출하여 그 소켓으로부터 추출가능하다.
웹서버가 요청을 받으면, 서버는 요청으로부터, 메소드, 리소스, 헤더, 분문을
얻어내어 처리한다.
POST를 비롯한 몇몇 메서드는 요청메세지에 엔터티 본문이 있을것을 요구한다.
하지만 GET과 같이 요청메세지에 엔터티 본문이 있는것을 금지하는 경우도 있다.
메세지에서 지정한 리소스에 접근한다.
웹 서버는 리소스 서버이다. 웹서버는 HTML페이지나 JPEG와 같은 미리 만들어진
콘텐츠를 제공하며, 마찬가지로 서버 위에서 동작하는 리소스 생성 어플리케이션을 통해
만들어진 동적 콘텐츠도 제공한다. (WAS)
또한, 웹서버는 여러 종류의 리소스 매핑을 지원한다. 가장 단순한 형태의
리소스 매핑은 요청 URI를 웹서버의 파일 시스템안에 있는 파일 이름으로 사용하는것이다.
일반적으로 웹서버 파일시스템의 특별한 폴더를 웹 콘텐츠를 위해 예약해둔다.이 파일은 "문서루트" 혹은 "docroot"로 불린다.
웹서버는 요청메세지에서 URI를 가져와서 문서루트 뒤에 붙인다.
GET /test_dir/test.html HTTP/1.0
에 대한 요청에, docroot를 /usr/local/httpd/files라고 설정해두었다면,
웹서버는
/usr/local/httpd/files/test_dir/test.html 파일을 반환한다.
이러한 docroot는 htttpd.conf설정파일에서 추가할수있다.
HTTP 응답 메세지를 생성한다.
상태코드, 응답헤더, 그리고 응답본문등이 있다.
응답을 클라이언트에게 돌려준다.
웹서버는 요청메세지를 받을때처럼, TCP커넥션을 통해서 클라이언트에게
응답메세지를 보낼때에도, 많은 커넥션을 가질수있다.
그렇기때문에, 서버는 커녁션 상태를 추적해야하며, 지속적커넥션 또는
비지속적커넥션인지에 따라 모든 메세지를 전송한후에 커넥션을 닫을지 정해야한다.
로그파일에 트랜잭션 완료에 대한 기록을 남긴다.
로깅이라고하며, 트랜잭션이 완료되었을때, 웹서버는 트랜잭션이
어떻게 수행되었는지에 대한 로그를 로그파일에 기록해야한다.