[강의정리] 알고리즘 W6 (Dynamic Programming)


Dynamic programming

  • Similar to divide-and-conquer
  • small instances first, store the results, whenever we need a result, look it up instead of recomputing it.

알고리즘: Using Divide-and-Conquer

  • 문제: 이항계수를 계산한다
    • 입력: 음수가 아닌 정수 n과 k, 여기서 k <= n
    • 출력: bin, [n k]
1
2
3
4
5
6
int bin(int n, int k) {
if (k == 0 || n == k)
return 1;
else
return bin(n-1, k-1) + bin(n-1, k);
}

시간복잡도 분석:

  • 분할정복 알고리즘은 작성하기는 간단하지만, 효율적이지 않음
    • 이유? 재귀호출(recursive call)할때 같은 계산을 반복해서 수행하기 때문
    • 예를 들면, bin(n-1, k-1)과 bin(n-1, k)는 둘다 bin(n-2, k-1)의 결과가 필요한데, 따로 중복 계산이 됨

[n: k]를 구하기 위해서 이 알고리즘이 계산하는 항(term)의 개수는 2[n: k]-1이다. (증명을 해보자)

증명: (n에 대한 수학적 귀납법으로 증명)

  • 귀납출발점: 항의 개수 n이 1일 때 2[n: k]-1 = 2 x 1 - 1 = 1이 됨을 보이면 된다.
           [1: k]는 k=0이나 1일때 1이므로 항의 개수는 항상 1이다.
    
  • 귀납가정: [n: k]를 계산하기 위한 항의 개수는 2[n: k] - 1이라고 가정한다.
  • 귀납절차: [n+1: k]를 계산하기 위한 항의 개수가 2[n+1: k] - 1임을 보이면 된다.
         알고리즘에 의해서 [n+1: k] = [n: k-1] + [n: k] 이므로, [n+1: k]를 계산하기 위한 항의 총 개수는 [n: k-1]을 계산하기 위한 총 개수와 [n: k]를 계산하기 위한 항의 총 개수에다가 이 둘을 더하기 위한 항 1을 더한 수가 된다.
         그런데 [n: k-1]을 계산하기 위한 항의 개수는 가정에 의해서 2[n: k-1] -1이고, [n: k]를 계산하기 위한 항의 개수는 가정에 의해서 2[n: k] - 1이다.
    

동적계획식 알고리즘 설계전략

  1. Establish a recursive property (재귀 관계식을 정립):
  • 2차원 배열 B를 만들고, 각 B[i][j]에는 [i: j]값을 저장하도록 하면, 그 값은 다음과 같은 관계식으로 계산할 수 있다.
  1. Solve an instance of the problem in a bottom-up fashion:
    • [n: k]를 구하기 위해서는 다음과 같이 B[0][0]부터 시작하여 위에서 아래로 재귀 관계식을 적용하여 배열을 채워 나가면 된다.
      결국 값은 B[n][k]에 저장된다.
  • 문제: 이항계수를 계산한다.
    • 입력: 음수가 아닌 정수 n 과 k, 여기서 k <= n
    • 출력: bin, [n: k]
1
2
3
4
5
6
7
8
9
int bin2(int n, int k) {
index i, j;
int B[0..n][0..k];
for(i = 0; i <= n; i++)
for(j = 0; j <= minimum(i,k); j++)
if(j==0 || j==1) B[i][j] = 1;
else B[i][j] = B[i-1][j-1] + B[i-1][j];
return B[n][k];
}

동적계획 알고리즘의 분석

  • 단위연산: for-j 루프 안의 문장

  • 입력의 크기: n, k
    i = 0일 때 j-루프 수행 횟수 : 1
    i = 1일 때 j-루프 수행 횟수 : 2
    i = 2일 때 j-루프 수행 횟수 : 3
    ……………
    i = k-1일 때 j-루프 수행 횟수 : k
    i = k일 때 j-루프 수행 횟수 : k + 1
    i = k+1일 때 j-루프 수행 횟수 : k + 1
    ……………
    i = n일 때 j-루프 수행 횟수 : k + 1

    따라서 총 수행횟수는:
    1 + 2 + 3 + … + k + (k+1) + … + (k+1) = k(k+1)/2 + (n-k+1)(k+1) = (2n-k+2)(k+1)/2 = O(nk)

그래프

그래프 용어

  • 정점(vertex, node), 이음선(edge, arc)
  • 방향 그래프(directed graph, or digraph)
  • 가중치(weight), 가중치 포함 그래프 (weighted graph)
  • 경로(path) - 두 정점사이에 edge가 있는 정점들의 나열
  • 단순경로(simple path) - 같은 정점을 두 번 지나지 않음
  • 순환(cycle) - 한 정점에서 다시 그 정점으로 돌아오는 경로
  • 순환그래프(cyclic graph) vs 비순환 그래프 (acyclic graph)
  • 길이(length): the sum of weights on the path (weighted graph)
              the number of edges on the path (unweighted graph)
    

Shortest Path

  • Shortest Path: 한 도시에서 다른 도시로 직항로가 없는 경우

               가장 빨리 갈 수 있는 항로를 찾는 문제
    
  • 문제: 가중치 포함, 방향성 그래프에서 최단경로 찾기

  • Optimization problem (최적화 문제)의 정의

    • 주어진 문제에 대하여 하나 이상의 많은 해답 후보가 존재할 때, 이와 연관된 값이 최소 또는 최대인 해답(optimal solution)을 찾아야 하는 문제
    • 에너지 최소화 문제라고도 함.
  • shortest Path는 Optimization problem에 속함

