용어 정리 RIO (Robust IO) 짧은 카운트가 발생할 수 있는 네트워크 프로그램 같은 어플리케이션에서 편하고 안정적이고 효율적이 I/O를 제공한다.

client-server model 어떤 작업을 요청하는 client와 그 작업을 처리하는 server로 이뤄진 모델

FD (파일 디스크립터) 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값 (UNIX 시스템에서는 일반 정규 파일을 포함해서 모든 것을 파일이라 부른다.)

20230522 오늘은 tiny.c 코드를 분석하고 각 줄에 주석 다는 것에 집중했다. 간단한 client-server 모델이다. 클라이언트가 서버에 http 작업을 요청하면, 그 콘텐츠가 정적인지 동적인지에 다르게 그 작업을 처리해주고 콘텐츠를 제공하는 방식이다.

doit() 함수는 클라이언트의 http 요청을 다루는 함수다.

parse_uri() 함수는 URI에서 파일명과 CGI argument를 분석한다. 우선 요청이 정적 콘텐츠인지 동적 콘텐츠인지를 확인한다. 정적이라면 URI 내용에 ‘cgi-bin’이라는 문자가 들어있지 않은지를 확인한다. CGI 프로그램을 다룰 필요가 없기 때문이다. 동적 콘텐츠라면 CGI 프로그램을 다루기 때문에

serve_static() 함수의 기능은 response header를 client에게 보내고, 파일 내용(file content)을 client socket으로 보내는 것이다. 우선 파일을 받아들이고, status code, 서버 정보, connection close header, content length header, content type header를 받아들이고, 버퍼가 되는 ‘buf’ 변수에 차례차례 저장한다. 그 다음에 이 버퍼의 데이터를 client socket인 ‘fd’ (file descriptor) 변수에 기록하는 것이다. 여기까지 response header를 client에게 보내는 과정이다. 이후에는 response body를 client에게 보내야 하는데, 파일의 내용을 memory mapping으로 ‘srcp’ 변수에 읽어들이고, client socket에 기록하는 것이다. 그러고나서 매핑된 메모리를 낸다.

serve_dynamic() 함수는 동적 콘텐츠를 다루기 위한 함수이고, CGI 프로그램을 통해 진행한다. 여기서는 자식 프로세스를 사용하는데, CGI 프로그램으로 동적 콘텐츠를 다루기 위함이라고 한다. 자식 프로세스를 사용함으로써 클라이언트의 여러 요청에 대응하기 쉽다고 한다. 우선 setenv() 함수로 CGI 프로그램에 필요한 환경 변수들을 세팅하고, file descriptor 변수 ‘fd’의 값을 출력 file descriptor인 ‘STDOUT_FILENO’에 복사한다. 그 다음에는 Execve() 함수로 CGI 프로그램을 돌리는 것이다. 부모 프로세스는 자식 프로세스를 기다리고, 정적 콘텐츠를 다루면 된다.

20230523 일단 파일을 다 완성하고 이제 코드를 돌려보려 했다. 처음에 webproxy-lab 경로에서 driver shell 파일을 돌리느라 애를 무지하게 먹었다. 코드에서 포트 번호를 바꾸려 하거나 온갓 뻘짓을 다 했는데도 timeout 오류만 떴다. 깃헙 링크에 있는대로 돌린 것 뿐이었는데, 그거를 돌리는 것이 아니었나보다. /tiny 경로에서 tiny c파일을 돌리고, 포트 번호를 선언해줘야 했었다. 드디어 문제를 해결해서 좋은 기분과 계속 잘못된 것으로 시간을 잡아먹은 것에 대한 허탈감이 공존했다. 아무튼 이번주가 여태껏 가장 피곤하고 힘든 주였다. 아직까지는.. 매주 난이도가 높아질수록 더 힘들어질 것이라 예상한다.

20230524 이번 과제를 통해 서버를 만들어서 html 페이지를 열기 위해서는 포트를 열어줘야 한다. 우선 사용중인 EC2 서버의 보안 항목으로 들어가서 launch-wizard-1이라 적혀있는 보안 그룹으로 들어가야 한다. 보안 그룹 리스트가 뜨는데, 그 중 보안 그룹 이름이 launch-wizard-1이라 적힌 것을 체크하면 아래에 인바운드 규칙 창이 나올 것이다. 그 창의 오른쪽 위를 보면 인바운드 규칙 편집 버튼이 있는데 그걸 누른다. 거기에서 규칙을 추가하고 유형은 모든 트래픽으로 설정하면 된다. 그럼 포트 번호를 따로 지정해 줄 필요가 없어진다. CIDR 블록은 0.0.0.0/0을 선택해 주면 된다. 그리고 설명 칸은 선택 사항이지만, TINY 서버를 사용하기 때문에 tiny 등으로 이름을 설정해주면 좋다. TINY 서버 구현까지 완료하고 다른 사람이 올려놓은 proxy.c 파일을 돌려보고 하루를 마쳤다.