
입소하고나서부터 계속 겪던 언제자든 6시~7시에 일어나는 불면증,
2~3일동안 볼일을 못보는 변비같은 증상이 계속 생기더니
드디어 이번주에 터진거 같다.
진짜 죽는 줄 알았다.
도저히 잠을 잘수도 글을 읽을 수도 없었다.
이번주에는 tiny 서버를 기반으로 Proxy 서버를 구현하는거였는데
뭐 할수가 없었다.
화요일즈음 되서 겨우 정신을 차렸지만 이미 뭘 하기에는 너무 늦어버렸다.
그래서 일단 구현은 못해도 알고 있어야 하는것들 까지는 짚고 가기로 했다.
OS에서 제공하는 네트워크 통신용 인터페이스다.
뭐 추상적으로 말하면 가상 포트라고 할수도 있고 좀더 추상적으로 말하면 포트가 문이면 소켓은 그 문 안에 있는 방? 통로? 정도라고 할수 있다.
프로세스가 다른 컴퓨터건 같은 컴퓨터던간에 서로 데이터를 주고받을 때 이 소켓을 통해 데이터를 주고받는다고 할수 있다.
글로 설명할 바에 그냥 그림 하나를 그렸다.

예전에 대학교 전공에서 배웠던 걸 그림으로 한번 그려봤다. 클라이언트에서 서버로 요청을 보내는걸 상상도?로 그려보았다. 내가 아직 이걸 기억하는게 신기할 따름이다.
계층간 논리적 통신이란 각 계층끼리 서로 통신한다 생각한다는 의미이다. 그래서 각 계층에는 그 계층에 맞는 역할만을 하며 다른 프로세스의 같은 계층끼리 통신한다.
네트워크에서 데이터를 목적지까지 보내기 위해 사용하는 주소 체계겸 전달 규칙이다. 각 호스트는 아이피 주소를 가지고 있고 네트워크 계층에서 패킷을 전달하기 위해 출발지와 목적지 아이피를 포함하여 캡슐화한다. 그림에 묘사된것처럼 도착지가 내 아이피 주소가 아니면 역캡슐화를 하지 않는다.
캡슐화해서보내면 네트워크 계층에서는 아이피 주소만 적어 보내기 때문에 도착하는 순서를 크게 상관하지 않는다. 실제로 물리계층에서 순서대로 도착한다는 보장이 되는것도 아니다.
그러기 때문에 전송계층에서 처리를 해줘야 한다.
전송계층에서 사용하는 프로토콜 중(보통 대부분) 하나이다.
또 다른 프로토콜 중 UDP(온라인 게임에서 많이 씀)와 달리 순서대로 빠짐 없이, 중복 없이 전달하도록 보장하도록 한다.
응용계층, 그러니까 프로세스간 주고받는 규칙이다.
클라이언트에서 메서드, 경로, 헤더등을 담아 요청하면 서버가 상태코드, 헤더, 본문 등을 담아 응답한다.
UNIX에서 모든것은 파일로 취급한다. 그리고 프로세스는 파일을 직접적으로 열거나 출력을 할수 없다. 프로세스가 커널에게 시스템 콜로 요청을 하면, 커널이 파일을 열고 파일 디스크립터라는 정수번호를 프로세스에게 반환하여 사용할수 있게 한다. 파일 디스크립터는 이름을 일일히 붙이기보다는 0,1,2(각각 입력,출력, 에러) 등 정수를 붙여 관리한다.
Domain Name System의 약자이다.

우리가 쓰는 도메인 이름을 통신에 쓰는 ip 주소로 바꿔주는 시스템이다.
도메인을 입력한다고 바로 이름 자체로 통신하는게 아니라 DNS를 통해 IP 주소를 알아내고 그 주소로 접속해야 한다.
우리가 브라우저에 도메인을 입력하면 먼저 캐시에 해당 Ip가 있는지 확인하고, 없으면 재귀(local)DNS 서버에 물어보고 localDNS서버는 DNS계층(루트->TLD->권한 있는 DNS서버 순)을 따라간뒤 ip 주소를 알아내어 브라우저에게 알려준다.
DNS 계층은 루트 DNS 서버, TLD DNS 서버, 권한 있는 DNS 서버로 이루어져 있고, 루트 DNS 서버에서 .com, .net .kr 등 TLD DNS 서버의 위치를 알려주고 다시 TLD DNS 서버에서 해당하는 DNS서버가 어디있는지 또 알려주며
해당 DNS 서버에서 레코드로 저장되어있는 ip주소를 반환한다.
DNS레코드는 A레코드(도메인->IPv4), CNAME(도메인별칭->도메인), MX레코드(서버->메일서버)등이 있다.
마지막 수요 코딩회다.
마지막으로 구현하는건 스레드 풀이다.
스레드풀의 경우에는 이런식으로 구현을 했다.

스레드를 미리 선언해놨다. 스레드풀이 그런거다.
메인 스레드가 하나가 있고 들어오는 sql 요청들을 bonded queue(그림에서는 waiting queue)에 집어넣는다. 스레드는 순서 상관없이 큐에 들어오는대로 sql요청을 파싱하고 sql 실행도 하고 응답전송까지 다 한다. sql실행하는동안은 테이블에 뮤택스(락)을 걸어놓아서 다른 스레드들이 접근을 못하게 막아놓는다.
원래 결과만 내놓고 응답 전송같은건 메인스레드나 다른 전송 스레드를 만들어서 하는 편인데 우리는 그러기에는 공부시간이 부족할거 같아서 그렇게 구현하지는 않았다.
이번주는 상태가 말이 아니다.
바로 다음주차가 PintOS 인데 큰일 났다.
주말에 고향 내려가서 쉬고 오든 해야할거 같다.
그럼에도 많은 고민이 있던 한주였다.
단순히 아파서 그런거 보다는 여러가지로 생각이 많은 한주였다.
개인적인 일이라 여기 적지는 못하지만, 나름 고난도 있고 뜻있는 한주였다.