Brute-force algorithm(무작정 알고리즘)

  • 한 정점에서 다른 정점으로의 모든 경로의 길이를 구한 뒤, 그들 중에서 최소길이를 찾는다.

동적계획식 설계전략 - 자료구조

  • 그래프의 인접행렬(adjacent matrix)식 표현: W

동적계획식 설계절차

  1. Establish a recursive property

    • D(k-1)을 가지고 D(k)를 계산할 수 있는 재귀 관계식을 정립
      • D(k)[i][j] = minimum(D(k-1)[i][j], D(k-1)[i][k] + D(k-1)[k][j])
    • 경우 1: {v1, v2,…, vk}의 정점들 만을 통해서 vi에서 vj로 가는 최단 경로가 vk를 거치지 않는 경우,
          보기: D(5)[1][3] = D(4)[1][3] = 3
      
    • 경우 2: {v1, v2,…, vk}의 정점들 만을 통해서 vi에서 vj로 가는 최단 경로가 vk를 거치는 경우,
          보기: D(2)[5][3] = D(1)[5][2] + D(1)[2][3] = 4 + 3 = 7
          보기: D(2)[5][4]
      
  2. 상향식으로 k=1부터 n까지 다음과 같이 이 과정을 반복하여 해를 구한다.
    D(0), D(1),……,D(n)

Floyd’s Algorithm I

  • 가중치 포함 그래프의 각 정점에서 다른 모든 정점까지의 최단거리를 계산
1
2
3
4
5
6
7
8
void floyd(int n, const number W[][], number D[][]) {
int i, j, k;
D = W;
for(k=1; k <= n; k++)
for(i=1; i <= n; i++)
for(j=1; j <= n; j++)
D[i][j] = minimum(D[i][j], D[i][k]+D[k][j]);
}

Floyd’s Algorithm II

  • 가중치 포함 그래프의 각 정점에서 다른 모든 정점까지의 최단거리를 계산, 각각의 최단경로를 구하라.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void floyd2(int n, const number W[][], number D[][], index P[][]) {
index i, j, k;
for(i=1; i <= n; i++)
for(j=1; j <= n; j++)
P[i][j] = 0;
D = W;
for(k=1; k <= n; k++)
for(i=1; i <= n; i++)
for(j=1; j <= n; j++)
if(D[i][k] + D[k][j] < D[i][j]) {
P[i][j] = k;
D[i][j] = D[i][k] + D[k][j];
}
}

최단경로의 출력

1
2
3
4
5
6
7
void path(index q,r) {
if(P[q][r] != 0) {
path(q, P[q][r]);
count << "v" << P[q][r];
path(P[q][r], r);
}
}

최적의 원칙

  • 어떤문제의 입력에 대한 최적해가 그 입력을 나누어 쪼갠 여러 부분에 대한 최적 해를 항상 포함하고 있으면 그 문제는 최적의 원칙(the principle of optimality)이 적용된다 라고 한다.

Optimal Binary Search Trees

  • definition
    • binary search tree
      • Ordered set
      • Each node contain one key
      • The keys in the left subtree are less than or equal to the key in that tree
    • Depth - number of edges from the root
    • balanced - if the depth of the 2 subtrees of every node never different by more than 1
    • optimal - the average time it takes to locate a key is minimized
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void optsearchtree(int n, const float p[], float& minavg, index R[][]) {
index i, j, k, diagonal;
float A[1...n+1][0..n];
for(i=1; i<=n; i++) {
A[i][i-1] = 0; A[i][i] = p[i]; R[i][i] = i; R[i][i-1] = 0;
A[n+1][n] = 0; R[n+1][n] = 0;
for(diagonal=1; diagonal <= n-1; diagonal++)
for(i=1; i<=n-diagonal; i++) {
j = i + diagonal;
A[i][j] = minimum(A[i][k-1] + A[k+1][j]) +
R[i][j] = a value of k that gave the minimum;
}
minavg = A[1][n];
}
}

The Traveling Salesperson Problem

  • Problem Definition

    • Determine a shortest route that starts at the salesperson’s home city, visits each of the cities once, and ends up at the home city
  • Adjacent matrix W

    • V = set of all the vertices
    • A = a subset of V
    • D[vi][A] = length of a shortest path from vi to v1
              passing through each vertex in A exactly once
      
  • Length of an optimal tour = minimum(W[1][j] + D[vj][V - {v1, vj}])

