알고리즘 (4): 트리


트리

  • 정보를 갖는 노드들의 집합
  • 수직 계층의 자료구조로, 하나의 루트 노드로부터 연결된 여러 노드들은 부모 자식의 관계를 가지며 자기 자신이 부모 노드가 되어 다른 노드를 자식으로서 연결할 수 있다.

  • 루트(Root): 부모를 갖지 않는 최상단 노드

  • 자식(Child): 부모 노드에 연결된 노드, 해당 노드에 접근하기 위해서는 부모 노드를 통해 접근해야 한다.
  • 형제(Siblings): 같은 부모에 연결된 노드들은 형제 관계를 갖지만 트리 특성상 형제 노드만으로는 접근이 불가능하고 부모노드를 통해서만 접근 가능하다.
  • 내부 노드(Internal node): 최소 하나의 자식을 갖는 노드
  • 외부 노드(External node, Leaf node): 자식을 갖지 않는 노드
  • 조상 노드(ancestor node): 노드의 부모 노드가 루트가 아니라면 해당 부모 노드도 부모 노드를 갖는다. 부모 노드 또한 조상 노드로서 표현됨.
  • 깊이(Depth): 루트 노드로부터 자신까지 가는 경로의 길이.
  • 레벨(Level): 루트 노드에서 자신까지 가는 경로+1.
  • 높이(Height): 트리가 갖는 노드들의 최대 깊이를 의미.
  • 차수(Degree): 자식노드가 최대로 가질 수 있는 형제 노드의 수

이진트리(Binary Tree)

  • 자식노드가 최대 두개인 노드들로 구성된 트리
  • 내부 노드의 자식들을 좌측 자식, 우측 자식으로 나누어 표현한다.

  • 정 이진 트리(full binary tree): 모든 내부 노드들이 자식을 두 개 갖는 이진 트리

  • 완전 이진 트리(complete binary tree): 마지막 레벨을 제외하고 모든 레벨에 노드들이 완전히 채워져 있고 외부 노드의 경우 왼쪽부터 채워진 트리
  • 균형 이진 트리(balanced binary tree): 모든 외부노드들이 같은 깊이를 갖거나, 깊이의 차이가 최대 1인 트리

트리 순회

전위 순회(Preorder Traversal)

  • 자식 노드에 접근하기 전에 노드를 방문하는 순회 방식
  • 자식 노드의 접근은 자식간의 관계에 의해 형성된 순서를 지키며 먼저 방문함
    1
    2
    3
    4
    5
    void preOrder(node* v){
    visit(v);
    preOrder(v->left);
    preOrder(v->right);
    }

후위 순회(Postorder Traversal)

  • 자식 노드에 먼저 접근한 후 자신의 노드를 방문하는 순회방식
  • 루트 노드는 최상위 노드이므로 후위 순회에서 가장 마지막에 방문되어진다.
    1
    2
    3
    4
    5
    void postOrder(node* v){
    postOrder(v->left);
    postOrder(v->right);
    visit(v);
    }

중위 순회

  • 좌측 자식 -> 현재 노드 -> 우측 자식의 순으로 노드를 방문하는 순회방식
  • 자식 사이에 현재 노드의 방문이 이루어지므로 이진트리가 아닌 경우 임의로 순서를 정하여 순회할 수 있다.
    1
    2
    3
    4
    5
    void inOrder(node* v){
    inOrder(v->left);
    visit(v);
    inOrder(v->right);
    }

오일러 투어 순회(Euler Tour Traversal)

  • 현재 노드 -> 좌측 자식 -> 현재 노드 -> 우측 자식 -> 현재 노드의 순으로 노드를 방문하는 순회방식
  • 현재 노드를 먼저 방문하는 전위 순회, 좌측 자식 방문 후 자기 노드를 방문하고 우측 노드를 방문하는 중위 순회, 자식 노드를 방문한 후 자기 노드를 방문하는 후위 순회가 모두 합쳐진 순회방식으로 볼 수 있다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void eulerTour(node* v){
    visit(v);
    if(v->left != nullptr){
    eulerTour(v->left);
    visit(v);
    }
    if(v->right != nullptr){
    eulerTour(v->right);
    visit(v);
    }
    }

알고리즘 (3): 쉘 정렬, 힙 정렬


