git과 github의 차이

git - local에서 돌아가는 버전관리 프로그램

github - remote에서 돌아가는 소스코드 버전 저장소

 

 

 

git 설치 과정

1. git 설치

https://git-scm.com/

 

Git

 

git-scm.com

// 설치 후 최소 1회 실행
// 최근 깃허브에서 master -> main으로 명칭변경을 해서 오류가 생기곤 하는데 그걸 방지함
git config --global init.defaultBranch main

 

2. 유저명과 유저 이메일 정하기

git config --global user.name "JINNY PARK"
git config --global user.email "yejin_joa@naver.com"

 

 

 

 

 

git 주요 명령어

사진을 찍는 과정과 비슷한 git의 버전관리 과정

사진찍기 사진사 고용 (최초1회) 사람이 모임 사진을 찍음 사진 확인
GIT git init git add git commit git log

 

C:\Users\jinniePark\gitProject\firstProject> git init   //.git파일 생성

C:\Users\jinniePark\gitProject\firstProject> git status
C:\Users\jinniePark\gitProject\firstProject> git add.   //모든 변경점

C:\Users\jinniePark\gitProject\firstProject> git commit -m "initial commit"

C:\Users\jinniePark\gitProject\firstProject> git log

C:\Users\jinniePark\gitProject\firstProject> git reset --hard (commit code)

 

 

 

 

git reomte에 연동하고 사용하기

https://github.com

 

GitHub: Where the world builds software

GitHub is where over 73 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...

github.com

가입 후 프로젝트 새로 생성

git remote add origin (url)	//해당 프로젝트를 로컬과 연동
git push origin main		//반영하기
git clone (url)			//클론하기
git pull origin main		//서버에서의 변경점 반영하기

 

 

 

 

 

 

 

git flow

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Unknown system variable 'query_cache_size'

-> mysql-connector-java 버전을 8.0.11로 바꿔서 해결

 

엔티티에 대한 참조는 ';' 구분자로 끝나야 합니다.

-> url에 있는 &의 인코딩 문제. &를 &로 바꿔서 해결

/* 문제설명 */

젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다!

젤다의 전설 시리즈의 주인공, 링크는 지금 도둑루피만 가득한 N x N 크기의 동굴의 제일 왼쪽 위에 있다. [0][0]번 칸이기도 하다. 왜 이런 곳에 들어왔냐고 묻는다면 밖에서 사람들이 자꾸 "젤다의 전설에 나오는 녹색 애가 젤다지?"라고 물어봤기 때문이다. 링크가 녹색 옷을 입은 주인공이고 젤다는 그냥 잡혀있는 공주인데, 게임 타이틀에 젤다가 나와있다고 자꾸 사람들이 이렇게 착각하니까 정신병에 걸릴 위기에 놓인 것이다.

하여튼 젤다...아니 링크는 이 동굴의 반대편 출구, 제일 오른쪽 아래 칸인 [N-1][N-1]까지 이동해야 한다. 동굴의 각 칸마다 도둑루피가 있는데, 이 칸을 지나면 해당 도둑루피의 크기만큼 소지금을 잃게 된다. 링크는 잃는 금액을 최소로 하여 동굴 건너편까지 이동해야 하며, 한 번에 상하좌우 인접한 곳으로 1칸씩 이동할 수 있다.

링크가 잃을 수밖에 없는 최소 금액은 얼마일까?

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스의 첫째 줄에는 동굴의 크기를 나타내는 정수 N이 주어진다. (2 ≤ N ≤ 125) N = 0인 입력이 주어지면 전체 입력이 종료된다.

이어서 N개의 줄에 걸쳐 동굴의 각 칸에 있는 도둑루피의 크기가 공백으로 구분되어 차례대로 주어진다. 도둑루피의 크기가 k면 이 칸을 지나면 k루피를 잃는다는 뜻이다. 여기서 주어지는 모든 정수는 0 이상 9 이하인 한 자리 수다.

출력

각 테스트 케이스마다 한 줄에 걸쳐 정답을 형식에 맞춰서 출력한다. 형식은 예제 출력을 참고하시오.

 

 

 

 


 

 

 

/* 풀이방법 */

다익스트라 알고리즘에 PriorityQueue를 합친 방식으로 해결하였다.

시작점을 (0,0)로 설정해주고 연결되어있는 (1,0),(0,1)을 우선순위큐에 추가해주었다.

그 뒤로 큐에서 하나 꺼내고, 4방향을 탐색후, 일단 방문체크를 해준다음에

만약에 최소비용를 갱신한다면 큐에 다시 넣어주는 것을 반복했다.

