IPv4 

- 네트워크 상에서 데이터를 교환하기 위한 프로토콜

- 데이터가 정확하게 전달될 것을 보장하지 않음 *다른 계층에서 데이터잘못된 것을 고정

 

ICMP

- 인터넷 제어 메세지 프로토콜

- 네트워크 컴퓨터 위에서 돌아가는 운영체제에서 오류 메세지를 전송 받는데 주로 쓰인다.

* 상대방과 통신이 되는지 아닌지 확인

* Type  3 오류 : Destination unreachable, 상대 목적지까지 못간 경우

  Type 11 오류 : Time exceded, 상대방 노드에서 데이터를 받지 못한 경우(ex. 방화벽 문제)

 

라우팅 테이블

- 라우팅 == 지도

- 어디로 보내야 하는지 설정되어 있는 라우팅 테이블

 

라우팅 전송 과정

- 내컴퓨터 -> 공유기로,

  (1) 라우팅 테이블 통해, 공유기로의 IP대역대 확인

  (2) [eth | IPv4 | ICMP 요청] 프로토콜에 따라 전송

  (3) 이더넷의 MAC주소 변경 

- 공유기 -> 다른 컴퓨터가 있는 공유기

- 다른 컴퓨터의 공유기 -> 다른 컴퓨터

 

조각화

- 데이터의 최대전송단위(MTU, Maximum Transmission Unit)는 일반적으로 최대 1500 byte로 되어 있다.

- 내가 전달하려는 데이터가 MTU보다 크면 조각화를 통해서 데이터를 전송한다.

- IPv4

  MF:More Fragment, 내 다음에 데이터가 더 있으면1 아니면 0,  Offset : 위치

- 실제 페이로드 

  Data

* 조각화를 할 때에는 MTU에서 IPv4프로토콜만큼을 제외하여 데이터를 조각낸다.

  (ex. 아래의 경우 MTU가 3300byte이며, IPv4가 20byte가 필요하므로 데이터를 3280bytes씩 조각화한다)

* 조각화된 각 데이터에는 ID값이 있어 어느 고유 데이터에서 파생된 조각인지 확인할 수 있다.

* 각각의 조각화된 데이터들을 offset으로 위치 지정한다. (배열의 index처럼 어느 위치에 있는지를 나타냄) / 8

 

 

 

[출처] 따라하면서 배우는 IT, 네트워크 기초

https://www.youtube.com/watch?v=_AONcID7Sc8&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=14 

 

https://www.youtube.com/watch?v=LDsp-Xb168E&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=7 

 

ARP 프로토콜

- 같은 네트워크에서 통신할 때는 MAC주소를 통해 통신한다.

- ARP프로토콜은 MAC주소를 IP주소를 이용해서 알아오는 프로토콜이다.

- 출발지 및 목적지의 MAC주소와 IP주소가 페이로드에 작성되어 있음

 

네트워크상에서 보는 ARP

목적지IP주소와 요청IP주소가 일치하는 곳
그곳의 MAC주소를 다시 출발지로 전달한다.

■ 정렬의 속도 / 메모리 사용 비교

- 미니멈이 1이고, 맥시멈이 백만인 숫자를 입력받아 정렬한다고 할 때, 어떤 정렬을 쓰는게 좋을까....?

- 문제를 풀어본 결과, Merge sort가 가장 빨랐고, 그 다음에 Arrays.sort, 그 다임이 Quck Sort 였다.

- 그럼 Arrays.sort는 무슨 정렬을 사용하는 걸까...

 

https://www.acmicpc.net/problem/2751

 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

Collections와 Arrays의 Sort 메소드가 사용하는 정렬방식

[1] Arrays.sort() : 듀얼 피봇 퀵정렬 (Dual-Pivot QuckSort)

[2] Collections.sort() : Tim 정렬 (삽입 정렬 + 합병정렬을 결합한 방식)

https://sabarada.tistory.com/138

 

[Java] Java의 정렬 알고리즘 - Arrays와 Collections

안녕하세요. 오늘 포스팅은 Java의 Collection에서 사용하고 있는 정렬에 대해서 알아보려고 합니다. Java를 사용하다보면 정렬해서 처리해야할 경우가 생깁니다. 그럴경우 아래와 같이코드를 작성

sabarada.tistory.com

 

■ 결론

