[WIL] week8

dolggul2·2026년 4월 23일

jungle

목록 보기
11/16
post-thumbnail

학습 목표

개인 학습 목표

  • 개념: BSD소켓, IP, TCP, HTTP, file descriptor, DNS, DMA
  • 교재: 강의 내용 정리, CSAPP 11.1 (클라이언트-서버 프로그램이 모델) ,CSAPP 11.2 (네트워크) ,CSAPP 11.3 (글로벌 IP 인터넷), CSAPP 11.4 (소켓 인터페이스, 에코서버). CSAPP 11.5 (웹 서버), CSAPP 11.6 (소형 웹 서버)
  • 과제: csapp 11장 tiny 웹 서버, 문제 풀기 (11.6), 문제 풀기 (11.7), 문제 풀기 (11.9), 문제 풀기 (11.10), 문제 풀기 (11.11), proxy 서버 구현 (순차, 병렬, 캐시)

개념

개념을 배울 때, 이번 주차에서 요구하는 수준까지만 제한하여 진행했다. 예를 들면, TCP의 신뢰성있는 연결에 사용되며 통화와 비슷하다는 식으로 이해하고 넘어갔다. 반대로 UDP의 경우는 이메일을 보내는거처럼, 수신했는지 여부가 중요하지 않는 방식이다.

깊이 있게 배운다는게 우선순위가 떨어진다 판단했다. 깊이 있게 들어가는게 중요하다 했지만, 주차가 지날때바다 한 단계씩 깊에 들어간다. 그래서 굳이 지금 당장 파볼 필요도 없고, 이번주에 사용되는 다른 개념이나 실습 과제를 수행하는게 학습 효율성이 높다 판단했다. 파고들어 밑단에서 어떻게 동작하는지를 이해해야 직성이 풀렸는데, 빠르게 배우기 위해선 추상 레벨에서 어떻게 동작하는지 받아들일 필요가 있었다.

아쉽게도 IP, TCP, DNS, HTTP, 소켓, FD 정도만 가볍게 다루어보았고, DMA는 보지 못했다. 언제가 만나는 날이 있으리.

교재

CSAPP 내용은 개략적으로 빠르게 이해하고, 코드 내용은 직접 따라 쳐보면서 모르는것들만 찾아보았다. CSAPP 번역에 아쉬운 부분이 있는데, NotebookLM 서비스로 대체했다. 코치님들이 우려했듯, 내용이 굉장히 많았기 때문에 흐름을 이해하고 넘어가는것이 중요했다.
덕분에 모든 챕터를 다 볼 수 있었다.

과제

echo server 는 코치님께서 말씀하셨듯 흐름만 이해하고 넘어가면 되었다. 하지만, 막상 공부할땐 기억나지 않아 간단하게 구현해보았다. 구현하고나니, 역시 코치님말대로 넘어갔어도 되었겠다 싶었다.

tiny server에서 본격적으로 필요한 함수들을 작성하면서, 어떤 식으로 통신이 일어나는지가 보였다. 책을 보고, 필요한 기능을 구현해나갔다.

proxy server는 tiny server에서 중간에 proxy server를 추가하는 과제다. 중간에서 요청을 분석하고, tiny server로 넘겨주는 구조다. 동시성이나, 캐싱까지 전용시키는 과제였고, 현재 proxy server를 구현하는 중에 있다. 로직을 직접 설계하고, 짜보는식으로 진행하니 시간이 많이 걸린다. 왠만하면 직접 끝까지 구현해, 어떻게 캐싱을 이용하는지를 배워보고 싶다.

echo server

HTTP 프로토콜은 통신을 클라이언트, 서버로 바라본다. 실제로 어떻게 통신하는지를 프로그래밍 레벨에서 이해하기에 정말 좋았다. 소켓을 생성하고, 통신하고, 닫는 과정을 직접 해보니 어떤식으로 돌아가는지 명확히 알게되었다. 이 지식이 DBMS를 HTTP 요청으로 동작하도록 만들 때, 큰 도움이 되었다.

tiny server