(n-1,n-1)에 도달한다면 큐를 빠져나오고 print를 하게 된다.

https://jinniepark.tistory.com/66

 

[알고리즘 기본]다익스트라 알고리즘

다익스트라 알고리즘 한 정점으로 부터 모든 정점으로의 최단거리를 구하는 알고리즘이다. 다만 음의 간선이 있다면 사용할 수 없다. 동작 순서는 일단 출발지를 정하고, 이어져 있는 거리를 저

jinniepark.tistory.com

 

 


 

/* 해답코드 */

package baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

//녹색 옷 입은 애가 젤다지?
public class b4485 {
	static int[] dx = {-1,1,0,0};
	static int[] dy = {0,0,-1,1};
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int testCase = 1;
		while(true) {
			
			int N = Integer.parseInt(br.readLine());
			if(N==0)break;
			
			int[][] cave = new int[N][N];
			for(int i=0;i<N;i++) {
				st = new StringTokenizer(br.readLine());
				for(int j=0;j<N;j++) {
					cave[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
			boolean[][] visited = new boolean[N][N];
			int[][] minDist = new int[N][N];
			for(int i=0;i<N;i++) {
				for(int j=0;j<N;j++) {
					minDist[i][j] = 10000;
				}
			}	
			visited[0][0]=true;
			visited[0][1]=true;
			visited[1][0]=true;
			minDist[0][0]=cave[0][0];
			minDist[1][0]=cave[1][0]+cave[0][0];
			minDist[0][1]=cave[0][1]+cave[0][0];
			PriorityQueue<Area> pq = new PriorityQueue<>();
			pq.add(new Area(0,1,minDist[0][1]));
			pq.add(new Area(1,0,minDist[1][0]));

			while(!pq.isEmpty()) {
				Area a = pq.poll();
				
				if(a.r==N-1&&a.c==N-1) {
					System.out.printf("Problem %d: %d\n",testCase++,minDist[N-1][N-1]);
					break;
				}
				
				for(int d=0;d<4;d++) {
					int nx = a.r+dx[d];
					int ny = a.c+dy[d];
					if(nx>=0&&nx<N&&ny>=0&&ny<N&&!visited[nx][ny]) {
						visited[nx][ny]=true;
						if(minDist[nx][ny]>minDist[a.r][a.c]+cave[nx][ny]) {
							minDist[nx][ny]=minDist[a.r][a.c]+cave[nx][ny];
							pq.add(new Area(nx,ny,minDist[nx][ny]));
						}
					}
				}
			}
		}
	}
	public static class Area implements Comparable<Area>{
		int r;
		int c;
		int rupee;
		public Area(int r, int c, int rupee) {
			super();
			this.r = r;
			this.c = c;
			this.rupee = rupee;
		}
		@Override
		public int compareTo(Area o) {
			return Integer.compare(this.rupee, o.rupee);
		}
	}
}

'Coding Test > Baekjoon' 카테고리의 다른 글

[백준][11404]플로이드  (0) 2021.09.26
[백준][1922]네트워크 연결  (0) 2021.09.17
[백준][12865]평범한 베낭  (0) 2021.09.07
[백준][16236]아기상어  (0) 2021.08.25
[백준][1197]최소 스패닝 트리  (0) 2021.08.24

다익스트라 알고리즘

한 정점으로 부터 모든 정점으로의 최단거리를 구하는 알고리즘이다. 

다만 음의 간선이 있다면 사용할 수 없다. 

 

동작 순서는 일단 출발지를 정하고, 이어져 있는 거리를 저장한다.

그 다음 부터는 가장 짧은 거리에 있는 정점을 방문하고, 해당 정점을 거쳐가는 거리가 더 짧다면 갱신, 아니면 그대로 둔다.

이런식으로 반복해서 모든 정점을 방문하면 끝나게 된다.

 


그래프와 인접그래프

 

 

 

 

 

다익스트라 알고리즘 시작!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

추가적으로,, 최적화에 대해 생각해본다면, 가장 짧은 거리를 탐색할 때, 우선순위 큐를 활용한다면 O(nlogN)으로 탐색이 가능하다. 

 


관련문제

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

 

4485번: 녹색 옷 입은 애가 젤다지?

젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주

www.acmicpc.net

https://jinniepark.tistory.com/67

 

[백준][4485]녹색 옷 입은 애가 젤다지?

/* 문제설명 */ 젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설

jinniepark.tistory.com

 

#오류에 대해 지적해 주시면 수정하겠습니다.

 

MAC address

MAC address는 OSI 7 계층 중 데이터 링크 계층에서 사용하는 물리적인 주소이다.

 

 

 

 

 

 

OSI 7 계층은 각각의 층들이 나름대로의 단위로 인코딩, 디코딩을 하는데, 데이터 링크 계층은 프레임 단위로 송수신 한다.  프레임 단위로 만들기 위해선 데이터 앞뒤에 특정한 비트열을 붙이게 되는데 이때 앞에 붙는 비트열을 헤더, 뒤에 붙는 비트열을 트레일러라 한다. 헤더는 목적지를 명확하게 하는 역할을 하고, 트레일러는 호옥시 놓친 비트가 있지는 않은지 검사한다.

 

이때 헤더를 좀더 자세히 보면 DA(destination address), SA(Source address)라는 정보가 들어있음을 알 수 있다.

이 주소가 바로 Mac 주소이다.

 

 

 

 

Mac 주소는 총 6옥텟으로 구성되어있다. 옥텟이란, 8bit, 1byte를 의미한다. 초기의 컴퓨터들은 1바이트가 꼭 8bit를 의미하지 않았기 때문에 옥텟이라는 단위가 생겼다고 한다! 하지만 지금은 그냥 8bit다 라고 생각하면 된다고 한다.

앞에 3옥텟은 만든 회사를 의미, 뒤에 3옥텟은 네트워크 장비의 일련번호를 의미한다고 한다. 이 주소는 고유하기 때문에 각각의 네트워크 장비를 구별할 수 있다.

마치 명품을 사면 받는 시리얼 번호같다고 느껴졌다. 

 

 

 

 

 

 

 


 

 

IP Address

IP address는 OSI 7 계층 중 네트워크 계층에서 사용하는 주소이다.

 

 

 

 

위에서 말한 것처럼, OSI 7 계층은 각각의 층들이 나름대로의 단위로 인코딩, 디코딩을 하는데, 네트워크 계층은 패킷 단위로 송수신 한다.  이때 패킷단위로 만들어주는 IP(internet protocol)의 헤더를 보면 아래와 같다.

 

 

 

 

음.. 일단 확실한건, 여기에도 특정 네트워크를 찾아가기 위한 주소가 포함된다는 것이다!

이때 사용되는게 IP주소 이다.

 

IP주소는 4옥텟으로 이루어져있다. (여기서는 IPv4로 생각했다.)

IP주소는 Public IP와 Private IP로 나뉘는데, Public IP는 세계에서 유일한 공인된 주소고, Private IP는 회사 처럼 어떠한 내부망(네트워크) 안에서 사용되는 주소로 그 네트워크 안에서 유일하다. 

유일하다는 점은 MAC주소와 동일하지만, MAC주소는 시리얼번호같은거라 한번 부여되면 절때 바뀌지 않지만, IP주소는 바뀔 수 있다는 점이 다르다.

 

 

 

 

 

 


 

 

왜 둘 다 있어야 하나?

그럼 약간의 의문이 든다. 사실 IP주소나 Mac주소나 결국은 다른 컴퓨터와 통신을 하기 위해 사용되는 주소라는 것이다.

게다가 둘다 고유하다. 그러면 Mac주소만 있어도 목적지 컴퓨터를 찾아갈 수 있고, IP주소만 있어도 목적지 컴퓨터를 찾아갈 수 있다는게 아닐까?

 

이에 대한 나의 결론은.. 둘이 다른 계층에서 쓰이기 때문에 둘 다 필요하다는 것이다.

마치 우리는 개개인을 주민등록번호로 구분할 수 있으나, 학교에서는 학번을 쓰고, 회사에서는 사번을 따로 부여받지 않는가? 

애초에 OSI 7계층이 각 네트워크 장비들의 역할을 분명히하고, 독립적으로 나누는데 의의가 있었으므로 그 주소 체계 또한 분리되어있는게 아닌가,,, 라는 결론을 내렸다.

 

결론적으로, 통신을 하는데 송신지의 IP주소와 MAC주소, 목적지의  IP주소와 MAC주소가 꼭 필요하다.

 

 

 

여기서 드는 의문점!

 

우리는 매일같이 여러 사이트에 방문한다. 일단 송신지의 IP주소와 MAC주소는 안다. 내 컴퓨터니까.

목적지의 IP주소도 안다. DNS를 거쳐 문자열이 되었지만, IP주소나 다름없으니까.

그럼 MAC주소는 어떻게 알지..?

 

이렇게 IP주소만으로 MAC주소를 알아내는 프로토콜이 ARP(Address Resolution Protocol)이다.

그냥 추가적으로 넣어봤다.

'Network' 카테고리의 다른 글

[Network스터디]TCP와 UDP  (0) 2021.09.19
[Network스터디]OSI 7 Layers  (0) 2021.09.18

/* 문제설명 */

n(2 ≤ n ≤ 100)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1 ≤ m ≤ 100,000)개의 버스가 있다. 각 버스는 한 번 사용할 때 필요한 비용이 있다.

모든 도시의 쌍 (A, B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 버스의 정보는 버스의 시작 도시 a, 도착 도시 b, 한 번 타는데 필요한 비용 c로 이루어져 있다. 시작 도시와 도착 도시가 같은 경우는 없다. 비용은 100,000보다 작거나 같은 자연수이다.

시작 도시와 도착 도시를 연결하는 노선은 하나가 아닐 수 있다.

출력

n개의 줄을 출력해야 한다. i번째 줄에 출력하는 j번째 숫자는 도시 i에서 j로 가는데 필요한 최소 비용이다. 만약, i에서 j로 갈 수 없는 경우에는 그 자리에 0을 출력한다.

 

 

 

 


 

 

 

/* 풀이방법 */

이름처럼 플로이드 알고리즘으로 풀면 된다.

https://jinniepark.tistory.com/59?category=956229

 

[알고리즘 기본]플로이드 와샬 알고리즘

플로이드-와샬 알고리즘(이하 플로이드 알고리즘)은 최단 경로를 구하는 알고리즘이다. 이미 잘 알고있는 다익스트라 알고리즘은 한 점점으로 부터 다른 모든 정점으로의 최단 거리를 구할 수

jinniepark.tistory.com

다만, 문제를 똑바로 안읽어서 방문할 수 없는 노드를 0으로 고쳐야하는데 무한대로 놨다가 애를 먹었다.

문제를 제발 똑바로 읽자.

 

 


 

/* 해답코드 */

package baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

//플로이드
public class b11404 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int N = Integer.parseInt(br.readLine()); // 도시(정점)
		int M = Integer.parseInt(br.readLine()); // 버스(간선)
		int[][] map = new int[N + 1][N + 1];
		for (int i = 0; i <= N; i++) {
			for (int j = 0; j <= N; j++) {
				map[i][j] = -1;
			}
		}
		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken()); // 출발
			int b = Integer.parseInt(st.nextToken()); // 도착
			int c = Integer.parseInt(st.nextToken()); // 비용
			if(map[a][b]==-1) {
				map[a][b] = c;
			}else {
				map[a][b] = Math.min(map[a][b], c);
			}
			
		}	
		
        //플로이드 알고리즘
		for (int n = 1; n <= N; n++) {
			for (int i = 1; i <= N; i++) {
				for (int j = 1; j <= N; j++) {
					if(map[i][n]==-1||map[n][j]==-1) {
						continue;
					}
					if(map[i][j]==-1||map[i][j]>map[i][n]+map[n][j]) {
						map[i][j]=map[i][n]+map[n][j];
					}
				}
			}
		}
		
        //출력
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				if(map[i][j]==-1||i==j)
					map[i][j] = 0;
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}
		
	}
}