- 위 문제에서는 결국, 병합정렬을 사용할 때 가장 빠르고, 그 다음에 듀얼 피봇 퀵정렬을 사용할 때 빨랐다.

- 퀵 정렬은 오히려 시간이 오래 걸려 시간 초과가 나타났다.

   ☆ 공부한 내용을 정리한 내용입니다. 잘못된 부분이 있으면 고정 위해 댓글 부탁드립니다.

 

https://www.youtube.com/watch?v=QAyl79dCO_k&list=PLjSkJdbr_gFZMNhIMl2AJ9n5c2hNK-qJk&index=2 

 

■ 병합 정렬

- 병합 정렬이란? 요소가 하나만 남을 때까지 리스트를 나눠준 후[분할],

                       나눴던 리스트를 대소 관계에 맞게 다시 합치는 방법[병합]

- 분할 분할 분할 분할.... 병합 병합 병합 병합... 을 반복한 결과

- 안정적이지만, 자료구조를 하나 더 만들 필요가 있다.

   *자료구조를 더 만들 수 없을 땐 퀵 소트를 쓴다.

- 시간 복잡도 O(n log n) , 최악(n log n) 

부스트코스

 

■ 자바로 구현한 병합 정렬

//[[부스트 코스 방식]]
static int[] array, temp;

public static void mergeSort(int[] arr) {
    array = arr;
    temp = new int[array.length];
    split(0, array.length-1);
}

//리스트가 1개가 남을 때까지 나눈다.
private static void split(int low, int high) {
    if (low == high) return; //값이 하나만 있으면 정렬할 필요 없음
    int mid = high + low / 2;
    split(low, mid);
    split(mid+1,high);
    merge(low,mid,high);
}

//대소 비교 후 순서에 맞게 열거한다.
private static void merge(int low, int mid, int high) {
    int i = low, j = mid+1, tempposn = low;

    //나눈 리스트의 대소 비교와 정렬
    while (i <= mid && j <= high) {
        if (array[i] <= array[j]) {
            temp[tempposn++] = array[i++];
        }
        else {
            temp[tempposn++] = array[j++];
        }
    }

    //i가 mid로 가고, j가 high로 갈 때까지 반복
    while (i <= mid) temp[tempposn++] = array[i++];
    while (j <= high) temp[tempposn++] = array[j++];

    //원래 배열에 다시 복사
    for (tempposn = low; tempposn <= high; tempposn++)
        array[tempposn] = temp[tempposn];

}
//[[엔지니어 대한민국 방식]]
private static void mergeSort2(int[] arr2) {
    int[] tmp = new int[arr2.length];
    mergeSort2(arr2, tmp, 0, arr2.length - 1);
}

private static void mergeSort2(int[] arr2, int[] tmp, int start, int end) {
    if (start < end) {
        int mid = (start + end) / 2;
        mergeSort2(arr2, tmp, start, mid);
        mergeSort2(arr2, tmp, mid+1, end);
        merge2(arr2, tmp, start, mid, end);
    }
}

private static void merge2(int[] arr, int[] tmp, int start, int mid, int end) {
    for (int i = start; i <= end; i++) {
        tmp[i] = arr[i];
    }
    int part1 = start;
    int part2 = mid + 1;
    int index = start;
    while (part1 <= mid && part2 <= end) {
        if (tmp[part1] <= tmp[part2]) {
            arr[index] = tmp[part1];
            part1++;
        }else {
            arr[index] = tmp[part2];
            part2++;
        }
        index++;
    }
    for (int i = 0; i <= mid - part1; i++) {
        arr[index+i] = tmp[part1+i];
    }
}
   ☆ 공부한 내용을 정리한 내용입니다. 잘못된 부분이 있으면 고정 위해 댓글 부탁드립니다.

 

■ 퀵 정렬

원리 ) 중심점(Pivot Point)을 임의로 고른 후
       이 중심점보다 작은 수를 한 쪽으로 분류하고, 큰 수들은 다른 쪽으로 분류하여 정렬하는 방법
       * 분할과 정복

- 중앙값 정렬 방식을 확장하여 개발한 방식.

- 평균 정렬 결과가 필요할 때 사용하는 것이 좋다.

- 퀵 정렬은 멀리 있는 값을 서로 비교하고 교환하기 때문에 안정성은 떨어진다.

- 시간 복잡도 O(n log n) 

 

※ 피벗을 중간 또는 마지막을 잡는 이유 :