```C
void travel(int n, const number W[][], index P[][], number& minlength) {
index i, j, k;
number D[1..n][subset of V-{v1}];
for(i=2; i<=n; i++)
D[i][0] = W[i][1];

for(k=1; k<=n-2; k++)
for(all subsets A V-{v1} containing k vertices)
for(i such that i!= 1 and vi is not in A) {
D[i][A] = min(j:vj A)(W[i][j]+D[j][A-{vj}]);
P[i][A] = value of j that gave the minimum;
}
D[1][V-{v1}] = min(2<=j<=n)(W[1][j] + D[j][A-{v1,vj}]);
P[1][V-{v1}] = value of j that gave the minimum;
minlength = D[1][V-{v1}]
}

[강의정리] 알고리즘 W5 (quicksort, sorting algo)


Quicksort

  • 분할교환정렬(patition exchange sort)라고 불린다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void quicksort(index low, index high) {
    index pivotpoint;
    if (high > low) {
    partition(low, high, pivotpoint);
    quicksort(low, pivotpoint-1);
    quicksort(pivotpoint+1, high);
    }
    }

    void partition(index low, index high, index& pivotpoint) {
    index i, j;
    keytype pivotitem;
    pivotitem = S[low]; //pivotitem을 위한 첫번째 항목을 고른다.
    j = low;
    for(i = low + 1; i <= high; i++)
    if(S[i] < pivotitem) {
    j++;
    exchange S[i] and S[j];
    }
    pivotpoint = j;
    exchange S[low] and S[pivotpoint]; //pivotitem값을 pivotpoint에 넣는다
    }

분석

  • 단위연산: S[i]와 key와의 비교
  • 입력크기: 부분배열이 가지고 있는 항목의 수, n = high - low + 1
  • 분석: 배열의 첫번째 항목만 제외하고 모든 항목을 한번씩 비교하므로, T(n) = n - 1이다.

최악의 경우 시간복잡도 분석

  • 단위연산: 분할 알고리즘의 S[i]와 pivotitem과의 비교
  • 입력크기: 배열 S가 가지고 있는 항목의 수, n
  • 분석: 이미 비내림차순으로 정렬이 되어있는 배열을 정렬하려는 경우가 최악의 경우가 됨.
      비내림차순이면 첫번째(pivot)항목보다 작은 항목은 없으므로, 크기가 n인 배열은 크기가 0인 부분은 왼쪽에 오고, 크기가 n-1인 부분배열은 오른쪽에 오도록 하여 계속 쪼개진다. 따라서,
      T(n) = T(0) + T(n-1) - n - 1
      그런데 T(0) = 0이므로 재현식은 다음과 같이 된다.
      T(n) = T(n-1) + n - 1, n > 0이면
      T(0) = 0 
      
      이 재현식을 풀면,
      T(n) = T(n-1) + n - 1
      T(n-1) = T(n-2) + n - 2
      T(n-2) = T(n-3) + n - 3
      ...
      T(2) = T(1) + 1
      T(1) = T(0) + 0
      T(0) = 0
      
      T(n) = 1 + 2 + ... + (n-1) = n(n-1) / 2
    

평균의 경우를 고려한 시간복잡도 분석

  • 단위연산: 분할알고리즘의 S[i]와 pivotitem과의 비교
  • 입력크기: 배열이 S가 가지고 있는 항목의 수, n
  • 분석:

[강의정리] 알고리즘 week4 (merge sort)


Divide-and-Conquer

  • 분할정복식 설계전략
  • 분할(Divide): 해결하기 쉽도록 문제를 여러 개의 작은 부분으로 나눔
  • 정복(Conquer): 나눈 작은 문제를 각각 해결
  • 통합(Convbine): 해결된 해답을 모음
  • 이러한방식을 Top-Down(하향식) 접근 방법이라고 한다

Binary Search(이분검색): 재귀 알고리즘

  • 분할: 배열을 반으로 나누어서 x가 중앙에 위치한 항목보다 작으면 왼쪽에 위치한 배열 반쪽을 선택, 그렇지 않으면 오른쪽에 위치한 배열 반쪽을 선택
  • 정복: 선택된 반쪽 배열에서 X를 찾는다
  • 통합: 필요없음

재귀 알고리즘(recursive algorithm)에서 모든 재귀호출이 알고리즘의 마지막(꼬리) 부분에서 이루어 질 때 꼬리 재귀호출(tail recursion)이라고 함 - 그 알고리즘은 반복 알고리즘(iterative algorithm)으로 변환하기 수월ㅋ

최악의 경우 시간복잡도 분석

  • 단위연산: x와 S[mid]의 비교
  • 입력 크기: 배열의 크기 n(= high - low + 1)
  • 알고리즘에서는 단위연산으로 설정한 조건문을 while루프 내에서 2번 수행하지만, 사실상 비교는 한번만 수행
    (1) 어셈블리언어로는 하나의 조건 명령으로 충분히 구현 가능
    (2) x를 찾기 전까지는 항상 2개의 조건문을 수행하므로 하나로 묶어서 한 단위로 취급해도 됨

경우 1: 검색하게 될 반쪽 배열의 크기가 항상 정확하게 n/2이 되는 경우

  • 시간복잡도를 나타내주는 재현식(recurrence)는 다음과 같다
    W(n) = W(n/2)+1, n > 1이고, n = 2k(k>=1)
    W(1) = 1
    이식의 해는 다음과 같이 구할 수 있다
    W(1) = 1
    W(2) = W(1) + 1 = 2
    W(4) = w(2) + 1 = 3
    W(8) = W(4) + 1 = 4
    W(16) = W(8) + 1 = 5

    W(2k)=k+1

    W(n) = lg n + 1

    증명: 수학접 귀납법:

    귀납 출발점: n=1이면, W(1) = 1 = lg 1 + 1.
    귀납 가정: 2의 거듭제곱(power)인 양의 정수 n에 대해서, W(n)=lg n + 1라고 가정
    귀납 단계: W(2n) = lg(2n) + 1임을 보이면 된다. 재현식을 사용하면,
    W(2n) = W(n) + 1

      = lg n + 1 + 1
      = lg n + lg 2 + 1
      = lg(2n) + 1
    

경우 2: 일반적인 경우 - 반쪽 배열의 크기는 [n/2]이 됨

합병정렬(Mergesort)

1
2
3
4
5
6
7
8
9
10
11
12
void mergesort (int n, keytype S[]) {
const int h = n / 2, m = n - h;
keytype U[1..h], V[1..m];

if(n>1) {
copy S[1] through S[h] to U[1] through U[h];
copy S[h+1] through S[n] to V[1] through V[m];
mergesort(h,U);
mergesort(m,V);
merge(h,m,U,V,S);
}
}

시간복잡도 분석

합병 알고리즘의 최악의 경우 시간복잡도 분석

  • 단위연산: U[i]와 V[j]의 비교
  • 입력크기: 2개의 입력 배열에 각각 들어있는 항목의 개수: h와 m
  • 분석: i=h이고, j=m-1인 상태로 루프(loop)에서 빠져 나가는 때가 최악의 경우로서 (V에 있는 처음 m-1개의 항목이 S의 앞부분에 위치하고, U에 있는 h개의 모든 항목이 그 뒤에 위치하는 경우), 이때 단위연산의 실행 횟수는 h + m - 1이다. 따라서 최악의 경우 합병하는 시간복잡도는 W(h, m) = h + m - 1.

합병정렬 알고리즘의 최악의 경우 시간복잡도 분석

  • 단위연산: 합병 알고리즘 merge에서 발생하는 비교
  • 입력크기: 배열 S에 들어 있는 항목의 개수 n
  • 분석: 최악의 경우 수행시간은 W(h,m) = W(h) + W(m) + h + m - 1이 된다. 여기서 W(h)는 U를 정렬하는데 걸리는 시간, W(m)은 V를 정렬하는데 걸리는 시간, 그리고 h + m - 1은 합병하는데 걸리는 시간이다. 정수 n을 2k(k>=1)이라고 가정하면, h= n/2, m=n/2가 된다. 따라서 최악의 경우 재현식은:
    W(n) = 2W(n/2)+n-1 n>1이고, n=2k(k>=1)
    W(1) = 0 왜냐하면 합병이 전혀 이루어지지 않으므로 이 재현식의 해는 아래의 도사정리의 2번을 적용하면
    W(n) = O(n lg n)이 된다.

[강의정리] 알고리즘 W3 - Data Structures


Data Structure

List

Linked List

  • 배열과 달리 크기를 바꿀 수 있는 자료구조

  • 각 노드는 다음노드를 가르키는 포인터를 가짐

  • 첫번째노드: 헤드(Head), 마지막 노드: 테일(Tail)

Double Linked List

  • 각 노드는 다음노드와 이전노드를 가르키는 포인터를 가짐

Circle Linked List

  • Head가 Tail을 물고있는 형태의 Linked List

Stack

  • 먼저 들어간 요소가 나중에 나옴 (First-In, Last-Out: LIFO)

Queue

  • 먼저 들어간 요소가 먼저 나옴 (First-In, First-Out: FIFO)

Circle Queue

Linked Queue

Tree

  • 나무를 닮은 구조
  • Root, Branch, Leaf로 이루어져 있음

    깊이(Depth): 루트노드에서 해당 노드까지의 경로의 길이

    레벨(Level): 같은 깊이를 가지는 노드의 집합

    높이(Height): “가장 깊은 곳”에 있는 잎노드까지의 깊이

차수(Degree): 자식 노드의 개수

트리의 차수: 트리 내에 있는 노드들 가운데 자식 노드가 가장 많은 노드의 차수

이진트리(Binary Tree)

  • 모든 노드가 최대 “2 개”의 자식을 가질 수 있는 트리

    포화 이진 트리(Full Binary Tree)

  • 모든 노드가 대대손손이 자식을 둘씩 가지고 있는 이진 트리

    완전 이진 트리

  • 잎 노드들이 트리의 왼쪽부터 차곡차곡 채워진 트리

    완전 높이 균형 트리(Completely Height Balanced Tree)

  • 루트 노드를 기준으로 왼ㅉ고 하위 트리와 오른ㅉ고 하위 트리의 높이가 같은 이진트리

Priority Queue

  • 우선순위 속성을 갖는 데이터를 다룸

Heap

  • 힙 순서 속성(Heap Order Property)를 만족하는 완전 이진 트리
  • 힙 순서 속성 : 트리 내의 모든 노드가 부모 노드보다 커야 한다는 규칙

Graph

인접 행렬 : 정점 끼리의 인접 관계를 나타내는 행렬

[강의정리] 알고리즘 W2


Introduction to Algorithm

알고리즘의 학습목표

Design(설계)

알고리즘 설계하는 기법

Analysis(분석)

  • 알고리즘을 분석, 시간/공간 복잡도 구하기

Computational Complexity(계산복잡도)

  • 문제를 분석하여 계산적 복잡도 구하기

알고리즘의 분석

시간복잡도(Time Complexity) 분석

  • 입력 크기에 따라서 단위연산이 몇번 수행되는지 결정하는 절차(n)

표현 척도

입력크기(input size)

  • 배열의 크기, 리스트의 길이, 행렬에서 행과 열의 크기, 트리에서 마디와 이음선의 수, 그래프에서는 정점과 간선의 수

    단위연산(basic operation)

  • 비교(comparison), 지정(assignment) 등 시간복잡도에 가장 크게 영향을 미치는 연산

분석 방법의 종류

  • 모든경우 분석(Every-case analysis)
  • 최악의 경우 분석(Worst-case analysis)
  • 평균의 경우 분석(Average-case analysis)
  • 최선의 경우 분석(Best-case analysis)

계산복잡도

Big O 표기법

정의 : 점근적 상한(Asymptotic Upper Bound)

차수의 주요 성질

복잡도 함수 순서

  • lgn, n, nlgn, n2, nj, nk, an, bnn, n!
    k > j > 2, b > a > 1

[강의정리] 고급 컴퓨터수학 W1


선형 대수 (Linear Algebra)

스칼라 : 숫자(Magnitude)나 크기만 있고 방향을 갖지 않는 (키, 몸무게, 속력 등)

벡터 : 스칼라의 배열, 크기와 방향을 가진 값 (속도 등) 공간벡터, 위치벡터..

행렬 : 2차원의 배열

텐서 : 임의의 차원을 갖는 배열, 좌표 변환 등으로 사용

  • 0차 텐서, 1차 텐서, 2차 텐서, 3차 텐서 등 *

[강의정리] 데이터통신과네트워크 Overview(2)


네트워크 계층 구조

네트워크 계층 구조: 네트워크 계층

네트워크 계층 프로토콜: ARP (Address Resolution Protocol)

  • 데이터를 전달하려는 IP 주소와 통신에 필요한 물리적인 주소(MAC)를 알아내는 프로토콜
  • 선택된 매체에 브로드캐스트를 통해 특정 IP 주소를 사용하는 호스트가 응답을 하도록 요구하는 방식을 사용


네트워크 계층 프로토콜: IP (Internet Protocol)

  • 가장 대표적인 네트워크 계층의 프로토콜
  • 하위 계층의 서비스를 이용하여 두 노드 간의 데이터 전송 경로를 확립해주는 역할 (단말장치 간 패킨 전송 서비스)

IP (Internet Protocol)주소 체계

  • 32자리 2진수로, 8자리마다 점을 찍어 구분
  • A, B, C, D, E 클래스로 구분하는데 각 클래스는 네트워크 부분과 호스트 부분으로 구성
  • A, B, C 클래스는 맨 앞부분에 시작하는 2진수 숫자에 따라 구분

IP (Internet Protocol)주소 분류

  • 사설 네트워크: 사설 네트워크는 공인 네트워크 주소 부족 현상을 해결하기 위해 많이 사용



네트워크 계층 프로토콜: ICMP (Internet Control Message Protocol)

  • 호스트 서버와 인터넷 게이트웨이 사이에서 메시지를 제어 및 오류를 알려주는 프로토콜
  • 대표적인 툴은 ping

ICMP Echo Request 메시지

  • 송신측의 전송 패킷이 목적이 노드나 라우터에 도착했는지를 확인하는 데 사용

네트워크 계층 프로토콜: IGMP (Internet Group Management Protocol)

  • 멀티캐스트에 관여하는 프로토콜로 멀티캐스트 그룹을 관리하는 역할
  • 유니캐스트(Unicast) - 일반적, 브로드캐스트(Broadcast), 멀티캐스트(Multicast) - 중간 / 효율높음
  • IP 멀티캐스트 주소는 D 클래스 주소 대역(244.0.0.1 ~ 239.255.255.255)으로 규정

네트워크 계층 관련 장비: 라우터

  • 네트워크의 대표적인 장비, 게이트웨이라고도 함
  • 논리적으로 분리된 둘 이상의 네트워크를 연결
  • 로컬 네트워크에서 브로드캐스트를 차단하여 네트워크를 분리
  • 패킷이 목적지까지 가장 빠르게 보내는 길잡이 역할

정적 라우팅

  • 관리자 권환으로 특정 경로를 통해서만 패킷이 지날 수 있도록 설정
  • 네트워크 변경사항이 발생하면 라우팅 테이블을 수동으로 직접 고쳐야 함
  • 보안이 중요한 경우 선호

동적 라우팅

  • 라우터가 네트워크 연결 상태를 스스로 파악하여 최적의 경로를 선택해 전송
  • 네트워크 연결 형태가 변경되어도 자동으로 문제를 해결


네트워크 계층 구조: 전송 계층

4계층: 전송 계층(Transport Layer)

  • 프로토콜(TCP, UDP)과 관련된 계층으로 오류 복구와 흐름 제어 등을 담당, 두 시스템 간에 신뢰성 있는 데이터를 전송
  • 네트워크 계층에서 온 데이터를 세션 계층의 어느 어플리케이션에 보낼 것인지 판독, 전송할 경로(Port, 포트)를 선택
  • 네트워크 계층에서 전송한 데이터와 실제 운영체제의 프로그램이 연결되는 통신 경로라고 할 수 있음

  • 대표 프로토콜은 TCP(Transmission Control Protocol)
  • TCP가 가진 주소를 포트(Port)라 하며 0~65532(216-1)번까지 존재
  • -~1023번(1,024)d을 잘 알려진 포트(Well Known Port)라고 부름 (보통 0번 포트는 사용하지 않음)

포트 주소

  • 수신지 컴퓨터까지 전송하려면 IP 주소와 물리 주소의 포트주소도 필요함!
  • 인터넷 통신의 최종 목적은 한 프로세스가 다른 프로세스와 통신할 수 있도록 하는 것

  • 즉 포트는 Tcp가 상위 계층으로 데이터를 전달하거나 상위 계층에서 TCP로 데이터를 전달할 때 상호 간에 사용하는 데이터의 이동 통로를 말함

전송 계층 프로토콜: TCP(Transmission Control Protocol)

  • 연결 지항형 프로토콜
  • IP와 함께 통신을 하는 데 반드시 필요한 가장 기본적인 프로토콜

TCP의 특징

  • 높은 신뢰성
  • 가상 회선 연결 방식
  • 연결의 설정과 해제
  • 데이터 체크섬
  • 시간 초과와 재전송
  • 데이터 흐름 제어

연결 설정 과정(Three-Way Handshaking)

연결 해제 과정

전송 계층 프로토콜: UDP(User Datagram Protocol)

  • 비연결 지향형 프로토콜
  • 상대방이 보낸 응답을 확인하지 않아 네트워크에 부하를 주지 않음
  • 데이터 자체의 신뢰성이 없어 수신한 데이터의 무결성을 보장받지 못함

UDP의 특징

  • 비연결 지향형
  • 네트워크 부하 감소
  • 비신뢰성
  • 전송된 데이터의 일부가 손실됨

네트워크 계층 구조: 세션 계층

5계층: 세션 계층(Session Layer)

  • 응용 프로그램 계층 사이의 접속을 설정 · 유지 · 종료시켜주는 역할
  • 통신장치간의 설정을 유지하고 동기화 하는 역할

네트워크 계층 구조: 표현 계층

6계층: 표현 계층(Presentation Layer)

  • 데이터 표현 차이를 해결하려고 서로 다른 형식으로 변환하거나 공통 형식을 제공하는 계층

네트워크 계층 구조: 응용 계층

7계층: 응용 계층(Application Layer)

  • 여러가지 프로토콜에 대하여 사용자인터페이스를 제공

응용 계층(Application Layer) 관련 프로토콜들

FTP(File Transfer Protocol, 20,21)

  • 파일 전송을 위한 가장 기본적인 프로토콜
  • 1972 년 텔넷과 함께 표준으로 제정
  • 클라이언트와 서버가 대화형으로 통신 가능

Telnet(텔넷, 23)

  • 사용자가 원격에 있는 서버에 로그인하도록 TCP 연결을 설정
  • 단말기가 원격 컴퓨터 바로 옆에 있는 것처럼 직접 조작할 수 있게 해줌

POP3 & IMAP

  • POP3(110) : 메일 서버로 전송된 메일을 확인할 때 사용하는 프로토콜
  • IMAP(143) : POP3 와 기본적으로 같으나 , 메일을 읽은 후 메일이 서버에 남음

SMTP(Simple Mail Transfer Protocol, 25)

  • 메일 서비스

DNS(Domain Name System, 53)

  • 도메인 이름 주소를 통해 IP 주소를 확인할 수 있는 프로토콜

TFTP(Trivial File Transfer Protocol, 69)

  • 파일을 전송하는 프로토콜
  • UDP 패킷을 사용하고 , 인증 기능을 제공하지 않음

HTTP( HyperText Transfer Protocol, 80)

  • 인터넷을 위해 사용하는 가장 기본적인 프로토콜

네트워크 장비

네트워크 장비: 스위치 종류

  • L2 스위치: MAC 정보 기반 네트워크 통신 지원
  • L3 스위치: IP 정보 기반 네트워크 통신 지원
  • L4 스위치: IP 정보 + 포트정보 기반 네트워크 통신 지원
  • L7 스위치: Application Data 기반 네트워크 통신 지원

기본적인 네트워크의 구성

[강의정리] 데이터통신과네트워크 Overview


네트워크의 이해

네트워크의 사전적 의미

  • 여러한 통신설비를 통해서 두대 이상의 컴퓨터를 서로 연결하는것

다수의 컴퓨터를 네트워크로 연결했을 때 얻을 수 있는 이점

  • 데이터 공유가 용이함 (NAS)
  • 주변장치 공유 (프린터)
  • 눙률적인 통신 (메일)

근거리통신 (Local Area Network)

근거리 통신망 (LAN, Local Area Network)

  • 한 건물이나 학교 내 캠퍼스처럼 비교적 가까운 지역에 한정된 통신망

광역통신 (Wide Area Network)

광역 통신망 (WAN)

  • 두 개 이상의 근거리 네트워크가 넓은 지역에 걸쳐 연결되어 있는 것
  • WAN은 하나의 국가 또는 국가와 국가 간을 연결하는 매우 범위가 넓은 네트워크
  • 우리가 매일 사용하는 인터넷

통신방식

클라이언트/서버 시스템

  • 다른 컴퓨터에 데이터 전송 서비스를 제공하는 컴퓨터를 ‘서버’라 하고, 서버에서 보내주는 데이터서비스를 수신하는 컴퓨터를 ‘클라이언트’라고 한다.

유니캐스트

  • 네트워크에서 가장 많이 사용하는 방식
  • 서버와 클라이언트 간의 일대일(1:1) 통신 방식
  • 클라이언트의 IP주소와 MAC주소가 필요

브로드캐스트

  • 로컬 LAN(라우터로 구분된 공간)에 있는 모든 네트워크 단말기에 데이터를 보내는 방식

  • 서버와 클라이언트간에 일대모두(1:모두)로 통신하는 데이터 전송 서비스

  • 브로드캐스트의 MAC주소는 FF-FF-FF-FF-FF-FF로 미리 정해져 있다.

  • 다른 라우터를 찾거나, 라우터끼리 데이터를 교환하거나, 서버가 서비스를 제공하려고 모든 클라이언트에게 알릴 때 등 여러 상황에서 사용

  • 하지만 불특정 다수에게 전송되는 서비스라 수신을 원치않는 클라이언트도 수신하므로 네트워크 성능 저하를 가져올 수 있다.

멀티캐스트

  • 브로드캐스트는 데이터를 무조건 CPU로 전송하기 때문에 컴퓨터 자체의 성능을 떨어뜨림
  • 멀티캐스트는 전송하려는 특정 그룹에게만 한 번에 전송할 수 있기 때문에 유니캐스트처럼 반복해서 보낼 필요가 없고, 브로드캐스트처럼 전송받을 필요가 없는 컴퓨터에 보내지 않아도 됨


프로토콜 (Protocol)

프로토콜에 대한 이해

  • 본래의 의미는 외교에서 의례 또는 의정서
  • 톰 마릴이 컴퓨터와 컴퓨터 사이에서 메시지를 전달하는 과정이라 정의

프로토콜의 3가지 요소

  • 구문(Syntax): 데이터의 구조나 포멧을 의미
  • 의미(Semantics): 전송되는 데이터의 각 부분이 무엇을 뜻하는지를 알 수 있게 미리 정해둔 규칙
    (데이터 자체뿐만 아니라 오류 제어, 동기 제어, 흐름 제어를 포함)
  • 순서(Timing): 어떤 데이터를 보낼 것인지와 얼마나 빠르게 데이터를 보낼 것인지 정의

프로토콜의 기능

주소 설정(Addressing)

  • 서로 다른 시스템의 두 개체가 통신을 하는경우 필요

순서 제어(Sequence Control)

  • 프로토콜 데이터 단위를 전송할 때 보내는 순서를 명시하는 기능(연결 지향형 (Connection-Oriented)에서만 사용)

데이터 대열의 단편화 및 재조합(Fragmentation & Reassembly)

  • 대용량 파일을 전송할 때 전송 효율이 높은 작은 단위로 나누어 전송한 뒤 전송 받은 시스템에서 이를 재조합 해야 함
  • 어떻게 쪼갤건지, 재조합 할건지

캡슐화(Encapsulation)

  • 데이터에 제어 정보를 추가

연결 제어(Connection Control)

  • 연결 설정, 데이터 전송, 연결 해제에 대한 통제 수행

흐름 제어(Flow Control)

  • 송신측 개체로부터 오는 데이터의 양이나 속도를 조절하는 기능
  • 송신측과 수신측의 속도 차이 등으로 인한 정보 유실을 방지

오류 제어(Error Control)

  • 두 개체에서 데이터를 교환할 때 오류가 발생할 경우, 이를 제어하는 기법
  • 순서를 검사하거나 특정 시간 안에 받지 못하면 재전송을 요구하는 방식

동기화(Synchronization)

  • 두 개체 간에 데이터를 전송할 때 각 개체는 특정 타이머 값이나 윈도우 크기 등을 통해 동시에 정의된 인자 값을 공유하는 것

다중화(Multiplexing)

  • 통신 선로 하나에서 여러 시스템을 동시에 통신할 수 있는 기법

전송 서비스

  • 우선순위 결정, 서비스 등급과 보안 요구 등을 제어하는 서비스


네트워크 계층 구조

네트워크 계층화에 대한 이해

  • 1980년대 초 ISO(International Organization for Standardization)은 여러 업체가 만든 시스템에 대해 상호 연동이 가능한 표준 네트워크 모델을 제정할 필요성을 인식
  • 1984년 OSI(Open System Interconnection) 네트워크 모델을 발표

OSI 7계층 모델

OSI 7계층

물리 계층: 1계층

  • 실제 장치를 연결하는데 필요한 전기적, 물리적 세부 사항을 정의
  • 물리 계층의 장치로는 허브나 리피터가 있음

데이터 링크 계층: 2계층

  • 점대점(Point-to-Point) 사이의 신뢰성 있는 전송을 보장하기 위한 계층
  • CRC 기반의 오류 제어와 흐름 제어가 필요
  • 가장 잘 알려진 예는 이더넷

네트워크 계층: 3계층

  • 여러 노드를 거칠 때마다 경로를 찾아주는 역할
  • 라우팅, 흐름 제어, 단편화(Segmentation/Desegmentation), 오류 제어 등을 수행
  • 대표적인 예는 라우터임, 또한 3계층에서 동작하는 스위치를 흔히 L3 스위치라 함.

전송 계층: 4계층

  • 양 끝단 사용자들이 신뢰성 있는 데이터를 주고받을 수 있게 하여 상위 계층이 데이터 전달의 유효성이나 효율성을 고려하지 않아도 되게 해줌.
  • 전송 계층에서 동작하는 프로토콜 중 TCP는 연결 지향(Connetion-Oriented) 프로토콜임

세션 계층: 5계층

  • 양 끝단의 응용 프로세스가 통신을 관리하기 위한 방법을 제공
  • TCP/IP 세션을 만들고 없애는 책임을 짐.

표현 계층: 6계층

  • 시스템에서 사용되는 코드 간의 번역을 담당
  • 표현 계층은 data의 Format(형식)을 정의함

응용 계층: 7계층

  • 사용자나 응용 프로그램 사이에 데이터 교환을 가능하게 하는 계층
  • HTTP, FTP, 터미널 서비스, 메일 프로그램, 디렉토리 서비스 등을 제공


TCP/IP 4계층

OSI 7계층 vs. TCP/IP 4계층

  • OSI는 개념적인 모델 (실제 구현에서 반드시 지킨다고 볼 수 없음)
  • TCP/IP 프로토콜은 OSI 모델보다 먼저 개발됨
  • TCP/IP 프로토콜의 계층은 OSI 모델의 계층과 정확히 일치하지 않음
  • 두 계층을 비교할 때, 세션(Session)과 표현(Presentation) 2개의 계층이 TCP/IP프로토콜 그룹에 없다는 것을 알 수 있음
  • OSI 7 Layer는 장비 개발과 통신 자체를 어떻게 표준으로 잡을지 사용되는 반면에 실질적인 통신 자체는 주로 TCP/IP 프로토콜을 사용함
  • 최근에는 TCP/IP 모델을 5계층으로 분류하기도 함

네트워크 계층 구조: 물리 계층

1계층: 물리 계층(Physical Layer)

  • 두 시스템 간에 데이터를 전송하려고 링크를 활성화하고 관리하는 전기적 · 기계적 · 절차적 · 기능적 특성 등을 정의

  • OSI 참조 모델 7계층 중 물리 계층은 최하위 계층인 첫 번째 계층으로, 상위 계층에서 전송된 데이터를 물리매체를 통해 다른 시스템에 전기적 신호로 전송

  • LAN 카드, 케이블, 허브, 라우터 등 물리적인 것과 데이터 전송에 사용하는 전압 등 기본적인 것들이 물리계층에 속함.

  • 송신 측: 데이터 링크 계층에서 0과 1로 구성된 비트열의 데이터(프레임)을 받아 전기적 신호로 변환한 후 전송매체를 통하여 수신측에 보냄

  • 수신 측: 송신측에서 받은 전기 신호를 0과 1로 구성된 비트열로 복원, 수신측의 데이터 링크 계층에 전송

물리 계층 관련 장비

리피터(Repeater)

  • 네트워클르 연장하기 위한 장비
  • 불분명해진 신호 세기를 다시 증가시키는 역할
  • 최근 리피터가 모든 네트워크 장비에 공통으로 들어가는 기능이 됨.

허브(Hub)

  • 요즘 쓰이는 스위치의 예전 형태
  • 허브는 스위치와 형태나 사용 방법이 같지만 패킷을 모든 곳에 똑같이 복사해서 보내는 것이 다름(스위치는 목적지에만 데이터를 전송)

네트워크 계층 구조: 데이터 링크 계층

  • 물리적 링크를 이용하여 신뢰성 있는 데이터를 전송하는 계층
  • 네트워크를 통해 데이터를 전송할 때 전송로 역할
  • 데이터 링크 계층은 비트를 프레임이라는 논리적 단위로 구성
  • 시스템 간에 오류 없이 데이터를 전송하려고 **네트워크 계층에서 받은 데이터 단위(패킷)를 프레임으로 구성하여 물리 계층으로 전송


  • 데이터 링크 계층의 물리적인 주소: 랜카드나 네트워크 장비의 하드웨어 주소(MAC 주소)
  • 네트워크 카드의 MAC 주소는 윈도우 명령 창에서 ‘ipconfig /all’ 명령을 실행하면 ‘Physical Address’ 에서 확인 가능
    • 리눅스 Machine의 경우 ifconfig 명령어

MAC 주소

  • 총 12개의 16진수로 구성
  • 앞쪽 6개는 네트워크 카드를 만든 회사(OUI: Organizationally Unique Identifier)를 뜻하고, 뒤쪽 6개는 호스트 식별자(Host Identifier)로 각 회사에서 임의로 붙이는 일종의 시리얼
  • 같은 MAC 주소는 존재하지 않음

데이터 링크 계층 프로토콜: 이더넷

  • 제록스의 PARC(Palo Alto Research Center)에서 1970년대에 개발한 데이터 링크 계층의 프로토콜

CSMA/CD (Carrier Sense Multiple Access/Collision Detection)

  • 이더넷의 통신 방식
  • 이더넷 환경에서 통신을 하고 싶을 때, Carrier Sense를 수행함
  • 복수개의 디바이스가 동시에 통신을 시작할 때, Collision이 발생하고 이를 Detection 할 수 있음
  • Collision Detection이 일어난 후, 랜덤한 시간을 기다리고 다시 데이터를 보냄

데이터 링크 계층 장비

브리지(Bridge)

  • 랜(LAN)과 랜(LAN)을 연결하는 초기의 네트워크 장치
  • 데이터 링크 계층에서 통신 선로를 따라서 한 네트워크에서 그 다음 네트워크로 데이터 프레임을 복사하는 역할

스위치

  • 기본적으로 데이터 링크 계층에서 작동하는 스위치를 뜻함 (L2 스위치)
  • 허브의 단점이 Collision Domain의 확대를 해결
    • L2 스위치는 연결된 시스템이 늘어날수록 패킷 간 충돌 때문에 매우 낮은 속도로 동작하는 더미 허브의 문제점을 해결하는 획기적인 방안
  • 과거에는 브릿지를 통해서 Collision Domain을 나누었지만, 현재는 스위치가 인기가 많음.

스위치의 MAC 주소 테이블

  • 시스템 간의 원활한 통신을 위해 주소 테이블을 생성하고 관리하는 역할

네트워크 계층 구조: 네트워크 계층

3계층: 네트워크 계층(Network Layer)

  • 랜(LAN)을 벗어난 통신을 하기 위해 네트워크 계층에서 IP 주소를 사용
  • 라우팅 프로토콜을 사용하여 최적의 경로를 선택
  • 네트워크 계층은 데이터를 패킷 단위로 분할하여 전송한 후 재결합함