#오류에 대해 지적해 주시면 수정하겠습니다.

 

람다 표현식 (Lambda Expression)이란?

람다식은, 쉽게 말해 메서드를 하나의 식으로 표현한 것을 의미한다. 메서드를 람다식으로 표현하면, 메서드의 이름과 반환값이 없어지므로 람다식을 익명 함수라고도 한다. , 익명 함수의 일종이다.

 

 

 

람다 표현식은 왜 나왔을까?

Runnable Interface는 함수형 인터페이스!

 

 

위에 있는 Runnable interface처럼 메서드를 하나만 가진 인터페이스를 함수형 인터페이스라고 한다.

이전에는 Thread class를 생성하기 위해 Runnable interface안에있는 run 메서드가 필요한데, 자바는 메서드만 매개변수로 전달할 방법이 없으므로, 해당 메서드를 가지고 있는 Runnable 객체를 생성해서 전달해야한다. 즉, 자바는 매번 객체를 생성해서 매개변수로 전달 해야한다. 

메서드만 전달 할 수 있다면 좀더 편하게 프로그래밍 할 수 있지 않을까? 해서 등장한게 람다다.

 

 

 

 

 

JVM은 Thread의 생성자를 보고, 이게 무엇인지 대상을 추론한다고 한다!

 

 

