CSAPP 교재 11장 네트워크 프로그래밍
내용을 기반으로 tiny web server를 직접 만드는 프로젝트를 진행했다.
한 개의 서버 프로세스와 한 개 이상의 클라이언트 프로세스로 구성됨
(이미지 출처 : www.joinc.co.kr)
좌측은 OSI7계층, 우측은 이를 더 간단히 4계층으로 나타낸 것이다.
컴퓨터 사이의 데이터 전송은 이 계층을 거쳐서 이루어진다.
4계층의 각 역할은 다음과 같다.
Application Layer
Transport Layer
Internet Layer
Physical Layer
TCP
UDP
소켓은 연결의 종단점. IP와 port로 이루어짐.
소켓 인터페이스 기반 네트워크 응용프로그램
socket
connect
socket
bind
listen
accept
HTTP (Hypertext transfer protocol)
TCP/IP는 사람이 읽을 수 없었다면, HTTP는 사람이 읽을 수 있다!
웹 클라이언트와 서버는 텍스트 기반 응용 수준 프로토콜인 HTTP로 상호 연동한다.
클라이언트와 서버에게 컨텐츠는 MIME 타입을 갖는 바이트 배열
HTTP 요청
위 이미지에서 5-6번줄
요청라인, 요청 헤더
HTTP 응답
위 이미지에서 8번줄부터
응답라인, 응답 헤더, 응답 본문
서버 터졌다
라는 말을 굉장히 많이 들어봤고, 사용해봤을 것이다.
학교 다닐 때, 수강신청 사이트 서버가 자주 터졌었고, 연말연시에 카카오톡, 배달의 민족 서버가 자주 터진다.
서버를 직접 구현해보지 않았을 때는 서버가 왜 터지는지, 왜 견고하게 만들지 않는지 의문이 들었었다.
하지만 동기들의 새로고침 여러 번 공격에 쉽게 터지는 내 서버를 보며, 터지지 않는 견고한 서버를 만들기란 매우 많은 노력이 들어가는 작업이란 것을 깨달았다.
견고한 서버를 만들지는 못했지만, tiny web server 구현을 위해 전반적인 네트워크 프로그래밍에 대해 공부했다.
소켓에 대해 공부하면서 파일 식별자, 파일 입출력에 대해서도 알 수 있었다.
정적 파일, 동적 파일이란 말은 많이 들어봤는데 자세히는 몰랐다. 이번에 직접 정적 파일, 동적 파일을 처리해보면서 의미와 차이점을 뼈저리게 느낄 수 있었다.
이번 프로젝트를 진행하며 가장 뿌듯했던 점은 MIT - Missing semester 강의를 들으며 배웠던 vim
, tmux
, telnet
등을 프로젝트에 이용했다는 점!
Missing semester 스터디를 하면서 '이 내용들은 현업에 가서나 쓰이겠구나..' 싶었는데 이렇게 바로 프로젝트에 이용할 수 있어 재밌었다.
아직도 부족한 점이 많지만, 아무 생각없이 사용하던 웹의 동작 원리에 대해 이해할 수 있는 정말 좋은 기회였다. 컴퓨터는 알면 알수록 정말 멋지고 바쁜 친구다.
앞으로는 어떤 서비스의 서버가 터지면 슬픔을 공감해줘야겠다!😃