컴퓨터 사이언스

컴퓨터 사이언스/Network

fork() 시스템 콜

개요 accept() 함수의 경우 한번에 하나의 클라이언트와 연결을 맺을 수 있었다. 그렇다면 for문을 돌려 여러번의 accept() 함수를 호출할 수 있지 않을까 생각이 들 수 있다. 하지만 한 클라이언트와 연결을 설정한 후에는 해당 클라이언트가 연결을 종료할 때까지 또 다른 클라이언트와 통신할 수 없다. 이때, 사용해야 하는 것이 멀티 프로세스이며, 이에 사용되는 시스템 콜이 바로 fork()이다. fork() 시스템 콜 특정 프로세스에서 fork() 시스템 콜을 호출하면 호출한 프로세스와 똑같은 메모리 자원이 메모리에 그대로 복사된다. 이때, 복사된 프로세스를 자식 프로세스라고 하고, 복사한 프로세스를 부모 프로세스라고 한다. 즉, 부모는 자식에게 본인의 프로세스를 복사해서 전달하며, 자식은 해당..

컴퓨터 사이언스/Network

클라이언트의 시스템 콜(connect)

서버에서는 socket() 함수로 소켓 디스크립털르 할당받은 후에 bind() -> listen() -> accept() 시스템 콜을 차례대로 호출해서 클라이언트와 연결을 맺을 수 있다. 반대로, 클라이언트에서는 대기중인 서버에 연결 요청을 함으로써 서버-클라이언트 간의 연결이 생성될 수 있는데, 여기에 사용되는 시스템콜이 connect() 시스템 콜이다. 클라이언트의 소켓 생성 및 주소 할당 클라이언트의 경우에도 서버와 소켓 통신을 하려면 소켓을 하나 생성해야 한다. 즉, socket() 함수를 통해서 변수 sock에 디스크립터 번호를 지정한다. 다음으로는 연결을 요청할 서버의 주소를 소켓에 할당한다. 이때, 서버와는 달리 클라이언트는 본인의 IP address와 port number를 따로 지정할 필..

컴퓨터 사이언스/Network

stream socket vs datagram socket

socket socket은 OS를 통해 네트워크 통신을 하는 표준 방법이다. 즉, 프로그래머에게 소켓은 네트워크로 데이터를 주고 받는데 사용하는 도구이다. 이 데이터는 L5(Session 계층)에서 전송된다. 그리고 L4의 구조를 결정하는 여러 종류의 소켓 타입이 있는데, 가장 보편적인 타입이 Stream socket과 Datagram socket이다. Stream Socket 스트림 소켓은 신뢰성있는 양방향 통신을 제공한다. 즉, 한쪽에서 다른 한쪽으로의 연결을 초기화하고, 연결이 생성된 후에는 어느 쪽에서든지 다른 쪽으로 통신할 수 있다. 또한 보낸 내용이 실제로 도착했는지도 즉각적으로 확인할 수 있다. 이러한 Stream Socket은 TCP 표준 통신 프로토콜을 사용한다. 컴퓨터 네트워크에서 데이..

컴퓨터 사이언스/Network

서버의 시스템 콜(bind, listen, accept)

serv_addr 구조체에 값을 채워넣음으로써 socket의 ip address와 port number를 지정해준 후에 발생하는 bind -> listen -> accept 과정을 이번 포스팅에서 살펴보고자 한다. 소켓에 주소를 할당하는 bind 함수 bind 함수는 2가지 인자를 전달함으로써 소켓에 주소를 할당할 수 있다. 즉, 앞서 socket()함수로 받아온 descriptor sockfd가 존재하는데, 이 descriptor file에 해당하는 소켓에 serv_addr 주소를 할당하겠다는 의미이다. int bind(int sockfd, struct sockaddr *addr, socklen_t addrlen); sockfd : socket() 함수를 통해 배정받은 디스크립터 번호. serv_soc..

컴퓨터 사이언스/Network