생성자 매개변수로 뭔가 메서드가 하나 들어왔는데, Thread의 생성자를 보아하니 이건 Runnable이겠군!

Thread 생성자 API 보면, Runnable 인터페이스를 받아들이는 것을 알고있는 JVM람다식을 Runnable을 구현하는 객체로 자동으로 만들어서 매개변수를 넣어준다.

 

 

 

함수형 인터페이스

// @FunctionalInterface

함수를 1급 객체처럼 다룰 수 있게 해주는 어노테이션으로, 인터페이스에 선언하여 단 하나의 추상 메서드만 갖도록 제한하는 역할을 한다.

왼쪽은 메서드가 두개니까 오류가 난다

# 1급 객체 : 변수나 데이터에 할당할 수 있으며, 객체의 인자로 넘길수 있어야하고, 객체의 리턴값으로 리턴할 수 있는 객체

 

 

Java에서 제공하는 함수형 인터페이스

  • Supplier<T>
  • Consumer<T>
  • Function<T>
  • Predicate<T>

 

 


 

 

람다식이 없었을 땐?

1. 인터페이스를 구현한 클래스의 객체 생성

기존 자바에서 다형성을 제공하기 위해 인터페이스를 만들고, 그것을 구현한 클래스를 작성한 뒤,

사용시에는 인터페이스 타입의 참조변수에 인터페이스를 구현한 클래스 객체를 생성해서 사용했다.

