이 글은 bryant 컴퓨터 시스템에 기반하여 정리 하였다.
tiny web server 구현하기에 앞서 Robust I/O package 에 대한 이해가 중요할 것 같아 코드 정리가 된 블로그를 첨부함
참고로 rio_t 구조체는 다음과 같이 선언되어 있다.
x86-64에서 size_t는 unsigned long으로 정의되고, ssize_t(signed size)는 long으로 정의된다.
소켓은 end point로 이해할 수 있다. 각 소켓은 인터넷 주소와 16비트 정수 포트로 이루어진 소켓 주소를 가진다.
리눅스 커널의 관점으로 보면, 소켓은 통신을 위한 끝점이다.
Unix 프로그램의 관점으로 보면, 소켓은 해당 식별자를 가지는 열린 파일이다.
위 그림은 웹 클라이언트와 서버 간의 연결을 보여 준다.
웹 클라이언트 소켓 주소
128.2.194.242:51213
여기서 포트 51213은 커널이 할당한 단기 포트이다.
웹 서버의 소켓 주소
208.216.181.15:80
여기서 포트 80은 웹 서비스와 연관된 잘 알려진 포트이다.
이 그림은 전형적인 클라이언트 - 서버 트랜잭션의 문맥에서 소켓 인터페이스의 전반적인 흐름을 보여주고 있다. 이 내용에 대해서는 뒷 부분에 tiny web server를 구현해 보면서 자연 스럽게 받아 들일 수 있다.
그림으로 좀 더 이해하기 쉽도록 그려 보았다.
telnet으로 연결요청하면 header와 body정보를 모두 불러준다.
웹 클라이언트와 서버는 HTTP(Hypertext Transfer Protocol)라고 하는 텍스트 기반 응용 수준 프로토콜을 사용해서 상호 연동한다.
웹 클라이언트(브라우저라고 불림)는 서버로의 인터넷 연결을 오픈하고 컨텐츠를 요청한다.
서버는 요청한 컨텐츠로 응답하고, 그 후에 연결을 닫아 준다. 브라우저는 컨텐츠를 읽고 이것을 스크린에 보여준다.
웹 클라이언트와 서버에게 컨텐츠란 MIME(Multipurpos Internet Mail Extensions)타입을 갖는 바이트 배열을 의미한다.
다음 표는 MIME 타입의 예를 보여준다.
웹 서버는 두가지 방법으로 클라이언트에게 컨텐츠를 제공한다.
디스크 파일을 가져와서 그 내용을 클라이언트에게 보낸다. 디스크 파일은 정적 컨텐츠 라고 하며, 파일을 클라이언트에게 돌려주는 작업을 정적 컨텐츠를 처리한다고 말한다.
실행 파일을 돌리고, 그 출력을 클라이언트에게 보낸다. 실행 파일이 런타임에 만든 출력을 동적 컨텐츠라고 하며, 프로그램을 실행하고 그 결과를 클라이언트에게 보내주는 과정을 동적 컨텐츠를 처리한다고 말한다.
HTTP가 인터넷 연결 위로 전송된 텍스트 라인들에 기초하고 있기 때문에 리눅스 TELNET 프로그램을 사용해서 인터넷 상의 모든 웹 서버와 트랜잭션을 수행할 수 있다.
1 linux> telnet www.aol.com 80 Client: open connection to server
2 Trying 205.188.146.23... Telnet prints 3 lines to the terminal
3 Connected to aol.com.
4 Escape character is ’^]’.
5 GET / HTTP/1.1 Client: request line
6 Host: www.aol.com Client: required HTTP/1.1 header
7 Client: empty line terminates headers
8 HTTP/1.0 200 OK Server: response line
9 MIME-Version: 1.0 Server: followed by five response headers
10 Date: Mon, 8 Jan 2010 4:59:42 GMT
11 Server: Apache-Coyote/1.1
12 Content-Type: text/html Server: expect HTML in the response body
13 Content-Length: 42092 Server: expect 42,092 bytes in the response body
14 Server: empty line terminates response headers
15 <html> Server: first HTML line in response body
16 ... Server: 766 lines of HTML not shown
17 </html> Server: last HTML line in response body
18 Connection closed by foreign host. Server: closes connection
19 linux> Client: closes connection and terminates
다음 프로젝트에 대한 내용은 github에 주석으로 잘 정리해 두었다.
https://github.com/Wu22e/JUNGLE_OS_PROJECT/tree/main/WEEK07