[프로젝트] tiny web server 프로젝트

예니·2021년 1월 27일
0

프로젝트

목록 보기
8/8

CSAPP 교재 11장 네트워크 프로그래밍 내용을 기반으로 tiny web server를 직접 만드는 프로젝트를 진행했다.

📅 기간 : 2021.01.21(목) ~ 2021.01.27(수)


1. 클라이언트-서버 프로그래밍 모델

한 개의 서버 프로세스와 한 개 이상의 클라이언트 프로세스로 구성됨

  1. 클라이언트가 서버에 요청을 보낸다.
  2. 서버는 요청을 받아, 자신의 자원들을 조작한다.
  3. 서버가 클라이언트에 응답을 보낸다.
  4. 클라이언트는 응답을 받아, 이것을 처리한다. (ex. 스크린에 보여주기)

2. 네트워크

(이미지 출처 : www.joinc.co.kr)

좌측은 OSI7계층, 우측은 이를 더 간단히 4계층으로 나타낸 것이다.
컴퓨터 사이의 데이터 전송은 이 계층을 거쳐서 이루어진다.

4계층의 각 역할은 다음과 같다.

  1. Application Layer
    네트워크를 사용하는 응용프로그램으로 이루어짐 (ex. FTP, Telnet, SMTP)
  2. Transport Layer
    각각의 시스템 연결, TCP 프로토콜을 이용하여 데이터 전송
  3. Internet Layer
    데이터 정의, 데이터 경로 배정(라우팅)
    정확한 데이터 라우팅을 위해 IP프로토콜 사용
  4. Physical Layer
    물리적 계층 (ex. 이더넷 카드와 같은 하드웨어)

  • TCP
    - 연결지향 : 데이터 송신 측과 데이터 수신 측에서 전용의 데이타 전송 선로(Session)를 만듦
    - 데이터의 신뢰도가 중요한 곳에 사용 (ex. 이메일, 채팅)
  • UDP
    - 비연결지향 : 단순히 데이터를 받거나, 던져주기만 함
    - 실시간 미디어 전송에 사용 (화질 저하되더라도 계속 전송이 중요한 곳)

3. 소켓 프로그래밍

소켓은 연결의 종단점. IP와 port로 이루어짐.

소켓 인터페이스 기반 네트워크 응용프로그램

<클라이언트>

  1. socket
    소켓 식별자 생성
  2. connect
    서버와의 연결 수립

<서버>

  1. socket
    소켓 식별자 생성
  2. bind
    서버의 소켓 주소를 소켓 식별자와 연결
  3. listen
    생성한 소켓을 능동 소켓에서 듣기 소켓으로 변환
    듣기 소켓은 클라이언트로부터의 연결 요청 승락 가능
    listen 대기열에 클라이언트들이 줄 서고, 차례로 처리함
  4. accept
    클라이언트로부터의 연결 요청을 기다림
    연결되면 연결 식별자를 반환함
    듣기 식별자는 계속 있고, 연결 식별자로 연결함
    연결 식별자는 서버가 연결 요청을 수락할 때마다 생성됨

4. 웹 서버

HTTP (Hypertext transfer protocol)

TCP/IP는 사람이 읽을 수 없었다면, HTTP는 사람이 읽을 수 있다!

웹 클라이언트와 서버는 텍스트 기반 응용 수준 프로토콜인 HTTP로 상호 연동한다.

  • 웹 클라이언트 : 서버로의 인터넷 연결 오픈, 컨텐츠 요청
  • 서버 : 요청 컨텐츠에 응답하고 연결 닫음
  • 브라우저 : 컨텐츠를 읽어 스크린에 보여줌

<웹 컨텐츠>

클라이언트와 서버에게 컨텐츠는 MIME 타입을 갖는 바이트 배열

  • 정적 컨텐츠
    디스크 파일
  • 동적 컨텐츠
    실행파일이 런타임에 만든 출력

<HTTP 트랜잭션>

  • HTTP 요청
    위 이미지에서 5-6번줄
    요청라인, 요청 헤더

  • HTTP 응답
    위 이미지에서 8번줄부터
    응답라인, 응답 헤더, 응답 본문


🪞 Tiny web server 프로젝트 회고

서버 터졌다 라는 말을 굉장히 많이 들어봤고, 사용해봤을 것이다.
학교 다닐 때, 수강신청 사이트 서버가 자주 터졌었고, 연말연시에 카카오톡, 배달의 민족 서버가 자주 터진다.
서버를 직접 구현해보지 않았을 때는 서버가 왜 터지는지, 왜 견고하게 만들지 않는지 의문이 들었었다.
하지만 동기들의 새로고침 여러 번 공격에 쉽게 터지는 내 서버를 보며, 터지지 않는 견고한 서버를 만들기란 매우 많은 노력이 들어가는 작업이란 것을 깨달았다.
견고한 서버를 만들지는 못했지만, tiny web server 구현을 위해 전반적인 네트워크 프로그래밍에 대해 공부했다.
소켓에 대해 공부하면서 파일 식별자, 파일 입출력에 대해서도 알 수 있었다.
정적 파일, 동적 파일이란 말은 많이 들어봤는데 자세히는 몰랐다. 이번에 직접 정적 파일, 동적 파일을 처리해보면서 의미와 차이점을 뼈저리게 느낄 수 있었다.
이번 프로젝트를 진행하며 가장 뿌듯했던 점은 MIT - Missing semester 강의를 들으며 배웠던 vim, tmux, telnet 등을 프로젝트에 이용했다는 점!
Missing semester 스터디를 하면서 '이 내용들은 현업에 가서나 쓰이겠구나..' 싶었는데 이렇게 바로 프로젝트에 이용할 수 있어 재밌었다.
아직도 부족한 점이 많지만, 아무 생각없이 사용하던 웹의 동작 원리에 대해 이해할 수 있는 정말 좋은 기회였다. 컴퓨터는 알면 알수록 정말 멋지고 바쁜 친구다.
앞으로는 어떤 서비스의 서버가 터지면 슬픔을 공감해줘야겠다!😃

0개의 댓글