인터페이스 구현한 클래스 객체 생성

 

 

 

2. 익명 객체

위와 같이 따로 클래스를 만들지 않고, 바로 코드 내에서 익명 객체를 만들어서 사용하기도 했다. 하지만 익명 객체는 재활용이 불가능하므로 Good를 구현한 객체가 자주 사용되어야 한다면, 아래와 같은 코드를 반복해서 사용하게 되고, 그러면 코드가 지저분해진다.

익명객체

 

 

 

람다식으로 바꿔보자!

람다

 

람다 표현식 정리!

1.컴파일러는 람다식을 해석해, 자동으로 익명구현객체로 만든다.

2.이 때, 익명구현객체의 기반이 되는 인터페이스의 타입을 타겟 타입이라고 한다.

3.타겟 타입이 될 인터페이스는 2개 이상의 추상 메서드를 가지면 안된다.

그 이유는, 2개 이상의 추상 메서드를 가질 경우, 컴파일러가 해당 람다식이 타겟 타입의 어떤 메서드를 구현한 것인지 알 수 없기 때문이다.

 

 

 


 

 

람다식 표현법

1.매개변수 타입을 추론할 수 있는 경우, 타입을 생략할 수 있다.

2.매개변수가 하나인 경우에는 괄호() 생략할 수 있다. (타입이 없을 때만 가능)

3.함수의 몸체가 하나의 명령문만으로 이루어진 경우, 중괄호{} 생략할 수 있다.
  (
이 때, 세미콜론은 붙이지 않는다.)

4.함수의 몸체가 하나의 return 문으로만 이루어진 경우, 중괄호를 생략할 수 없다.

5.return문 대신 표현식을 사용할 수 있으며, 이 때 반환값은 표현식의 결과값이 된다.
  (
이 때, 세미콜론은 붙이지 않는다.)

 

 

플로이드-와샬 알고리즘(이하 플로이드 알고리즘)은 최단 경로를 구하는 알고리즘이다.

이미 잘 알고있는 다익스트라 알고리즘은 한 점점으로 부터 다른 모든 정점으로의 최단 거리를 구할 수 있다.

하지만 플로이드 알고리즘은 모든 정점으로부터 모든 정점으로의 최단 거리를 구하는 알고리즘이다.

 

기본적으로 그래프를 일단 나타내고, 순차적으로 어떠한 정점을 거쳤을 때, 이동하는 비용이 줄어든다면 값을 고치는것을 반복하는 알고리즘이다. 

중요한건 (A에서 B로 가는 거리) > (A에서C를 들렀다가 B로 가는거리)이면 작은 값으로 계속 갱신만 해주면 되는거다.

말로하려니까 어렵다. 아래에 그림을 참고해라.


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

관련 문제

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

 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net

https://jinniepark.tistory.com/64

 

[백준][11404]플로이드

/* 문제설명 */ n(2 ≤ n ≤ 100)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1 ≤ m ≤ 100,000)개의 버스가 있다. 각 버스는 한 번 사용할 때 필요한 비용이 있다. 모든 도

jinniepark.tistory.com

 

#오류에 대해 지적해 주시면 수정하겠습니다.

 

4계층 : Transport Layer

TCP와 UDP는 OSI 7계층 중 4계층인 전송계층에 속하는 프로토콜이다. 

https://jinniepark.tistory.com/57

 

[Network스터디]OSI 7 Layers

#오류에 대해 지적해 주시면 수정하겠습니다. OSI 7 Layers은 왜 필요해? 아마 컴퓨터공학을 전공했다면, 한번쯤을 들어봤을 OSI 7계층,, 이거는 왜 존재해서 날 힘들게 하는 걸까? 자 예를들어 차가

