5. getc(3), fgetc(3), getchar(3) + ungetc(3) #include int getc(FILE* fp); int fgetc(FILE* fp); int getchar(); int ungetc(int c, FILE* fp); @param fp: 파일 스트림형 포인터 @return: 성공시 다음 문자를 int로 변환하여 리턴, 파일 끝이나 에러시 EOF 리턴 한 번에 하나의 문자를 읽는 라이브러리 함수. getc()와 fgetc()는 주어진 스트림형 포인터에서 한 문자씩 읽고 int로 변환한 다음 리턴하고 매크로와 함수로 구현되었다는 차이가 있다. getchar()는 stdin으로부터 문자 하나를 입력받는다. #include #include int main() { int charac..
0. TLS, SSL TCP/IP 네트워크 통신에서 보안을 제공하기 위한 암호 규약을 의미한다. (TLS가 SSL의 후속 버전이며, 둘 다 암호화된 통신을 제공하기 위한 프로토콜이라는 점에서 혼용되어 사용되기도 한다.) HTTP 2.x 이상의 버전들은 HTTPS 사용을 강하게 권장하고 있다고 알고 있는데, HTTPS 사용을 위해서는 응용 계층과 전송 계층 사이에서 TLS/SSL이라는 독자적인 프로토콜을 이용한다. (반드시 TLS/SSL을 사용해야 하는것은 아니고, HTTPS를 위한 보안 프로토콜로 보편적으로 많이 사용하는 프토로콜이 TLS/SSL이다) 1. Symmetric Cryptography (대칭 암호화) sender와 receiver가 secure한 통신을 하기 위해서, 모든 네트워크 사용자..
FDT, FT, IT - FDT(파일디스크립터 테이블) : 프로세스마다 한개씩 가지고있음. 0:stdin, 1:stdout, 2:stderr로 자동할당, 3부터 파일 open시 할당된다. 파일을 시스템 프로그래밍 차원에서 바이트단위의 입출력으로 다룰 수 있게 한다. - FT(파일 테이블) : 모든 프로세서가 오픈한 파일에 대한 참조. 파일디스크립터 테이블에서 참조하는 수 - IT(아이노드 테이블) open(2) 파일을 열거나 생성할 때 사용하는 system call 함수 #include #include #include int open(const char* pathname, int oflag); int open(const char* pathname, int oflag, mode_t mode); @param..
개요 ㆍ 표준 입출력 라이브러리를 사용하기 위해서는 stdio.h를 포함시켜야 한다. #include ㆍ 표준 입출력 라이브러리는 고수준 입출력 함수이다. 참고로 저수준 입출력 함수는 system call(시스템 호출 함수)를 의미한다. ㆍ고수준 함수는 스트림형 구조체(FILE, DIR)를 사용한다. 바이트 단위로 입출력을 하는 것이 아니라 버퍼를 통해 읽고 쓰기 작업을 하기 때문에 문자단위, 행단위, 버퍼 단위로 다양하게 입출력이 가능하다. ㆍfopen류 함수호출 성공시 FILE포인터가 리턴되고, 실패시 NULL 리턴. 실패 이유에는 파일이 존재하지 않거나, 접근권한이 없거나, 한번에 파일을 열 수 있는 최대 개수를 초과하는 경우가 있다. 1. fopen(3) 매개변수로 들어온 경로의 파일을 매개변수의..
0. Internet Protocol 다른 계층과 마찬가지로 3계층인 네트워크 계층에도 여러 프로토콜들이 존재한다. 그러나 그 중에 가장 대표적이고 널리사용되는 프로토콜은 인터넷 프로토콜, IP이다. 인터넷을 사용하는 모든 컴퓨터는 자신의 고유 주소를 가지는데, 이러한 주소를 바로 IP주소라고 한다. 따라서 인터넷에서 전송되는 모든 데이터(패킷)들은 네트워크 계층의 IP를 기반으로 송수신되고, 전송 계층의 TCP에 의해 재조립되어 메세지를 전달한다. IP를 사용하여 패킷을 전달하는데는 여러가지 문제가 있다. 송신자는 수신자 서버의 상태를 알 수 없고, 전달 과정 중 패킷이 유실될 수도 있고, 큰 데이터를 여러 패킷으로 나누어 데이터를 전송하는 과정에 패킷의 순서가 뒤바뀔 수도 있다. 이러한 문제는 IP프..
Network layer 네트워크 계층은 전송계층에서 만들어진 세그먼트를 receiving 호스트로 전달한다. 송신 측에서는 세그먼트를 encapsulation하여 데이터그램을 만들고, 수신 측에서는 데이터그램을 decapsulation과정을 거쳐 세그먼트로 분리하여 상위 전송 계층으로 전달한다. 하위 계층인 링크 계층은 바로 옆의 라우터에 패킷을 전송하는 과정만 관리한다. 하지만 바로 옆 라우터의 정보만 안다고 해서 목적지까지 패킷을 최적화된 경로로 전송하는 것은 불가능하다. 따라서 네트워크 계층에서는 링크 계층과 다르게 바로 옆 라우터와의 통신이 아닌 전체적인 송수신 경로에 대한 관리가 이루어진다. Forwarding, Routing네트워크 계층에서 가장 중요한 두 개의 function이다. 포워..
네트워크의 전송 계층에서 데이터의 전송을 위해 사용하는 프로토콜에는 여러 가지가 있는데, 그 중에서 대표적인 것으로 UDP와 TCP가 있다. IP를 사용하여 패킷을 전달하는데는 여러가지 문제가 있다. 송신자는 수신자 서버의 상태를 알 수 없고, 전달 과정 중 패킷이 유실될 수도 있고, 큰 데이터를 여러 패킷으로 나누어 데이터를 전송하는 과정에 패킷의 순서가 뒤바뀔 수도 있다. 이러한 문제는 IP프로토콜만으로는 해결할 수 없고, TCP와 같은 추가적인 프로토콜을 사용하여 해결할 수 있다. 1. UDP (User Datagram Protocol)UDP는 '빈 껍데기'같은 프로토콜이라고 할 수 있다.UDP는 "best effort" service이다. best effort라 함은 계층에서 데이터의 전송을 위..
0. Transport Layer전송 계층은 다양한 호스트들에서 동작하는 어플리케이션 응용 프로세스 간의 논리적인 통신을 제공한다. 3계층인 네트워크도 통신에 관한 계층인데, 네트워크 계층과의 가장 큰 차이는 'process to process'라는 것이다. 즉 네트워크 계층에서는 호스트간의 통신을, 전송계층에서는 프로세스간의 통신을 관리한다. 전송 계층에서는 오류가 발생하면 데이터의 재전송을 요청하여 신뢰할 수 있는(reliable) 통신이 가능하도록 한다. 프로토콜은 모두 end system에서 동작한다. 코어의 router들은 전송계층의 프로토콜을 구현하고 있지 않다. sender는 세그먼트 단위로 어플리케이션 계층의 메세지들을 잘라서 전송계층의 헤더를 붙이고 네트워크 계층으로 보내고, receiv..
HTTPHTTP(HyperText Transfer Protocol)은 텍스트 기반의 통신 규약으로, 인터넷에서 데이터를 주고받을 수 있는 프로토콜이다. HTTP는 클라이언트-서버 구조로 이루어져 request-response의 과정을 통해서 동작한다.Clint : Server에 requestServer : Client에 response 데이터 통신에 TCP나 UDP와 같은 하위 프로토콜을 직접 사용하는 경우는 많지 않으며, 대부분 HTTP를 이용한다. HTTP는 TCP/IP를 이용하는 응용 프로토콜이며, 무상태(stateless), 비연결형(connectionless)이라는 특징을 가진다. - stateless하다는 것은 서버가 클라이언트의 이전 상태와 정보를 보존/저장하지 않는다는 의미이며(저장이 필요..
DFS 스택(재귀)을 이용한 DFS에 대하여 알아보자. 코드의 편하게 작성하기 위해서 DFS는 스택을 따로 만들지 않고 재귀적으로 구현하기도 하는데, 이는 재귀적으로 함수호출이 이루어지는 로컬공간 자체가 스택의 구조를 갖고 있기 때문에 동일한 원리라고 할 수 있다. //백트래킹 void dfs(int root) { if(종료조건) return; for(i: root에 방문하지 않은 자식노드) { dfs(i); } 재귀를 이용한 DFS는 간단하게 종료조건이 나오기 전까지 계속 재귀호출을 이어가다가, 종료조건이 나오면 return하는 방식의 DFS이다. 스택을 사용한 DFS도 원리는 동일하다. 다만 상태공간트리에서 leaf노드를 나타낼 때 재귀를 이용한 구현에서는 return문을 사용했다면, 스택을 이용한 ..
개요 HTTP 프로토콜은 stateless라는 특징을 갖는다. stateless(무상태)란 상태가 존재하지 않는다는 의미이다. stateless한 서버 입장에서는 동일한 클라이언트의 요청이라도 각 요청을 독립적으로 관리한다. 즉, 동일한 클라이언트가 다시 요청을 하더라도 서버는 이전의 요청을 기억하지 못하며, 이는 인증(Authentication)이 필요한 요청에 문제가 될 수 있다. 이러한 단점을 쿠키 없이 해결하기 위해서는 모든 요청에 사용자 정보를 포함하여 전송하면 된다. 하지만 모든 요청에 사용자 정보를 포함한다면 개발의 불편함과 보안상의 문제가 존재하기 때문에, 쿠키와 세션을 사용하여 이러한 문제를 해결한다. 쿠키 쿠키란 HTTP의 stateless라는 특징에서 벗어나 상태를 유지하기 위한..
Application LayerTCP/IP 네트워크 프로토콜 스택에서 가장 상위 레이어를 담당하고 있는 부분이 Application Layer이다. 이 계층에서는 이름에서 알 수 있듯이 host(=end system)들에게 직접적으로 여러가지 서비스를 제공하거나 받는 역할을 한다.우리가 사용하는 수많은 네트워크 어플리케이션들(이메일, 웹, 원격로그인, 디스코드....etc)에서 제공되는 기능들은 모두 가장 먼저 이 계층을 거친다. Application ArchitecturesㆍClient-Server클라이언트-서버 구조에서 서버는 host가 되어 항상 서버를 항상 제공해야 하고, 고정된 IP주소를 갖는다. 클라이언트는 필요할 떄 서버와 통신하여 필요한 정보를 주고받는다. 또한 클라이언트끼리 통신하는 것..