- 피벗은 첫번째, 중간, 마지막 인덱스나 랜덤으로 선정 가능하다.

- 무엇을 피벗으로 잡느냐에 따라 처리 시간이 달라진다.

- 피벗 값이 중간 크기일 수록 더 균등하게 리스트를 분할 할 수 있다.

 

■ 재귀적인 퀵 정렬 (배열 사용)

package _02_정렬;

import java.util.Arrays;

public class _00_QuickSort3_안보고구현하기 {
	
	//오름차순 퀵소트 메소드를 구현하라
	private static void quickSortAsc(int[] arr, int left, int right) {
		int pl = left;
		int pr = right;
		int pivot = arr[(pl + pr)/2];
		
		//피봇 값을 기준으로 좌우를 정렬
		while (pl <= pr) {
			while (arr[pl] < pivot) pl++; //큰값이 나올때까지
			while (arr[pr] > pivot) pr--; //작은값이 나올때까지
			
			if (pl <= pr) {
				swap(arr, pl, pr); //교환하고
				pl++; //다시 커서 이동
				pr--;
			}
		}
		
		//재귀를 사용해 분할&정렬을 반복한다. (이 시점에서 pr < pl)
		if (left < pr) { //1개 이상일 때 
			quickSortAsc(arr, left, pr);
		}
		
		if (pl < right) {
			quickSortAsc(arr, pl, right);
		}
		
	}
	
	//내림차순 퀵소트 메소드를 구현하라
	private static void quickSortDes(int[] arr, int left, int right) {
		int pl = left;
		int pr = right;
		int pivot = arr[(pl + pr)/2];
		
		//피봇 값을 기준으로 좌우를 정렬
		while (pl <= pr) {
			while (arr[pl] > pivot) pl++; //작은값이 나올때까지
			while (arr[pr] < pivot) pr--; //큰값이 나올때까지
			
			if (pl <= pr) {
				swap(arr, pl, pr); //교환하고
				pl++; //다시 커서 이동
				pr--;
			}
		}
		
		//재귀를 사용해 분할&정렬을 반복한다. (이 시점에서 pr < pl)
		if (left < pr) { //1개 이상일 때 
			quickSortDes(arr, left, pr);
		}
		
		if (pl < right) {
			quickSortDes(arr, pl, right);
		}
	}
	
	//교환 메소드
	static void swap(int[] arr, int index1, int index2) {
		int tmp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = tmp;
	}
	
	//랜덤 메소드
	public static int[] random(int[] arr) {
		
		OUTER :
		for (int i = 0; i < arr.length; i++) {
			
			arr[i] = (int)(Math.random()*10)+1;
			
			for (int j = 0; j < i; j++) {
				
				if (arr[j] == arr[i]) {
					i--;
					continue OUTER;
				}
			}
		}
		
		return arr;
		
	}

	public static void main(String[] args) {
		int[] arr = new int[10];
		
		random(arr);
		
		System.out.println(Arrays.toString(arr));
		
		quickSortAsc(arr, 0, arr.length-1);
		
		System.out.println(Arrays.toString(arr));
		
		quickSortDes(arr, 0, arr.length-1);
		
		System.out.println(Arrays.toString(arr));
		
	}

}

>> 결과

[1, 7, 5, 10, 2, 4, 3, 8, 9, 6]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
더보기
//엔지니어 대한민국 방식
private static void quickSort(int[] arr) {
    quickSort(arr,0,arr.length-1);
}

private static void quickSort(int[] arr, int start, int end) {
    int part2 = partition(arr, start, end);
    if (start < part2 - 1) { //오른쪽 파티션이 왼쪽 파티션보다 1개 보다 더 많이 차이날때
        quickSort(arr, start, part2 - 1);
    }
    if (start < end) { //오른쪽 파티션이 1개 이상일 때
        quickSort(arr, part2, end);
    }
}

private static int partition(int[] arr, int start, int end) {
    int pivot = arr[(start + end) / 2];
    while (start <= end) {
        while (arr[start] < pivot) start++;
        while (arr[end] > pivot) end--;
        if (start <= end) {
            swap (arr, start, end);
            start++;
            end--;
        }
    }
    return start;
}

private static void swap(int[] arr, int start, int end) {
    int tmp = arr[start];
    arr[start] = arr[end];
    arr[end] = tmp;
}