GCI 개념이 등작하면서 동적 요청을 어떻게 처리하는지를 배웠다. GCI는 굉장히 예전에 생긴 개념이고, 그 보다 발전한 Fast CGI도 있고 FastAPI나 flask에서는 다른 인터페이스를 사용한다고 한다. 여튼, GCI를 통해 동적 요청이 어떻게 처리되는지를 배울 수 있었다.

tiny server에서는 cgi-bin 이라는 path를 갖는 경우에는 동적 요청으로 해석했다. GCI를 따르면 동적 요청이 들어오면, 그때마다 파일을 실행하고 결과를 연결 소켓을 전송하게 된다. 여기서는 들어온 두 수를 더하는 프로그램을 사용했다.

에러사항

CGI 프로그램 내부에서 간단한 버그?가 있었다. path에서 인자가 2개 들어오는데, 출력문에서는 1개까지밖에 보이지 않는다. 계산 결과는 멀쩡히 나왔기에 표기상 문제가 생겼다고 판단했다.

int main(void)
{
  char *buf, *p;
  char arg1[MAXLINE], arg2[MAXLINE], content[MAXLINE];
  int n1 = 0, n2 = 0;

  /* Extract the two arguments */
  if ((buf = getenv("QUERY_STRING")) != NULL)
  {
    p = strchr(buf, '&');
    *p = '\0';
    strcpy(arg1, buf);
    strcpy(arg2, p + 1);
    n1 = atoi(strchr(arg1, '=') + 1);
    n2 = atoi(strchr(arg2, '=') + 1);
    *p = '&'; // 이게 없다면, path가 중간에 짤리게 된다.
  }

buf가 받은 인자를 가리키도록 만들어진다. 여기서 파싱하는 과정에서 &를 \0 문자로 바꾸게 된다. 이때를 기준으로 문자열을 읽어 n1, n2에 저장하고 계산에 활용한다. 문제는 \0이 문자열의 끝을 의미하니까, buf를 그대로 출력하면 중간에 끊기 되는 것이다. 그래서 다시 &를 추가해, buf에 저장되어었던 인자가 전부 출력되게 고칠 수 있었다.

proxy server

가장 귀찮았던 부분은 request를 파싱하는 부분이였다. method, uri, version으로 나누어 저장하고, uri에서는 domain, port, path로 나눠야했다. 특정 문자에 대해 포인터를 남기고, 필요한 부분을 strcpy를 이용해 포인터에 저장했다. 이게 여간 귀찮은게아니다. 직접 해보면 생각보다 오류가 많이 나서, 시간이 가장 많이 걸렸다.

수요 코딩회

server

parsing

queue

thread pool

회고

팀 활동


분위기도 좋았고, 배운점도 많았다. 팀 구현도 무리하지 않았고, 각자 맡은 바를 설명하는 식으로 다른 기능에 대한 이해도를 높일 수 있었다. 회고 내용이 짧아 의심할 수 있지만, 정말 만족한다.

한 팀원분께서 퀴즈를 준비해주셔서 감사했다. 귀찮을 수 있으니, 다음에는 돌아가면서 준비한다면 좋지 않을까 하는 생각이 들었다. 그리고 한번은 같이 배달 음식을 시키자는 의견도 있었다. 다이어트중이실텐데... 치팅데이?

컨디션 관리

개인적으로 의사소통에 아쉬움을 느낀다. 공부하는데는 지장이 없지만, 사람을 대할 때 힘이 없으면 반응을 제대로 못한다. 대답을 잘 못하거나 반응이 없다면 상대방도 나에게 다가오기가 어려운것 같다. 그걸보고 나도 선뜻 다가가지 못하게 되는 악숙환이 생기는것 같다.

저녁에 가볍게 운동을 하니 이런 문제를 해결할 수 있었다. 피가 돌아서 그런지 다시 힘이나고, 다른 사람의 말을 들을 여유도 조금 생겼다. 공부는 개인 목표치만큼 수행하니, 다른 시간은 소프트 스킬을 키우기 위해 소통하는데 투자해보려 한다.

profile
delve into computer

0개의 댓글