HTTP version별 특징

HTTP version 1.0 HTTP의 초기 버전은 서버로부터 정보를 얻는 GET 기능만 가능했다.(HTTP version 0.9) 하지만 점점 인터넷이 발전하고 새로운 기능이 생겨나면서 정보를 얻는 것만으로는 충분하지 않게 되었다, 그래서 HTTP version 1.0에서는 새로운 유틸리티들이 추가되었다. Header : HTTP header를 도입해 프로토콜 방식을 유연하고, 확장 가능하게 만든 메타 데이터의 전송이 가능하게 되었다. Versioning : HTTP 요청시 사용된 버전을 명시적으로 알려주고 request line에 추가한다. Status Code : HTTP 요청은 상태 코드를 가진다. 따라서 상태 코드를 통해 receiver가 요청 처리상태를 확인할 수 있다. Content-typ..

컴퓨터 사이언스/Network

proxy 서버 만들기

Web Proxy Web Proxy는 웹 브라우저와 end server 사이에서 중간자 역할을 하는 프로그램으로, 웹 페이지를 가져오기 위해서 브라우저가 end server에 직접 연결하는 대신에 proxy server에 연결하여 요청을 전달할 수 있다. 그리고 end server가 proxy server에 응답을 하면, proxy server가 응답을 브라우저에 전달을 하는 방식이다. proxy의 역할 Firewall 프록시는 방화벽 외부에 있는 브라우저가 end server에 접근할 때, 프로시를 통해서만 접근이 가능하게 만들어주는 중개자 역할을 할 수 있다. 즉, 이러한 기능을 통해 내부 네트워크는 외부로부터 보호될 수 있다. Anonymizers(익명 처리기) 클라이언트가 직접 서버와 통시하는 경..

컴퓨터 사이언스/Network

tiny 서버 만들기

사용되는 보조 함수들 소개 string 관련 함수들 sscanf sprintf strcasecmp strcmp strstr strcpy strcat 파일 관련 함수들 stat 프로세스와 관련된 함수들 fork 자식 프로세스를 생성하는 함수로, fork 함수의 반환값은 자식 프로세스는 0, 부모 프로세스는 자식 프로세스의 PID이다. fork()를 실행하면 부모 프로세스와 자식 프로세스가 동시에 실행된다. 만약에 fork()의 반환값이 0이라면. 즉, 자식 프로세스라면 if문을 수행한다. fork()의 반환값이 0이 아니라면. 즉, 부목 프로세스라면 if문을 건너뛰고 Wait(NULL)함수로 가는데, 이는 부모 프로세스가 먼저 도달해도 자식 프로세스가 종료될 때까지 기다리는 함수이다. setenv(대상 환..

컴퓨터 사이언스/Network

웹 서버 기초

HTTP(Hypertext Transfer Protocol) 웹에서 웹 클라이언트(브라우저)와 웹 서버가 서로 정보를 주고 받을 수 있는 응용 계층의 프로토콜 중 하나로 TCP/IP 프로토콜을 이용한다. 이때, HTTP는 이미지, 텍스트, 오디오 등 여러 가지 유형의 데이터들을 주고 받을 수 있는데, 이런 웹 컨텐츠는 MIME 타입으로 인코딩된다. MIME타입(Multipurpose Internet Mail Extensions) 웹 서버에서 전송되는 여러 종류의 컨텐츠 유형들을 전달하기 위해 필요한 매커니즘이다. 다음과 같은 역할을 한다. 바이너리 파일의 송수신 : 웹은 텍스트 파일 뿐만 아니라 여러 바이너리 파일(오디오, 이미지, 비디오 등)을 전송하기도 한다. 이런 바이너리 파일들을 문제없이 전달하기..

컴퓨터 사이언스/Network

호스트와 서비스 변환

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..

컴퓨터 사이언스/Network

echo 클라이언트와 서버

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..

kimjingyu
'컴퓨터 사이언스' 카테고리의 글 목록