private static void printArray(int[] arr) {
    for (int data : arr) {
        System.out.print(data + ",");
    }
    System.out.println();
}

 

■ 비재귀적인 퀵 정렬 (ArrayList or Stack 사용)

//알고리즘과 자료구조 방식
public static <T extends Comparable<? super T>> List<T> quicksort(List<T> list)
{
    if (list.size() <= 1) return list;

    int pivot = list.size() / 2;

    List<T> a = new ArrayList<T>(); //lesser
    List<T> b = new ArrayList<T>(); //greater

    int c = 0; //same

    for (T number : list) {
        if (list.get(pivot).compareTo(number) < 0) //-1, number > pivot
            b.add(number);
        else if (list.get(pivot).compareTo(number) > 0) //+1, number < pivot
            a.add(number);
        else
            c++;
    }

    a = quicksort(a);
    for (int i = 0; i < c; i++) {
        a.add(list.get(pivot));
    }

    b = quicksort(b);

    List<T> sorted = new ArrayList<T>();
    sorted.addAll(a);
    sorted.addAll(b);
    return sorted;

}

 

 

[출처]

- 부스트코스, 자바로 구현하고 배우는 자료구조

- 유투브, 엔지니어 대한민국, 퀵정렬에 대해 알아보고 자바로 구현하기

- 책, [그림으로 정리한 알고리즘과 자료구조], 조민호 지음

- 책, [do it 자료구조와 함께 배우는 알고리즘 입문]

'Computer Science > Algorithm' 카테고리의 다른 글

[정렬] 정렬 문제 풀이 및 속도 비교  (0) 2022.05.11
[정렬] 병합정렬(Merge Sort)  (0) 2022.05.11
[자료구조] 큐(Queue)  (0) 2022.04.28
[자료구조] 스택  (0) 2022.04.18
[검색] 선형탐색과 이진탐색  (0) 2022.04.12

■ 실제로 컴퓨터끼리는 IP주소를 사용해 데이터를 주고받는다

※ 출처 : 따라하면서 배우는 IT

https://www.youtube.com/watch?v=s5kIGnaNFvM&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=6 

 

■ 요약

1. 3계층의 기능

- 3계층에서 하는 일 : 서로 다른 네트워크 대역 곧, LAN과 LAN을 연결시켜준다(LAN+LAN = WAN)

- 3계층에서 쓰는 주소 : IP 주소

- 3계층 프로토콜 : 

더보기

1) ARP

2) IPv4

- 현재 IPv6로 넘어가는 중이다.

3) ICMP

 

 

2. 일반적인 IP 주소 (4byte, 10진수)

  255.255.255.255     *하나의 필드당 0~255까지 사용가능

- Classful

- Classless

* 서브넷 마스크 : 어디까지가 네트워크 구분하는 곳인지

- 사설IP와 공인 IP

* 공인 IP : 인터넷 세상과 통신할 때 사용하는 IP 주소

* 사설 IP : 같은 네트워크 대역에서 사용하는 IP 주소

 

> 부족한 IP주소를 해결하고자 사설IP와 공인 IP를 만들었다.

> 공유기 한 대를 통해 우리집 컴퓨터, 노트북, 휴대폰로 인터넷을 사용

> 실제 인터넷 세상에서는 공인 IP로만 통신, 외부 네트워크 대역에서는 사설 IP 대역이 보이지X

 

 

3. 특수한 IP 주소

- 0.0.0.0    : 나머지 모든 IP

- 127.X.X.X : 나 자신을 나타내는 주소

- 게이트웨이 : 공유기의 IP. 네트워크 대역에서 가장 낮거나 가장 큰 걸 쓴다.

 

 

 실습

- 사설 IP : CMD 에서 ipconfig 하기

- 공유 IP : 네이버에서 내 ip주소 검색하기

■ 가까이 있는 컴퓨터끼리는 이렇게 데이터를 주고받는다

https://www.youtube.com/watch?v=HkiOygWMARs&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=5 

 

 요약

 

1. 2계층에서 하는 일

- 2계층의 기능 : 오류 제어, 흐름 제어

- 2계층의 네트워크 크기

  : 하나의 네트워크 대역 (LAN)에서만 통신할 때 사용

  : 다른 네트워크와 통신할 때는 3계층이 도와주어야 한다.

 

2. 2계층에서 사용하는 주소

- MAC주소 (=물리적인 주소)

 

