[CSAPP 11장 완전 정복] 11.5~11.6(Part 2) Tiny 웹 서버 구조 뜯어보기

2025. 5. 3. 19:59·크래프톤 정글/컴퓨터구조(CSAPP)

Tiny 웹 서버 구조 뜯어보기

지난 글에서 HTTP 구조와 Tiny 서버의 역할을 살펴봤다면, 이번엔 실제 코드 흐름을 따라가며 Tiny 서버가 클라이언트 요청을 어떻게 처리하는지 단계별로 정리해보겠습니다.

 

이 글을 읽고 나면 doit(), serve_static(), serve_dynamic() 세 개의 함수가 어떻게 연결되고, 각각 무슨 일을 하는지 눈에 그려질 것입니다.

 

 

서버의 입구, main 함수

Tiny 서버는 가장 먼저 포트를 받아들이고, 해당 포트에 대해 리스닝 소켓을 생성합니다. 이후 무한 루프를 돌면서 클라이언트 요청을 기다리죠.

listenfd = Open_listenfd(argv[1]);
while (1) {
    connfd = Accept(listenfd, ...);
    doit(connfd);
    Close(connfd);
}
  • Open_listenfd(): socket → bind → listen 호출을 감싼 고수준의 인터페이스
  • Accept(): 클라이언트 연결 수락 후, 통신 가능한 connfd 반환
  • doit(): 클라이언트의 요청 처리하는 핵심 함수

이 구조는 반복적(Iterative) 서버로, 하나의 요청을 처리하고 나서야 다음 요청을 받습니다.

 

 

웹 요청 해석의 핵심, doit 함수

doit() 함수는 HTTP 요청을 파싱하고 요청된 리소스가 정적인지 동적인지 판단한 뒤, 적절한 함수로 분기합니다.

sscanf(buf, "%s %s %s", method, uri, version);
is_static = parse_uri(uri, filename, cgiargs);
stat(filename, &sbuf);

흐름 요약

  1. 요청 줄 파싱: GET /foo HTTP/1.1와 같은 줄에서 method, uri, version 추출
  2. 정적/동적 판단: cgi-bin이 URI에 있으면 동적 콘텐츠로 간주
  3. 파일 존재/권한 체크: stat()을 통해 파일 존재 여부 확인

그리고 아래처럼 분기합니다:

if (is_static) {
    serve_static(fd, filename, sbuf.st_size);
} else {
    serve_dynamic(fd, filename, cgiargs);
}

곧, doit() 함수는 실제 요청을 분기하는 "두뇌" 역할을 합니다.

 

 

정적 파일 전송 로직, serve_static 함수

정적 콘텐츠는 단순히 파일을 열고 → 메모리에 매핑 → 클라이언트로 전송하는 구조입니다.

Open(filename, O_RDONLY, 0);
srcp = Mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);
Rio_writen(fd, srcp, filesize);
Munmap(srcp, filesize);
  • mmap(): 파일 내용을 메모리에 직접 매핑 (zero-copy)
  • Rio_writen(): 신뢰성 있는 쓰기 (write wrapper)

응답 헤더는 직접 만들어서 전송합니다:

sprintf(buf, "HTTP/1.0 200 OK\r\n");
sprintf(buf + ..., "Content-length: %d\r\n", filesize);
sprintf(buf + ..., "Content-type: text/html\r\n\r\n");
Rio_writen(fd, buf, strlen(buf));

serve_static()은 단순하지만, mmap을 활용해 고성능 전송을 구현하는 중요한 함수이지요.

 

 

동적 파일 전송 로직, serve_dynamic 함수

동적 콘텐츠는 fork → execve → CGI 실행 결과를 클라이언트에 전달하는 구조입니다.

if (Fork() == 0) {
    setenv("QUERY_STRING", cgiargs, 1);
    Dup2(fd, STDOUT_FILENO);
    Execve(filename, emptylist, environ);
}
Wait(NULL);
  • setenv(): 환경변수 설정 (쿼리 인자 전달용)
  • dup2(): 표준 출력을 소켓으로 리디렉션
  • execve(): CGI 프로그램 실행

adder.cgi 같은 CGI 프로그램은 getenv("QUERY_STRING")로 인자를 받고, printf()로 결과를 HTML로 출력하는데요. 다시말해 serve_dynamic()은 전통적인 CGI 모델을 실제로 구현해보는 코드입니다.

 

 

응답 헤더와 상태 코드

Tiny는 기본적인 HTTP 상태 코드를 다음처럼 처리합니다:

  • 200 OK: 성공
  • 404 Not Found: 파일 없음
  • 403 Forbidden: 권한 없음
  • 501 Not Implemented: 지원하지 않는 METHOD

이런 오류는 clienterror() 함수로 응답을 전송합니다.

clienterror(fd, cause, "404", "Not found", "Tiny couldn't find this file");

이때, MIME 타입을 결정하는 것도 중요한데, Tiny는 이를 파일 확장자 기반으로 처리합니다.

if (strstr(filename, ".html"))
    strcpy(filetype, "text/html");

 

 

마치면서, Tiny는 코드 그 자체로 설명서다

이번 포스트에서는 Tiny 서버의 핵심 함수인 doit, serve_static, serve_dynamic의 흐름을 짚어봤습니다. 이 세 개의 함수가 모여 클라이언트에게 원하는 정적 또는 동적 콘텐츠를 제공할 수 있게 되지요.

 

다음 글에서는 CGI 구현과 Tiny 서버 확장 가능성(멀티프로세싱, MIME 확장, 오류 처리 등)에 대해 더 깊이 들어가보겠습니다. 책을 읽기 전에 이 흐름을 머릿속에 그릴 수 있다면, Tiny 코드는 그야말로 자기 설명적인 해석 가능한 텍스트가 될 것입니다. 감사합니다.

저작자표시 비영리 변경금지 (새창열림)

'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글

[CSAPP 10장 골라읽기] 10.5 안정적인 읽기와 쓰기를 위한 RIO 패키지 완전정복  (0) 2025.05.05
[CSAPP 11장 완전 정복] 11.5~11.6(Part3) Tiny 웹 서버 확장성과 실전 응용  (1) 2025.05.03
[CSAPP 11장 완전 정복] 11.5~11.6(Part 1) 웹 서버의 세계로 한 걸음, Tiny는 왜 필요한가?  (0) 2025.05.03
CSAPP 11.5~11.6 rawdata 공유 (전체 학습 목표, 학습 정리 자료)  (0) 2025.05.03
[CSAPP 11장 완전 정복] 11.4(Part 2) addrinfo, sockaddr 구조체부터 변환 함수까지 한 번에 정리하기  (0) 2025.05.02
'크래프톤 정글/컴퓨터구조(CSAPP)' 카테고리의 다른 글
  • [CSAPP 10장 골라읽기] 10.5 안정적인 읽기와 쓰기를 위한 RIO 패키지 완전정복
  • [CSAPP 11장 완전 정복] 11.5~11.6(Part3) Tiny 웹 서버 확장성과 실전 응용
  • [CSAPP 11장 완전 정복] 11.5~11.6(Part 1) 웹 서버의 세계로 한 걸음, Tiny는 왜 필요한가?
  • CSAPP 11.5~11.6 rawdata 공유 (전체 학습 목표, 학습 정리 자료)
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기
      • 크래프톤 정글
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • 마이 정글(WIL, 에세이)
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[CSAPP 11장 완전 정복] 11.5~11.6(Part 2) Tiny 웹 서버 구조 뜯어보기
상단으로

티스토리툴바