tiny 웹서버 구현
- HTTP 프로토콜 지원
- 정적 & 동적 콘텐츠 전달
- 버퍼사용한 동기 I/O
- 다양한 오류 처리

간단한 web server 구현해보는 과제!
AWS 포트 번호를 열어줘야 했다.
[인스턴스] - [인바운드 규칙 편집]

DB연결은 해줄 필요 없으니, 8080 포트랑 HTTP 포트만 열어주면 된다.
🔎 HTTP1.1버전을 client가 보내지만, tiny는 HTTP1.0버전을 채택한 이유는?

일부 오래도니 서버나 proxysms HTTP/1.1을 지원하지 않아 더 안정적으로 서비스를 지원하기 위해 1.0버전 채택!
낮은 버전을 채택함으로서 오버헤드를 줄일 수 있다.
🔎 HTTP/1.0과 HTTP/1.1 차이점
HTTP/1.0 : 1996년부터 사용되고 있는 초기의 보다 간단한 버전이다. 1 GET / 1 Connection
HTTP/1.1 : 캐싱과 보안, 클라이언트와 서버가 동일한 지속적인 연결 위에 다중 트랜잭션을 수행할 수 있도록 하는 메커니즘 같은 고급 기능들을 지원하는 추가적인 헤더를 정의하고 있다. N GET / 1 Connection
🔎 QUERY STRING
키 - 값 쌍 집합으로 서버에 전달되는 데이터를 포함하는 URL(Uniform Resource Locator)의 일부
클라이언트와 웹 서버간에 데이터를 전달하는 데 사용되며 일반적으로 검색기능, 결과 필터링, 매개변수 전달에 사용된다.

(Query String, GET 요청, key(news) = Value(11))
http://example/data/topic?news=11
( param값 이용, path 인자 방식, key(news) = Value(11)) → 단순 하나 조회
http://example/data/topic/news/11
🔎 CGI란?
Common Gateway Interface
웹 서버에서 동적인 웹 페이지를 생성하기 위한 방법 중 하나로, 웹 서버와 웹 애플리케이션 또는 스크립트 간에 데이터를 주고 받을 수 있도록 지원해 준다.

📄 tiny.c
/* 동적 콘텐츠을 처리하여 클라이언트에게 응답을 보내는 함수 */
void serve_dynamic(int fd, char *filename, char *cgiargs, int method_flag)
{
char buf[MAXLINE], *emptylist[] = { NULL };
/* Return first part of HTTP response */
sprintf(buf,"HTTP/1.0 200 OK\r\n");
Rio_writen(fd, buf, strlen(buf));
sprintf(buf, "Server: Tiny Web Server\r\n");
Rio_writen(fd, buf, strlen(buf));
/* fork() 새로운 프로세스를 생성하는 시스템 호출 함수 */
if (Fork() == 0) { /* Child */
/* Real server would set all CGI vars here */
if (method_flag) setenv("REQUEST_METHOD", cgiargs, 1); /* 환경 변수 설정 */
setenv("QUERY_STRING", cgiargs, 1);
Dup2(fd, STDOUT_FILENO); /* Redirect stdout to client */
Execve(filename, emptylist, environ); /* Run CGI program */
}
Wait(NULL); /* Parent waits for and reaps child */
}
🔎 HEAD method란?
리소스 요청 전, 리소스의 메타 데이터를 검사하고자 할 때 유용.
GET method와 유사하지만, Server는 응답 본문을 반환하지 않고 오직 상태 헤더만 반환!
Client는 Server로 부터 리소스의 메타데이터를 얻을 수 있지만, 실제 컨텐츠는 전송되지 않음.
실제 리소스를 다운로드하지 않아도 되기 때문에 대역폭이 절약된다.
사용자가 대량의 데이터를 다운로드 하기 전에 먼저 해당 데이터가 존재하고 적절한 크기를 가지고 있는지 확인할 수 있는 도구.
🔎 Telnet이란?
어플리케이션 계층으로, HTTP 통신할때 클라이언트 프로그램을 구현하기 전에 테스트를 위해 사용!
telnet을 이용해 원격 시스템에 접속해 HTTP 요청 메세지를 수동으로 보내고 응답을 확인하는 것이 유용.
Telnet : GET method

Telnet : HEAD method

'CS(ComputerScience)' 카테고리의 다른 글
Pintos File System (0) | 2023.05.31 |
---|---|
Pintos, Virtual Memory (0) | 2023.05.23 |
Network, 통신 Model (0) | 2023.04.19 |
명시적 가용 리스트 Explicit Free List (0) | 2023.04.13 |
묵시적 가용 리스트 Implicit Free List (1) | 2023.04.12 |