jinniepark.tistory.com

OSI 7계층은 해당 글에서 자세히 다루었으나 4계층에 대해서 간단하게 알아보자면, 어떤 프로세스로 전달 될지를 결정하는 계층이다. 프로세스는 포트번호로 구별할 수 있다.

 

 


 

 

TCP의 등장배경

일단 TCP를 먼저 살펴보도록 하겠다. 일단 TCP는 어째서 등장하게 되었을까?

1970년대 냉전 당시 네트워크는 회선교환방식이라는걸 썼는데, 말그대로 회선을 교환하는 방식이었다.

만약에 A가 C랑 통신하다가 B랑 통신하고 싶다면, C와 연결되어있던 회선(케이블)을 빼서 B랑 연결해주면 되는거였다.

이러한 방식은 회선의 효율이 낮을 뿐더러 저 케이블에 문제가 생긴다면, 네트워크가 끊기는 거였다.

전쟁중이었던 그당시 상황을 생각해보면 이러한 문제점은 상당히 큰 위험사항이었다고 한다.

그래서 관심을 가지게 된게 핵이 터져도 끊기지 않는 연결이었고 이후 고안한 방식이 패킷 교환 방식이다.

 

패킷 교환 방식은 데이터를 잘게 쪼개서 여러 회선으로 보내는거다. 그러면 이렇게 하나쯤 문제가 생겨도, 데이터가 좀 유실 될 수 있겠지만 네트워크 전체가 마비된다던가 그런일은 없다. 이 아이디어를 실현하는 프로토콜이 바로 TCP.

저기 회선하나 문제가 생겨도 A와 B는 통신할 수 있다.

 

 


 

 

TCP

위와 같은 이유로 tcp는 segment단위로 쪼개서 보낸다. 그리고 세그먼트마다 앞에 헤더가 붙게 된다. 

한 프로토콜에 대해 자세히 알고 싶다면 헤더를 살펴보는 것이 가장 효과적인 방법인것 같다. 그러므로 헤더의 구성요소에 대해 자세히 봐보도록 하자.

 

 

 

TCP의 헤더

Source Port : 보내는 프로세스의 포트번호

Destination Port : 받는 프로세스의 포트번호 

Sequence number : 다음에 이어지는 세그먼트 (패킷을 쪼개서 보내니까 이런부분이 필요한가보다)

Acknowledgment Number : 다음에 받기를 기대하는 세그먼트

HeaderLength : options의 길이가 가변적이기 때문에 어느부분이 헤더고 어느부분이 데이터인지 구별하기 위해 헤더 길이 정보를 가진다.

ACK/SYN/FIN : 커넥션을 만들때/종료할 때 사용하는 비트 (이건 handshake때 자세히 나온다)

Window Size : 감당가능한 패킷의 양   

더보기

#TCP교통체증과 서비스 붕괴사건

1986년에 있었던 일로 그 당시 최첨단 회선이 효율이 10분의 1밖에 안난 사건이라고 한다. 그 당시 라우터가 문제였는데, 라우터가 과부하가 걸려서 엄청나게 많은 패킷을 놓치고 있던 것이었다. 근데 패킷을 놓치면 tcp는 상당히 타격이 크다. 첨부터 다시보내야하니깐.(이건 TCP의 통신방식을 좀 알아야한다.) 그것은 더더욱 과부하를 만들고 악순환의 반복이다. 이때 등장한 사람이 Van Jacobson라는 사람이다. 이분이 제안한 방법이.. 패킷을 마구 보내지말고 일단 1개씩 보내면서 서로 처리 가능한 패킷 개수를 조절하는 것이다. 이거는 마치 창문을 열고 닫으면서 조절하니까 window size라고 한다. 이 정보로 서로 감당 가능한 패킷의 양을 조절하는 것이다. 뭐쨋든 이런식으로 패킷 양을 조절한다는 점.

Checksum : 오류를 감지하는 부분

 

 

 

UDP의 등장배경

TCP는 안정적이긴 하지만 너무 느리고, 용량도 컷다. 어떤 서비스는 안정적인것보다 속도가 더 중요하다.

그래서 등장한게 UDP. 사실 UDP프로토콜이라기보단 그냥 IP에다가 포트번호만 붙인 수준이라고 한다.

 

UDP

 

 

 


 

 

 

UDP의 헤더

Source Port : 보내는 프로세스의 포트번호

Destination Port : 받는 프로세스의 포트번호 

Length : 데이터의 길이

Checksum : 오류를 감지하는 부분

 

 

 

 


 

TCP와 UDP의 비교

TCP는 확실하고 신뢰있는 통신을 하지만 용량이 많고 느리다.

