웹 클라이언트와 서버에게, 컨텐츠는 연관된 MIME는 (multipurpose internet mail extensions) 타입을 갖는 바이트 배열이다.
! 여기서 MIME는 전자 우편을 위한 인터넷 표준 포맷이다.
다음 그림은 MIME 타입의 예이다.
웹 서버는 두 가지 서로 다른 방법으로 클라이언트에게 컨텐츠를 제공한다.
여기서 1번을 정적 컨텐츠라 말하고, 2번을 동적 컨텐츠라 말한다.
웹 서버가 리턴하는 모든 내용들은 서버가 관리하는 파일에 연관된다. 이 파일 각각은 URL라고 하는 고유의 이름을 가진다.
다음과 같은 URL이 있다면,
http://www.google.com:80/index.html
클라이언트는 다음과 같은 URL 부분을 사용해서 어떤 종류 서버에 접속해야하는지 결정하고, 어디에 서버가 있는지, 서버가 무슨 포트를 듣고 있는지를 결정한다.
http://www.google.com:80
서버는 다음과 같은 URL 부분을 사용해서 자신 파일 시스템 상의 파일을 검색하고, 이 요청이 정적 또는 동적 컨텐츠에 대한 것인지 결정한다.
/index.html
URL은 정적 또는 동적 컨텐츠를 참조하는지를 결정하기 위한 표준 규칙은 없다. 각각의 서버마다 자신만의 규칙이 있다.
하지만 고전적인 방식은 동적컨텐츠를 찾을 때, cgi-bin 이름을 가진 디렉토리 안에 모든 실행파일이 존재하게 하고, 서버는 디렉토리로 접근하는 것이다.
동적 컨텐츠는 처리 될때, CGI라고 부르는 사실상의 표준으로 설명할 수 있다.
GET요청을 위한 인자들은 URL로 전달되고, '?' 인자는 파일이름과 인자를 구분하며, 각 인자는 '&'로 구분한다. 빈칸은 허용되지 않고, 대신 '%20' 스트링으로 표시해야한다.
서버가 요청을 받으면, 서버는 fork 를 호출해서 자식 프로세스를 생성한다.
그 다음 execve 를 호출해서 /cgi-bin/adder 프로그램을 자식의 컨텍스트에서 실행한다.
adder같은 프로그램들은 종종 CGI 프로그램이라고 부르는데, 그 이유는 이들이 CGI표준의 규칙을 준수하기 떄문이다.
그런데 실행하기 전에, 인자값을 받기 위해, CGI 환경변수 QUERY_SRING을 URL에서 받은 인자값으로 설정하고, adder프로그램은 getenv 함수를 호출해서 QUERY_SRING 값을 참조할 수 있다.
CGI 프로그램은 자신의 동적 컨텐츠를 표준 출력으로 보낸다.
자식 프로세스가 CGI 프로그램을 로드하고, 실행하기 전에 리눅스 dup2 함수를 사용해서 표준출력을 클라이언트와 연계된 식별자로 재지정한다.