쉘 정렬 (Shell Sort)

  • 멀리 떨어진 원소끼리 교환하여 정렬 속도를 향상시키는 정렬 알고리즘

  • 삽입 정렬을 변형하여 병렬 처리로서 정렬을 수행한다.

  • 교환할 원소들의 Gap을 서서히 줄여가면서 최종적으로 i번째 인덱스와 i+1번째 인덱스의 교환들로 정렬이 마무리된다.

자세히 보기

Ch 5. 윈도우 네트워크 프로그래밍(1) - 윈도우 소켓과 관련 함수


윈도우 네트워크 프로그래밍

클라이언트 - 서버 모델

  • 서버와 클라이언트는 단일 프로그램으로 작동
  • 서버는 클라이언트의 연결요청을 대기, 클라이언트에게 정보 및 서비스를 제공
  • 클라이언트는 서버에게 정보 및 서비스를 요청하고 응답을 기다림
  • ex) 웹 사이트는 아파치와 같은 웹 서버가 서버 역할을 수행, 사용자가 사용하는 웹 브라우저(크롬, 엣지)는 클라이언트의 역할을 수행
  • 클라이언트는 서버와 동일한 컴퓨터에서 다른 프로세스로 존재할 수 있고 다른 컴퓨터에서 연결된 네트워크로 존재할 수 있음

네트워크 프로그래밍

  • 원 거리 사용자간의 원활하고 빠른 의사 소통을 위해 활용
  • 네트워크로 연결되어 있는 두 호스트 간의 데이터 송/수신이 이루어짐
  • 파일 입/출력과의 차이점은
  • 소켓(socket)을 사용한 프로그래밍 방식
자세히 보기

Ch 4. TCP(2) - TCP 연결과 흐름제어


TCP 연결 설정

  • 능동적 열림(Active open)
    • 클라이언트는 서버가 열어 놓은 포트로 TCP연결을 요청
  • 수동적 열림(Passive open)
    • 서버는 네트워크 응용을 수행하기 위해 정해진 포트를 열고 클라이언트의 요청을 기다림

세 방향 핸드쉐이크(Three-way handshake)

  • 두 호스트는 TCP 연결을 위해 3개의 패킷이 송/수신되어야함
  1. 클라이언트는 서버에게 자신을 연결하라는 의미로 클라이언트 측 SEQ번호(순서번호)와 함께 SYN = 1 플래그가 저장된 세그먼트를 전송
  2. 이를 수신한 서버는 클라이언트에게 이에 대한 수락으로 ACK=1, 서버를 클라이언트에 연결하라는 의미로 SYN=1 플래그를 저장하며 클라이언트로부터 수신한 패킷의 SEQ+1를 ACK필드 값에, 서버 측의 순서번호를 SEQ필드에 저장하여 전송
  3. 서버로부터 SYN 패킷가 수신된 클라이언트는 서버에게 순서번호를 인지했다는 의미로 ACK=1플래그, ACK 필드 값은 수신한 패킷의 SEQ+1로 저장하여 전송
자세히 보기

Ch 4. TCP(1) - TCP 헤더, 타이머


TCP(Transmission Control Protocol)

  • 전송 제어 프로토콜의 약자
  • IP를 통해 확인된 목적지 주소로 데이터를 전송하는 프로토콜로서 전송 계층(4계층)의 기능을 수행
  • 두 호스트 간에 전송되는 데이터와 메시지의 형식을 정의함

TCP의 특징

  • 연결형 : IP계층 위에 가상의 회선을 설정하여 종단간 데이터 송/수신 서비스를 제공
  • 신뢰성 : 데이터 송/수신 확인을 통한 신뢰성있는 통신 서비스 제공 (ACK 필드)
  • 흐름 제어 : 송/수신측의 데이터 처리 속도 차이를 해결하기 위한 방법, 처리할 수 있는 범위 내에서 데이터를 보내도록 제어 (슬라이딩 윈도우, 슬로우 스타트)
  • 혼잡 제어 : 송신측의 데이터 전달과 네트워크의 데이터 처리 속도 차이를 해결하기 위한 방법, 혼잡 현상을 방지하거나 제어 (혼잡 회피)
  • 스트림 통신 : 데이터를 바이트 단위로 나누어 전송(버퍼 사용)

