1번
🔍 문항
client-server model에 대해서 설명하시오
🙋♀️ 답안
클라이언트-서버 모델은 네트워크에서 정보를 주고받는 방식이다. 클라이언트는 정보를 요청하고, 서버는 요청된 정보를 제공한다.
2번
🔍 문항
HTTP request와 response에 대해서 아는 대로 설명하시오
🙋♀️ 답안
- HTTP 요청(Request):
클라이언트가 서버에게 정보나 작업을 요청할 때 사용된다.
- 요청 라인: 요청 메서드(GET, POST, PUT, DELETE 등), 요청하는 자원의 경로, 사용하는 프로토콜과 버전
- 헤더(Headers): 요청에 대한 부가적인 정보를 포함하며, 헤더 이름과 값의 쌍으로 구성
- 본문(Body): 요청의 추가 데이터를 포함할 수 있습니다. POST 요청 등에서 사용
- HTTP 응답(Response):
서버가 클라이언트의 요청에 대한 응답을 전송할 때 사용된다.
- 상태 라인: 응답 상태 코드(200, 404, 500 등), 상태 코드에 대한 설명, 사용하는 프로토콜과 버전
- 헤더(Headers): 응답에 대한 부가적인 정보를 포함하며, 헤더 이름과 값의 쌍으로 구성
- 본문(Body): 서버가 클라이언트에게 전달하는 데이터를 포함(HTML 문서, 이미지, JSON 등의 형태)
3번
🔍 문항
HTTP status code에 대해서 아는 대로 말하시오
🙋♀️ 답안
HTTP 상태 코드는 클라이언트가 서버에 보낸 요청에 대한 결과를 나타내는 세 자리 숫자이다.
1xx (Informational): 요청을 처리하는 데 정보가 필요한 경우
2xx (Success): 요청이 성공적으로 처리되었음
3xx (Redirection): 요청을 완료하기 위해 추가 동작이 필요한 경우
4xx (Client Error): 클라이언트의 요청에 오류가 있음
5xx (Server Error): 서버가 요청을 처리하는 동안 오류가 발생했음
4번
🔍 문항
web browser/client에서 http://www.myserver.com:8080/index.html 를 요청했을 때 network 및 client에서 어떤 일이 일어나는지 아는 대로 설명하시오
🙋♀️ 답안
- URI parse: URI -> protocol=http, host=www.myserver.com, port=8080, path=/index.html
- www.myserver.com 의 IPv4 address를 알기 위해 설정된 name server로 DNS A query.
- name server의 답변으로 알게 된 IP address 의 8080 port로 TCP/IP connection 시도
- GET /index.html HTTP/1.1 로 시작하는 HTTP request message를 전송하고 response를 기다림
5a. HTTP response의 status code가 200 OK 면 body를 Content-Length 만큼의 byte 수 만큼 읽어서 Content-Type과 함께 browser의 renderer로 전송
5b. status code가 301 혹은 302면 Location 으로 전달된 URI로 다시 HTTP request를 전송
5c. status code가 4xx 혹은 5xx면 정해진 error message를 rendering 해서 출력
5번
🔍 문항
5-a. Proxy 2번째 과제를 수행하기 위해서는 CS:APP 12장 동시성 프로그래밍에서 소개한
- 다중 프로세스 (multi-process)
- I/O 멀티플렉싱 (I/O multiplexing)
- 다중 스레드 (multi-thread)
중 하나를 사용해야 했다.
각각의 방법에 대해서 아는 대로 기술하고, 동시성을 구현하지 않은 서버와 어떻게 다른지 설명하라.
5-b. multi-process와 multi-thread에 대해서 좀 더 자세히 비교하라.
- process와 thread 모델의 차이를 설명하고
- 구체적으로 어떤 함수를 사용하여 새로운 프로세스/스레드를 만들며
- 생성된 프로세스/스레드가 끝나는지를 생성한 프로세스/스레드가 어떻게 감지하는지도 설명하라
- HTTP/proxy 서버가 새로운 request를 받을 때, response가 끝날때 어떻게 처리되는지도 설명할 수 있으면 좋다.
🙋♀️ 답안
5-a.
- 다중 프로세스: 서버는 각 클라이언트 요청마다 새로운 프로세스를 생성하여 처리한다. 각 프로세스는 독립적으로 실행되며 자원을 공유하지 않는다.
- I/O 멀티플렉싱: 단일 스레드에서 여러 개의 I/O 작업을 동시에 처리한다. 이벤트 루프를 사용하여 여러 클라이언트의 요청을 감지하고 처리한다.
- 다중 스레드: 서버는 각 클라이언트 요청마다 새로운 스레드를 생성하여 처리한다.. 스레드는 프로세스 내에서 실행되며 메모리를 공유한다.
동시성을 구현하지 않은 서버는 한 번에 하나의 요청만 처리할 수 있기 때문에 동시에 여러 클라이언트의 요청을 처리하는 데 적합하지 않다.
5-b.
- process는 컴퓨터를 추상화 한 것, thread는 CPU core를 추상화 한 것
- fork() vs pthread_create(tid, attr, func, arg)
- wait(wstatus) vs pthread_join(thread, retval)
- fork후 dup2로 fd 복제 후 필요없는 fd close vs thread 함수에 fd 넘겨준 후 detach
이번 프로젝트에서 네트워크 입출력에 대해서는 표준 입출력 함수를 쓰지 않고 RIO 함수들을 사용하였다.
RIO 함수를 사용했어야 하는 이유, 즉 RIO 함수들을 만든 이유를 아는 대로 설명하시오
RIO(robust I/O) 함수들은 네트워크 프로그래밍에서 안정적이고 효율적인 입출력(IO) 작업을 위해 사용된다 표준 입출력 함수들보다 더 많은 제어와 안정성을 제공한다.
- 에러 처리: RIO 함수들은 에러 처리를 강화하여 안정성을 높인다. 네트워크 통신에서 발생할 수 있는 다양한 에러 상황을 예측하고 처리할 수 있다. 이를 통해 예기치 않은 프로그램 종료를 방지하고, 안정적인 서비스를 제공할 수 있다.
- 시그널 블록: RIO 함수들은 시그널 블록(signal blocking)을 사용하여 입출력 작업을 안전하게 수행한다. 시그널은 프로그램이 동작 중에 발생할 수 있는 강제 종료나 예외 상황을 처리하는 데 사용된다. RIO 함수들은 시그널이 입출력 작업 중에 발생할 경우 해당 작업을 블록하고, 작업이 완료된 후 시그널을 처리한다.
- 버퍼 관리: RIO 함수들은 자체적으로 버퍼를 관리하여 입출력 작업을 최적화한다. 네트워크 통신에서 발생하는 지연을 최소화하고, 대용량 데이터 전송 시에도 효율적으로 처리할 수 있도록 설계되어 있다.
- 이식성: RIO 함수들은 플랫폼에 독립적으로 설계되어 있어서, 서로 다른 운영체제나 하드웨어에서도 일관된 동작을 보장한다. 이를 통해 프로그램의 이식성을 높이고, 다양한 환경에서 안정적으로 동작할 수 있다.
Status code 401 Unauthorized와 403 Not allowed의 차이점을 설명하시오
401 - Authorization 정보가 필요한 resource임. Authorization 정보 포함해서 request 바람.
login 해야 볼 수 있는 page에 login 안 하고 요청한 경우.
Authorization 정보를 포함해서 다시 요청하라는 의미이므로,
browser는 이후 login process등으로 진행
403 - access denied. 접근 불가. 권한 없음.
login을 했어도 권한이 없는 경우, login 이외의 다른 정보를 기반으로 접근을 막을 수도 있음
참고: https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
403은 404 Not Found와는 달리 해당 URI에 resource가 존재한다는 의미를 가지므로
DDoS를 예방하기 위해 일부러 404로 답하기도 한다.
CGI (common gateway interface) 가 무엇이고 왜 만들었는지, 이것이 어떻게 발전했는지 아는대로 말하시오.
https://en.wikipedia.org/wiki/Common_Gateway_Interface
후에 fastCGI, PHP, Servlet, JSP, ASP 등으로 발전, application server라는 장르 개척
JavaScript의 발전으로 SPA(single page application), Client-side Rendering이 발전하자 Server-side rendering이라 불림