본문 바로가기

전체 글

(19)
* TCP / IP 4계층 TCP는 Transmission Control Protocol의 약자로 "전송 과정을 컨트롤한다."라는 의미가 있다. 전송 과정을 컨트롤한다라는 것이 무엇인지 알아보자. TCP를 이해하기 위해서는 "TCP / IP 프로토콜 스택"이라는 것이 있는데 아래의 그림을 보자. 크게 4가지의 영역이 나누어져 있다. 미처 신경 쓰지 못했지만 데이터의 송수신은 소프트웨어만으로 해결이 될 수 있는 문제가 아니다. 어느 정도 하드웨어의 시스템이 구축이 되어있어야 하고 많은 필요한 문제들이 존재한다. 따라서 이러한 문제들을 하나의 프로토콜의 설계로 해결하는 것이 아닌 작은 문제로 해결이 되어야 한다. 그래야 효율적으로 문제들을 해결할 수 있기 때문이다. 그렇기 때문에 프로토콜 스택은 위와 같은 4가지의 영역 별로 세분화되..
* 바이트 순서 먼저 바이트 순서라는 것은 시스템이 내부적으로 데이터를 표현하는 방법을 말한다. 크게 두 가지의 방식으로 나뉘는데 리틀 엔디안(Little-Endian)과 빅 엔디안(Big-Endian)이다. 0x12345678을 두 가지 방식으로 표현해보자. 빅 엔디안 : 상위 바이트의 값(왼쪽에 있는 1)이 메모리상에 먼저(번지수가 작은 위치) 표시되는 방법을 말한다. 리틀 엔디안 : 하위 바이트의 값(오른쪽에 있는 8)이 메모리상에 먼저(번지수가 작은 위치) 표시되는 방법을 말한다. 시스템이 내부적으로 데이터를 처리하는데 있어서 어떠한 방식을 사용하는지는 CPU에 따라 다르다. 이를 "호스트 바이트 순서(host byte order)"라고 하는데 CPU마다 다른 문제로 일정하지 않다는 것이 문제가 된다. 바이트 순..
* 주소 체계와 데이터 설정 IP주소 인터넷상에 존재하는 호스트들을 구분하기 위한 32비트의 주소 체계를 의미한다. 일반적으로 점이 찍힌 십진수 표현 방식으로 IP주소를 표현하는데 점에 의해 구분 되는 각각의 십진수 값은 1바이트로 표현이 되며 총 4바이트를 사용하게 된다. IP주소는 인터넷에 연결되어 있는 컴퓨터를 구분하기 위해 사용된다. ex) "212.421.222.123" Port IP주소로는 인터넷에 연결되어 있는 컴퓨터를 구분할 수 있지만 컴퓨터 안에서 실행되고 있는 프로그램까지는 구분하여 줄 수 없다. 그렇기 때문에 어떠한 프로그램에게 전달하여야하는지 필요로 하는 정보가 있는데 이때 사용되는 것이 Port이다. Port는 2바이트로 표현이 되는데 0에서 65535까지의 범위의 값으로 사용이 된다. 하지만 0부터 1023..
* 소켓의 생성과 프로토콜 소켓의 생성과 프로토콜의 정의를 정확하게 이해해보자. 현실세계에도 여러 가지 통신 방법이 존재한다. 편지 또는 전화기 등등.. 하지만 한쪽에서는 편지를 보내고 한쪽에서는 전화를 사용한다는 것은 정상적인 통신이 되지 않을 것이다. 이렇듯 네트워크 상에서도 통신에 대한 약속이 필요한데 이것을 프로토콜이라 한다. 정확하게 정의를 보면 "컴퓨터 간에 정보를 주고받을 때의 통신방법에 대한 규칙과 약속"이다. 먼저 소켓의 할당을 보자. socket(_In_ int af, _In_ int type, _In_ int protocol); 1인자 : 생성할 소켓이 통신을 하기 위해 사용할 프로토콜 체계(Protocol Family)를 설정 2인자 : 소켓을 전송함에 있어서 사용하게 되는 전송 타입을 설정 3인자 : 두 호..
1) Hello World 서버 네트워크 프로그래밍이란 "멀리 떨어져 있는 호스트들이 서로 데이터를 주고받을 수 있도록 프로그램을 구현하는 것이다. 소프트웨어 차원에서 호스트들 간에 연결을 위한 장치가 필요한데 이러한 기능을 해주는 장치가 소켓(socket)이다. 그래서 일반적으로 네트워크 프로그래밍과 소켓 프로그래밍은 같은 의미로 사용된다. 소켓은 다소 추상적인 개념으로 사용되는 단어이다. 하지만 전화기를 빗대어 생각하자. 전화기도 멀리 떨어져 있는 두 사람이 통신을 하기 위한 도구이다. 소켓도 소프트웨어적으로 멀리 떨어져 있는 두 개의 호스트(host)를 연결해주는 매개체이다. 실생활에서 전화기가 필요하듯이 네트워크 프로그래밍에서도 소켓이 필요하다. 이제부터 간단하게 "Hello World!"를 출력하는 프로그램을 만들 것이다. 서..
스택 (배열을 이용한 구현) 스택은 한쪽 끝에서만 들어가고 한쪽 끝에서만 삽입과 삭제가 이루어지는 자료구조이다. LIFO(Last In First Out)로 가장 먼저 들어간 것이 가장 나중에 나오는 구조이다. 쉽게 생각하기 위해서 프링글스 통을 떠올려보자. 가장 밑에 있는 감자칩은 가장 먼저 들어갈 것이다. 이 감자칩을 빼내려면 위에 있는 감자칩을 모두 빼낸 후 가장 나중에 나올 수 있다. 이 구조가 스택의 핵심이다. 배열을 이용한 구현 들어가기에 앞서 1. 5개의 배열을 이용한 스택을 구현한다. 2. top이라는 용어가 나오는데 top은 가장 최근에 저장된 위치를 가리키는 변수이다. 비어있는 상태일 경우에는 -1을 가리킨다. ① 데이터 삽입을 보자. 스택은 Push()라는 함수 호출로 값을 삽입한다. 가장 먼저 10이라는 값을 ..
단방향 연결 리스트 연결 리스트는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료 구조이다. 이번 내용에서 배워볼 방법은 동적 할당으로 연결 리스트를 구현해볼 예정이다. 기본 개념만 익힐 것이니 응용은 자신의 생각으로 더 나은 구조로 구현하길 바라겠다. 들어가기 전 노드와 리스트의 형태 1. 노드 - 노드란, 리스트에서 연결되는 하나의 데이터 정보를 말하는데 어떠한 데이터를 담을 공간과 자신의 다음 위치를 가리킬 포인터를 노드라고한다. 이해하기 쉽도록 아래의 그림을 떠올리면 된다. 2. 리스트 - 리스트는 위의 노드를 연결한 모양인데 꼬리에서 꼬리를 무는 형태로 그려진다. 수많은 구현 방법이 있겠지만 지금 구현하는 방법은 head와 tail 즉, 머리(시작점)와 꼬리(끝점)라는 멤..
퀵 정렬 퀵 정렬은 피벗(pivot)이라 불리는 특정 원소를 기준으로 주어진 원소들을 두 부분으로 나눈 뒤 각 부분을 정렬하는 방식이다. 이때 나뉜 각 부분의 정렬에는 다시 퀵 정렬이 이용된다. 들어가기 전 용어 설명 * pivot : 중심점 또는 기준점 * left : 정렬 대상의 가장 왼쪽을 가리키는 이름 * right : 정렬 대상의 가장 오른쪽을 가리키는 이름 * low : 피벗을 제외한 가장 왼쪽을 가리키는 이름 * high : 피벗을 제외한 가장 오른쪽을 가리키는 이름 ① 가장 왼쪽에 있는 원소 50을 pivot으로 정한다. ② low는 오른쪽으로만 이동을 하며 high는 왼쪽으로만 이동을 한다. 이때 이동기준은 아래와 같다. * low : 피벗보다 큰 값을 만날 때까지 이동 * high : 피벗보다 ..