UDP는 신뢰성은 없어도 용량이 적고 빠르다.

 


Resources

https://www.youtube.com/watch?v=

https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9CikDVGYp5dhg

https://brunch.co.kr/@swimjiy/35

https://evan-moon.github.io/2019/11/10/header-of-tcp/

'Network' 카테고리의 다른 글

[Network스터디]IP address/MAC address(+깨알ARP)  (0) 2021.09.26
[Network스터디]OSI 7 Layers  (0) 2021.09.18

#오류에 대해 지적해 주시면 수정하겠습니다.

 

OSI 7 Layers은 왜 필요해?

아마 컴퓨터공학을 전공했다면, 한번쯤을 들어봤을 OSI 7계층,,

이거는 왜 존재해서 날 힘들게 하는 걸까?

 

자 예를들어 차가 고장났다고 생각해보자. 그러면 어디가 고장났는지 찾아볼 것이다.

봤더니만 타이어가 펑크가 난거였다. 그러면 타이어만 교체해 준다면 차가 다시 작동할 것이다.

이런일이 가능한 이유는 이미 각각 부품이 하는일이 명확하게 정해져 있기 때문이다.

하지만 해당 부품이 다른 기능에 관여한다면 어떨까? 예를 들어 어떤 타이어는 엔진에도 관여하는 것이다!

그럼 그 다른 부품까지 전부 갈아야 하는거다. 뿐만 아니라 고치는 사람 입장에서도 굉장히 힘든 일이 될꺼다. 어떤 회사의 어떤 부품은 어디까지 관여하고 또 관여 안하는지 모두 알아야 하니까!

https://jhnyang.tistory.com/194

 

이는 네트워크의 세계에서도 마찬가지다.

인터넷이 안된다고 하자. 만약 어떤 장비가 어떤 부분에 관여할지 정해져있지 않다면 우리는 정말 모든 회선과 부품을 바꿔야 할 수 도있다. 초기 네트워크 장치는 실제로 중구난방이었다. 회사 장비마다 호환되지않고 맡은 역할이 제각각이었다. 이러한 문제를 개선하기위해 국제표준화기구(ISO)1984년에 OSI 7계층을 발표한 것이다!

 

 

 


 

 

OSI 7 계층

모든 계층은 독립적이며, 하위 계층의 기능은 이용하고, 상위 계층에게는 기능을 제공한다.

모든 계층에는 기본적으로 인코더와 디코더가 있다. 이제 1계층 부터 살펴보자.

 

 


 

 

1계층 :  Physical Layer

아래와 같이 두 컴퓨터가 통신을 하고 싶다. 

 

이게 근데 디지털 신호는 바로 전선으로 전달될 수 없다. 그래서 데이터를 아날로그 신호(전기신호)로 바꿔서 전송한다. 그리고 전선이 감당할 수 있는 만큼 적당한 단위로 끊는일도 필요하다. 이러한 일들을 하는 것이 1계층의 인코더, 디코더라고 한다.

다음과 같이 데이터가 1계층 인코더를 거쳐 아날로그 신호가 되어 전선을 타고 목적지에 도착한다.

그럼 목적지에 있는 1계층 디코더가 아날로그 신호를 원래 데이터로 바꿔준다. 해당 과정은 모두 하드웨어적으로 구현되어있다고 한다!

 

 

 

 

2계층 : Data Link Layer

이번에는 좀 더 많은 컴퓨터들이 통신을 하고 싶다!

아래에 체크 표시된 컴퓨터끼리 통신이 하고싶다.

 

 

 

이제는 목적지 주소가 어딘지 명확하게 할 필요가 있어졌다. 데이터의 앞뒤에 특정한 비트열을 붙여서 목적지도 명확하게 하고 호옥시 놓친 비트가 있지는 않은지 검사한다. 이때 사용하는 주소가 MAC주소다. 또한 앞에 붙은 비트열을 Header, 뒤에 붙은 비트열을 trailer라 한다.

그러한 형태로 만드는게 2계층 인코더가 해야할 일이다! 또한 그러한 형태(단위)를 Frame이라 한다.

 

 

 

통신하는 과정을 보자면, 출발지에서 데이터를 2계층 인코더가 Frame단위로 인코딩한다. 그 인코딩 된것을 1계층 인코더가 아날로그 신호로 변경해서 목적지로 이동한다.

그럼 목적지에 있는 1계층 디코더가 아날로그 신호를 디지털 신호로 변경하고, 2계층 인코더가 Framing되어있는 데이터를 디코딩한다.

 

 

 

 

 

3계층 : Network Layer