3. 2계층 프로토콜

- Ethernet 프로토콜

  1) Destination Address : 목적지 MAC주소 6 byte 

  2) Source Address : 보내는 MAC주소 6byte

  3) Ethernet Type : 캡슐화된 상위 프로토콜이 뭔지 미리 알려준다. 2byte

     - IPv4(0x0800), ARP(0x0806)

 

 

 실습

- 내 컴퓨터의 맥 주소는 뭘까?  CMD에서 ipconfig/all 치고 물리적 주소 확인하기

 

■ 네트워크의 기준! 네트워크 모델

https://www.youtube.com/watch?v=y9nlT52SAcg&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi&index=4 

 

■ 요약

1. 네트워크 계층 모델에는 TCP/IP와 OSI 7Layers가 있다.

 

2. OSI 7계층 상세 구조

 

3. 패킷이란

- 데이터의 형식화된 블록

- 여러 프로토콜들로 캡슐화되어 있다.

- 캡슐화 방식 : [헤터 [헤더 [페이로드] (푸터) ] (푸터) ]  *상위 -> 하위 순으로 캡슐화

- 디캡슐화 : 패킷을 하나씩 뜯는 방식 *하위 -> 상위 순으로 디캡슐화

더보기
계층_별로_패킷의_이름이_다르다.

 

▲ 보낼 때 : 프로토콜을 붙일 때, OSI 7 계층 기준으로 상위 -> 하위 순으로 붙인다.

  받을 때 : 하위 -> 상위 순으로 확인

 

 

■ 네트워크란 무엇인가?

※ 출처 : 따라하면서 배우는 IT

https://www.youtube.com/watch?v=Av9UFzl_wis&list=PL0d8NnikouEWcF1jJueLdjRIC4HsUlULi 

 

■ 요약

1. 네트워크란,

- 노드들이 데이터를 공유할 수 있게하는 디지털 전기통신망의 하나이다.

- 분산되어 있는 컴퓨터를 통신망으로 연결한 것

 

2. 인터넷이란,

- 전세계를 연결하는 가장 큰 네트워크

- WWW는 인터넷을 통해 웹과 관련된 데이터를 공유하는 것으로 인터넷과 다른 개념이다.

 

3. 네트워크는 크기/연결형태에 따라 여러 개의 분류로 나누어진다.

1) 크기 : LAN / WAN / MAN / 기타

▶ LAN(Local Area Network) : 근거리 통신망. 가까운 지역을 연결

- ex. PC방에서 친구와 스타크래프트를 LAN UDP로 연결

 WAN(Wide Area Network) : 멀리 떨어진 곳을 연결. 가까운 지역끼리 묶인 LAN과 LAN을 다시 하나로 묶은 것

- ex. 우리집에서 네이버와 연결

2) 연결 형태 : Star형, Mesh형

▶ Start형 : 주로 LAN대역(가까운 곳)에 있는 장치들끼리 연결할 때 사용한다.

* 공유기가 고장나면 나머지 장치들도 연결이 안 된다

▶ Mesh형 : 여러 장비들끼리 서로 그물처럼 연결

* 장치 하나가 고장이 나더라도 다른 장치들 전체에 영향을 미치지 않는다.

▶ 혼합형 : 여러 형태를 혼합한 형태로, 실제 인터넷은 혼합형으로 되어 있다.

 

4. 네트워크의 통신방식

유니캐스트 특정 대상과만 1 : 1로 통신
멀티캐스트 특정 다수와 1 : N으로 통신
브로드캐스트 네트워크에 있는 모든 대상과 통신

 

5. 네트워크 프로토콜

- 프로토콜이란, 일종의 약속 양식을 말한다.

- 네트워크에서 노드와 노드가 통신할 때

    어떤 노드가 어느 노드에게

    어떤 데이터를 어떻게 보내는지

   작성하기 위한 양식

 

5-1. 네트워크 프로토콜 종류

가까운 곳과 연락할 때 이더넷 프로토콜 (MAC 주소) 
멀리 있는 곳과 연락할 때 ICMP, IPv4, ARP (IP 주소)
여러가지 프로그램으로 연락할 때 TCP, UDP (포트 번호)

▶ 실제로 채팅창과 같은 프로그램을 쓸 때는 패킷 곧, 여러 개의 프로토콜을 캡슐화해서 사용한다.

 

+ Recent posts