포트(Port)

  • 호스트 내의 프로세스가 통신을 수행하기 위해 할당 받는 고유 번호
  • 데이터 링크 계층(2계층)의 MAC 주소, 네트워크 계층 (3계층)의 IP 주소와 같이 전송 계층(4계층)에서 사용하는 식별 번호
  • 포트 번호는 16비트로 이루어져 있으며 번호의 범위에 따라 사용 목적이 나뉘어져 있음
    • 0 ~ 1023번 : 잘 알려진 포트(well-known port), HTTP(80), FTP(20)와 같은 포트로 특정한 쓰임새를 위해 IANA에서 할당한 TCP, UDP포트
    • 1024 ~ 49151번: 등록된 포트(registered port), 기업이나 사업자들을 위해 IANA에서 할당한 포트
    • 49152 ~ 65535번: 동적 포트(dynamic port), 일반 사용자들이 사용할 수 있는 포트
  • 포트 번호는 IP주소 뒤에 콜론으로 표기됨 (127.0.0.1:61000)

TCP 소켓

  • TCP/IP 통신 인터페이스
  • 두 프로세스의 소켓은 프로토콜, 송신자 IP주소, 송신자 프로세스 번호, 수신자 IP 주소, 수신자 프로세스 번호로 식별
자세히 보기

Ch 3. IPv6


IPv6

IPv6의 특징

확장된 주소 공간

  • IPv4의 주소 부족 문제, 보안 문제를 해결하기 위하여 주소 체계를 128비트로 확장한 인터넷 프로토콜 주소.

헤더 단순화

  • IPv4에서 자주 사용하지 않는 헤더 필드를 제거함. (단편화 관련 필드, 체크섬 필드 삭제)
  • 추가적으로 필요한 기능은 확장헤더를 사용하여 수행한다.
  • IPv6의 기본 헤더는 40바이트

보안 / 개인보호에 관련된 기능 지원

  • 보안과 관련된 인증절차, 데이터 무결성 보호, 선택적인 메시지 발신자 확인 기능 등을 프로토콜 차원에서 지원함.
  • 확장 헤더를 이용하여 종단간 암호화 기능을 지원, 패킷에 대한 변조 방지.

자동 주소 설정

  • IPv6에서는 라우터가 제공하는 네트워크 프리픽스 정보와 MAC주소를 사용하여 자동으로 로컬 IPv6 주소를 생성한다.

상태 보존형 자동 설정 (Stateful auto-configuration)

  • DHCP 서버로부터 모든 네트워크 정보를 받는 방식
  • 주소를 요청받은 DHCP는 호스트에 할당 가능한 주소를 전달한다.
  • 장점: 주소를 효율적으로 이용하고 인증과정을 통해 보안 유지가 가능
  • 단점: 서버에 대규모 데이터베이스가 준비되어야 함
자세히 보기

Ch 2. IPv4(4) - 멀티캐스팅


멀티캐스트

  • 동일한 정보를 여러 사람에게 전송시 필요한 몇몇 호스트들에만 메시지를 전달하는 방법
  • 전달받을 호스트의 수만큼 데이터를 패킷을 보유해야하는 유니캐스트에 비하여 멀티캐스트는 하나의 패킷을 전송하여 라우터에서 복사하여 라우터 내 각 호스트들에게 전달하는 방식이므로 대역폭 낭비와 지연 시간을 줄일 수 있음.
  • 멀티캐스트를 지원하지 않는 라우터는 멀티캐스트를 지원하는 라우터 사이에서 유니캐스트와 같이 작동하는 터널링 기법을 사용.

멀티캐스트의 기본 요소

호스트 그룹 정의(multicast group)

  • 멀티캐스트 패킷을 수신하는 호스트들의 집합
  • 각각의 그룹은 멀티캐스트 주소로 구분

그룹 관리(group management protocol)

  • 멀티캐스트 그룹은 필요에 따라 추가, 삭제되는 동적인 구조를 갖는다.
  • 그룹 관리를 위한 새로운 메커니즘으로 IGMP사용

라우팅 경로 설정(multicast routing protocol)

  • 목적지에 도달하기 위한 경로는 다양하게 존재한다.
  • 트리를 구성하여 라우트간 빠른 경로를 탐색한다.
자세히 보기