이번에는 아까보다 좀 더 많은/더 멀리있는 컴퓨터와 통신을 하고 싶다!

아래에 체크 표시된 컴퓨터끼리 통신이 하고싶다.

 

역시 해당 컴퓨터를 찾아가기 위해서는 주소가 필요하다. 이때 주소를 IP주소라 부른다. 2계층에서 MAC주소를 아는데, IP주소를 따로 알아야할까? 이에 대해서는 IP주소와 MAC주소에 관한글에서 더 자세히 다루겠다.

어쨌든, IP주소가 필요하다. 

3계층의 인코더는 데이터에 IP주소를 붙여준다. (IP주소만 있는건 아니다)

이러한 단위를 Packet이라 한다.

 

위에 그림과 같이, 출발지에서 데이터를 우선 3계층 인코더가 packet단위로 만들어주고, 2계층 인코더가 앞뒤로 비트열을 붙여 framing해주고 1계층에서 아날로그 신호로 변경해 목적지로 보낸다.

마찬가지로 목적지에서는 1계층 디코더가 제일먼저 아날로그 신호를 디지털신호로 변경해주고, 2계층 디코더가 frame의 헤더와 트레일러를 분리하고, 3계층 디코더가 데이터만 남기고 디코딩해준다.

3계층은 1.2계층과 달리 운영체제의 커널에 소프트웨어로 구현되어있다.

 

 

 

 

4계층 : Transport Layer

3계층까지로 목적지까지 도착하는건 가능해졌다. 하지만 목적지 컴퓨터의 어느 프로세스에게 줘야할지는 알 수가 없다. 

목적지 컴퓨터에 디스코드와 카카오톡이 있다고 할 때 우리는 데이터를 카카오톡에게 줘야한다고 해보자.

 

 

 

 

프로세스끼리도 각각을 식별할 수 있는 번호가 있는데 그 번호를 포트번호라 한다.

그럼 목적지에 원하는 프로세스에게 데이터를 전송하기 위해서 포트번호가 필요하다는 것을 납득할 수 있다.

4계층 인코더는 포트번호를 붙여 segment/datagram단위로 인코딩한다. 각각 계층마다 해당 역할을 하는 프로토콜이 여러가지가 있는데, 4계층에는 대표적으로 TCP라는 프로토콜과 UDP라는 프로토콜이 있다. TCP에서는 인코딩 단위를 segment라 하고, UDP에서는 Datagram이라 한다. 어쨌든 둘다 포트번호는 포함한다.

4계층까지 포함한 통신과정을 보자면 아래와 같다.

목적지에 있는 데이터를 4계층 인코더가 인코딩 하고 이하 3계층과 같다.

목적지에 도착해서도 1계층->2계층->3계층->4계층 순서로 디코딩 과정이 진행된다.

 

 

5,6,7계층

사실 5,6,7계층은 명확하게 이해가 되지 않았다.

통신 관점으로 설명을 하였는데, 현재 사용하는건 TCP/IP모델이라 그런걸까 각 계층에 대한 명확한 설명은 찾지 못했다.

짧게 설명하자면 다음과 같다.

 

5계층 : Session layer전송단위는 message이며, 실제 이용자의 응용프로그램 사이에서 세션이라 불리는 연결을 확립하고 유지하며 동기화하는 기능을 수행한다.

 

6계층 : Presentation layer전송단위는 message이며, 송,수신자 둘 다 데이터를 이해할 수 있도록 데이터의 표현방식을 바꾼다.

 

7계층 : Application layer

전송단위는 message이며, 최 상위 계층으로 사용자가 네트워크에 접속하는 것을 가능하게 한다. 그리고 사용자의 인터페이스를 제공한다.

 

명확하게 이해가 되는 그날까지,,,,

 


 

마무리

OSI 7계층은 컴퓨터 네트워크 프로토콜 디자인과 통신을 계층으로 나누어 설명한 것이며 다음과 같이 계층구조를 가지고 있고 각 계층은 다른 계층으로부터 독립적이다.

캡슐화 되는 방향은 7->1방향이며, 반캡슐화는 1->7방향으로 이루어진다.

 

 

 

 

 


References

https://www.youtube.com/watch?v=dK5cRUCTDqE

https://www.youtube.com/watch?v=1pfTxp25MA8

https://jhnyang.tistory.com/373

https://jhnyang.tistory.com/403?category=947031

https://jhnyang.tistory.com/194

https://hahahoho5915.tistory.com/12

'Network' 카테고리의 다른 글

[Network스터디]IP address/MAC address(+깨알ARP)  (0) 2021.09.26
[Network스터디]TCP와 UDP  (0) 2021.09.19

+ Recent posts