Web Proxy Web Proxy는 웹 브라우저와 end server 사이에서 중간자 역할을 하는 프로그램으로, 웹 페이지를 가져오기 위해서 브라우저가 end server에 직접 연결하는 대신에 proxy server에 연결하여 요청을 전달할 수 있다. 그리고 end server가 proxy server에 응답을 하면, proxy server가 응답을 브라우저에 전달을 하는 방식이다. proxy의 역할 Firewall 프록시는 방화벽 외부에 있는 브라우저가 end server에 접근할 때, 프로시를 통해서만 접근이 가능하게 만들어주는 중개자 역할을 할 수 있다. 즉, 이러한 기능을 통해 내부 네트워크는 외부로부터 보호될 수 있다. Anonymizers(익명 처리기) 클라이언트가 직접 서버와 통시하는 경..
사용되는 보조 함수들 소개 string 관련 함수들 sscanf sprintf strcasecmp strcmp strstr strcpy strcat 파일 관련 함수들 stat 프로세스와 관련된 함수들 fork 자식 프로세스를 생성하는 함수로, fork 함수의 반환값은 자식 프로세스는 0, 부모 프로세스는 자식 프로세스의 PID이다. fork()를 실행하면 부모 프로세스와 자식 프로세스가 동시에 실행된다. 만약에 fork()의 반환값이 0이라면. 즉, 자식 프로세스라면 if문을 수행한다. fork()의 반환값이 0이 아니라면. 즉, 부목 프로세스라면 if문을 건너뛰고 Wait(NULL)함수로 가는데, 이는 부모 프로세스가 먼저 도달해도 자식 프로세스가 종료될 때까지 기다리는 함수이다. setenv(대상 환..
HTTP(Hypertext Transfer Protocol) 웹에서 웹 클라이언트(브라우저)와 웹 서버가 서로 정보를 주고 받을 수 있는 응용 계층의 프로토콜 중 하나로 TCP/IP 프로토콜을 이용한다. 이때, HTTP는 이미지, 텍스트, 오디오 등 여러 가지 유형의 데이터들을 주고 받을 수 있는데, 이런 웹 컨텐츠는 MIME 타입으로 인코딩된다. MIME타입(Multipurpose Internet Mail Extensions) 웹 서버에서 전송되는 여러 종류의 컨텐츠 유형들을 전달하기 위해 필요한 매커니즘이다. 다음과 같은 역할을 한다. 바이너리 파일의 송수신 : 웹은 텍스트 파일 뿐만 아니라 여러 바이너리 파일(오디오, 이미지, 비디오 등)을 전송하기도 한다. 이런 바이너리 파일들을 문제없이 전달하기..
getaddrinfo() 모든 프로토콜에 대해 호스트 이름, 호스트 주소, 포트 번호, 서비스 이름을 소켓 주소 구조체로 변환해준다. 즉, 네트워크 호스트 정보를 받아서 IP address를 가져오거나, 그 반대를 수행하는 함수이다. 특징으로는 멀티 쓰레딩시에 문제가 없고, IPv4나 IPv6 등 특정 IP protocol에 의존할 필요가 없다는 점이 있다. int getaddrinfo(const char *host, /* Hostname or address */ const char *service, /* Port or service name */ const struct addrinfo *hints,/* Input parameters */ struct addrinfo **result); /* Output..
RIO(Robust I/O) RIO 버퍼 없는 입력 및 출력 함수 메모리와 파일 간에 직접 데이터를 전송할 수 있게 한다. rio_readn 현재 파일 식별자 fd에서 n만큼의 데이터를 버퍼 usrbuf로 보낸다. #include "csapp.h" ssize_t rio_readn(int fd, void* usrbuf, size_t n) int fd : 내가 보낼 바이트가 저장된 현재 파일의 위치 void *usrbuf : 파일에서 전송할 대상 메모리 버퍼의 위치 size_t n : 전송할 바이트의 수 리턴 값 : 성공하면 전송한 바이트의 수를 반환하고, EOF를 읽기 중에 만나면 0, 에러가 나면 -1을 반환한다. rio_writen 현재 메모리의 버퍼 usrbuf에서 n만큼의 데이터를 파일 식별자 fd..
getaddrinfo()와 소켓 인터페이스를 더욱 편리하게 사용할 수 있는 소켓 인터페이스를 위한 도움 함수들을 소개하는 이번 절의 목적이다. open_clientfd 클라이언트가 서버와 연결을 설정하는 함수로 클라이언트의 getaddrinfo부터 connect까지 담당한다. #include "csapp.h" int open_clientfd(char *hostname, char *port); 서버의 호스트 이름(또는 IP주소)와 원하는 서비스(포트 번호)를 입력하여 해당 서버의 소켓 주소 구조체의 형식과 맞는 클라이언트의 소켓을 만들고 연결한다. char *hostname : 내가 연결하고 싶은 서버 호스트의 IP 주소 char *port : 해당 서버 프로세스의 서비스 종류. 즉, 포트 번호 리턴 값 ..
소켓이란? 클라이언트와 서버는 소켓 식별자를 읽고 쓰면서 서로 통신하는데, 이때 소켓은 통신 양 끝 점을 담당한다. Berkeley Socket(BSD Socket)에서는 소켓을 File Descriptor의 형식이며, Unix의 철학인 모든 것은 파일이다에서부터 출발했다고 정의한다. 따라서 네트워크를 포함한 모든 Unix I/O 디바이스들은 파일이므로 소켓 역시 네트워크 상의 다른 프로세스와 통신하는 역할을 하는 파일로 볼 수 있다. 그리고 현재의 Internet 소켓들은 대부분 이런 BSD 표준을 따른다. File Descriptor 소켓 주소 IP 주소 + 포트 번호로 표현할 수 있다. generic 소켓 주소 구조체인 sockaddr은 connect, bind, accept 함수의 인자로 넣어주기..
파일 디스크립터란 리눅스 혹은 유닉스 계열 시스템에서 프로세스가 파일을 다룰 때 사용하는 개념이다. 즉, 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값이다. 이러한 파일 디스크립터는 일반적으로 0이 아닌 정수값을 가진다. 흔히 유닉스 시스템에서 모든 것을 파일이라고 한다. 일반적인 정규파일을 포함해 디렉토리, 소켓, 파이프, 블록 디바이스, 케릭터 디바이스 등 모든 객체들을 파일로 관리한다. 따라서 유닉스 시스템에서 프로세스가 이 파일들을 접근할 때 파일 디스크립터라는 개념을 사용한다. 과정은 다음과 같다. 프로세스가 실행중에 파일을 Open하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중 사용하지 않는 가장 작은 값을 할당해준다. 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 ..
글을 쓰기에 앞서 소켓이란 해당 식별자를 가지는 열린 파일이라는 것을 알아두고 가자. Host IT 분야에서는 호스트란 네트워크에 연결되어 있는 컴퓨터들이다. 인터넷은 TCP/IP 프로토콜을 이용하여 통신을 하는데, 통신을 하려고 해도 목적지와 출발지가 없으면 어디로 데이터를 보낼지 받을지 모른다. 따라서 IP라는 고유한 주소를 통해 목적지와 출발지를 구할 수 있으며 , 이때 호스트는 IP 주소를 갖는다. 즉, 호스트는 IP를 가지고 있는 양방향 통신이 가능한 컴퓨터라는 점을 기억하자. URL, URI 결론부터 말하면 URI는 자원의 위치이고, URL은 자원의 식별자이다. 쉽게 얘기하면 우리가 주소창에 입력하는 전체 주소는 사실 URL이 아니고 URI이다. 즉, URI가 더 큰 범주이고, URL은 그 범..
Client Server Architecture 소개 클라이언트 서버 아키텍처란 다음과 같이 리소스를 사용하는 앱(클라이언트)와 리소스가 존재하는 곳(서버)를 분리시키는 모델을 의미하며, 2-tier 아키텍처라고도 부른다. 이때, 클라이언트는 웹/앱을 이용하는 사용자를 뜻하며, 클라이언트는 네이버나 구글과 같은 웹 브라우저를 통해서 서버에 원하는 데이터를 요청한다. 이렇듯 브라우저는 클라이언트가 이용하는 도구로써 사용자와 상호작용을 하게 된다. 그리고 서버는 클라이언트의 요청을 처리해서 응답한다. 아래 그림을 쇼핑몰이라고 하면 클라이언트는 쇼핑몰 웹사이트를 통해서 결제, 상품 조회 기능 등을 사용할 수 있고, 클라이언트가 특정 의류 상품을 클릭하면 서버에서는 의류의 상품 정보를 보내준다. 3-tier A..