Ch 2. IPv4(3) - IP주소 관련 프로토콜


IP주소 관련 프로토콜

  • 논리적인 차원의 데이터 전송은 IP주소를 통해 이루어지지만 실제 물리 계층에서의 전송은 물리 계층 주소를 통해서 이루어진다.
  • 논리 주소(IP address)와 물리 주소(MAC address) 사이의 변환 프로토콜이 필요.

ARP(Address Resolution Protocol)

  • 동일 네트워크에 존재하는 호스트에 대해 목적지의 IP주소에 해당하는 물리 주소를 찾는 프로토콜.
  • ARP 메시지
    • ARP 요청 메시지 (ARP Request) - 특정 IP 주소에 대한 물리 주소를 요구, 호스트는 ARP 요청 메시지를 보낼 때 수신측 물리 주소를 모르기 때문에 물리 계층 브로드캐스트로 전송
    • ARP 응답 메시지 (ARP Response) - 물리 주소 정보를 알림, ARP 요청 메시지를 수신한 호스트/라우터는 자신의 물리 주소를 요구하는 경우 ARP 응답 메시지 전송.
  • 특정 주소에게서 물리 주소를 받기 위해 호스트는 브로드캐스트로 ARP 요청 메시지를 전송하며, 이를 수신한 호스트는 자신의 IP주소와 같을 때, 자신의 물리 주소가 담긴 ARP 응답 메시지를 전송한다.
  • 다른 서브넷에 위치하는 호스트의 MAC주소를 요청하는 경우, 라우터가 자신의 MAC 주소를 응답하여 라우터에서 데이터를 대신하여 받고 호스트에게 데이터를 전송한다(Proxy ARP).
자세히 보기

Ch 2. IPv4(2) - IP주소 관리 기법


IP주소 체제

IP주소

  • 모든 장비들이 갖는 영구적이지 않고 고유한 논리적 네트워크 식별자.

클래스별 분류

  • IP주소는 네트워크를 구분하기 위한 네트워크 식별자(netid)와 네트워크 내에서 호스트를 구분하기 위한 호스트 식별자(hostid)로 구성.
  • 호스트 식별자는 0.0.0.0…(네트워크 호스트)과 255.255.255.255….(브로드캐스트)를 제외하여 사용
  • 네트워크와 호스트의 주소 개수에 따라 5개의 클래스로 구분할 수 있음
    • 클래스 A - 처음 1비트 값이 “0”인 주소, 7비트를 netid에 할당하며 나머지 24비트를 모두 hostid로 사용, 큰 규모의 호스트를 갖는 기관에서 사용한다.
    • 클래스 B - 처음 2비트 값이 “10”인 주소, 15비트를 netid에 할당하고 나머지 16비트를 모두 hostid로 사용
    • 클래스 C - 처음 3비트 값이 “110”인 주소, 네번째 바이트만 hostid를 위해 주어짐, 네트워크마다 $2^8-2=254$개의 호스트를 수용할 수 있기 때문에 작은 규모의 네트워크에서 사용.
    • 클래스 D - 처음 4비트 값이 “1110”인 주소, netid와 hostid의 구분이 없으며, 전체 주소가 멀티캐스트용으로 사용됨.
    • 클래스 E - 처음 4비트 값이 “1111”인 주소, 추후 사용을 위해 예약된 주소
자세히 보기

Ch 2. IPv4(1) - IP헤더


IP(Internet Protocol)

IP는 OSI 참조 모델의 네트워크 계층 기능을 수행하며 패킷 전송을 위한 주소 정의 및 관리와 라우팅을 담당한다.

IP의 특징

  1. 비신뢰성(Unreliable)
    • 가능한 범위 내에서 패킷을 목적지까지 전달하는 최선형 서비스(Best Effort Service)
  2. 비접속형(Connectionless)
    • 연결 설정 없이 패킷을 전송
    • 서로 다른 경로로 패킷이 전송될 수 있으며, 순서도 바뀔 수 있다.
  3. 주소 지정
    • 네트워크 내의 노드를 고유하게 지정하기 위한 수단으로 IP주소를 사용
  4. 경로 결정
    • 목적지 IP주소를 기반으로 패킷 전달 경로를 판단(Routing Protocol).

IP패킷 구성


자세히 보기