HTTP의 경우 리눅스 TELNET(인터넷, 로컬 네트워크 연결에 쓰이는 프로토콜)프로그램을 사용해서 인터넷 상의 모든 웹 서버와 트랜잭션 가능하다.
HTTP 요청
요청시 요청헤더를 통해 서버에 브라우저의 이름이나 브라우저가 이해하는 MIMT 타입의 추가정보를 제공한다.
header-name: header-data
header 중 *host
* 헤더는 프록시 캐시에 의해 사용되고, 이는 브라우저와 웹 서버 사이에서 중간자 역할을 한다. 그리고 프록시는 여러개 존재할 수 있다.(프록시 체인)
HTTP 응답
응답 헤더를 통해 응답에 대한 추가 정보를 제공한다.
어떻게 클라이언트는 프로그램 인자를 서버에 전달하는가?
→ 일반적으로 인자를 URL을 통해 전달한다. 인자와 주소를 ?
로 구분하고, 인자와 인자를 &
로 구분한다.
어떻게 서버는 인자들을 자식으로 전달하는가?
→ 서버가 GET /cgi-bin/adder?15000&213 HTTP/1.1
같은 요청을 받게 되면, 이 서버는 자식 프로세스를 만들기 위해 fork 함수를 사용하고, 그 다음 execve 함수를 사용해서 /cgi-bin/adder
프로그램을 자식 프로세스에서 실행합니다. adder와 같은 이런 프로그램들은 CGI(Common Gateway Interface) 표준을 준수하기 때문에 CGI 프로그램이라고 일컬어집니다. execve 함수를 호출하기 전에, 자식 프로세스는 CGI 환경 변수인 QUERY_STRING을 "15000&213"으로 설정합니다. 이는 실행 시 adder 프로그램이 리눅스의 getenv 함수를 통해 참조할 수 있는 값입니다.
자식은 자신의 출력을 어디로 보내는가?
→ CGI 프로그램은 자신의 동적 컨텐츠를 표준 출력으로 보낸다. 자식 프로세스는 CGI 프로그램은 로드하고 실행하기 전에 dup2
함수를 사용해서 표준 출력을 클라이언트와 연결된 file descriptor로 재지정한다. 이로 인해서 CGI 프로그램의 표준 출력이 모두 클라이언트로 직접 향하게 된다.