1. JVM의 메모리 관리

Java 프로그램을 실행하게되면 운영체제로부터 JVM(Java Vitrual Machine)은 메모리를 할당받고 이를 몇가지 영역으로 세분화하여 관리하게됩니다.

 

JVM은 메모리를 메소드 영역(Method Area), 힙 영역(Heap Area), 스레드 단위(Thread)로 구분하여 관리하게됩니다.

 

각가의 영역에서 어떤 데이터들을 관리하는지 알아보겠습니다.

 

 

2. 메소드 영역(Method Area)

메소드 영역에서는 '.class 파일'들을 읽어들여 각각의 클래스별로 런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드 등을 저장하게됩니다.

 

일반적으로 static으로 선언된 값들 역시 이 과정에서 메소드 영역에 저장되게됩니다.

 

이곳에 생성된 데이터는 JVM이 실행되는 순간에 자동으로 생성됩니다. 프로그래밍 과정에서 아직 수행되지 않은 static 영역의 데이터에 접근할 수 있는 이유도 static으로 선언된 값이 JVM이 실행되는 순간에 메모리에 올라가기 때문입니다.

 

여기에 저장된 값들은 모든 쓰레드가 공유하는 값이라는 것을 유의해야합니다.

 

 

 

3. 힙 영역(Heap Area)

힙 영역은 객체(Object)와 배열(Array)이 사용하는 공간이라고 볼 수 있습니다.

 

객체와 배열의 공통점은 이 두가지를 '참조'를 통해 호출한다는 것에 있습니다. C에서 주소값을 통해 배열에 접근하는 방식과 유사하다고 볼 수 있습니다.

 

Java에서 빠질 수 없는 녀석인 gc(Garbage Collector)가 바로 이 힙 영역에 존재하는 객체와 배열들을 정리하는 역할을 수행합니다.

 

어떠한 곳에서도 참조하는 변수나 필드가 없다면 이것을 쓰레기라고 판단하고 gc가 힙 영역에서 이 객체들을 제거하는 역할을 수행하게됩니다.

 

gc의 존재 덕분에 프로그래머가 객체를 제거하기 위한 코드를 작성할 필요가 없습니다. 다만, gc의 경우 항상 실행되고 있는 것이 아니라 필요에 따라 JVM에의해 실행되기 때문에 필요로 하지 않는 객체가 당분간 힙 영역에 존재하는 경우가 있을 수 있습니다.

 

만약 참조하지 않는 객체를 즉시 gc에 의해 정리하고 싶다면, System.gc();를 통해 gc를 실행시킬 수 있습니다.

 

 

 

4. 스레드(Therad)

JVM은 한 프로그램의 작업단위를 의미하는 스레드(쓰레드) 별로 데이터를 나눠 관리합니다.

 

이는 하나의 스레드에서 관리하는 데이터에 다른 스레드가 접근하지 못하는 일이 없도록 데이터의 관리단위를 나눠주기 위함이라고 생각합니다.

 

하나의 스레드 영역에는 JVM 스택(JVM Stack)이라는 영역이 존재합니다.

 

일반적인 데이터 관리형태와 마찬가지로 Stack 구조를 이용하여 스레드에서 사용하는 변수(지역변수 + 참조타입변수)들을 관리하게됩니다.

 

 

1. Project 시작하기

이클립스를 시작하고, workspace를 선택해주시면 welcome 화면이 표시되고 이걸 꺼주시면 아래와 같은 화면을 볼 수 있습니다.

 

 

먼저 좌측에 Project Explorer라는 부분을 볼 수 있는데요.

 

기본적으로 하나의 프로그램은 Project 단위로 관리된다고 생각하시면 좋습니다. 하나의 Project 영역을 생성하고, 여기에 기본적인 코드부터 GUI를 위한 xml, 이미지 파일등 올려두고 관리합니다.

 

그럼 먼저 Project를 생성하겠습니다.

 



 

 

 

 

우측 Project Explorer 부분을 보게되면 다양한 용도를 위한 Project들이 존재하는 것을 볼 수 있습니다.

 

저희는 [Java Project]를 사용할 예정이기 때문에 [Create a project...] 라는 녀석을 눌러주세요.

 

그럼 아래와같이 New Project 라는 창이 등장합니다.

 

 

 

 

 

 

 

 

 

 

 

 

여기서 [Java Project]를 클릭해주세요. 그럼 아래와 같은 창이 등장합니다.

 

 

 

Project name에 원하는 값을 입력해보세요. 그럼 하단에 [Next]와 [Finish]가 활성화 됩니다.

 

[Next]를 눌러 다음으로 넘어가주시면, 몇가지 추가 설정이 있는데 여기서 모듈생성에 대한 부분을 아래와 같이 해제하신 후 [Finish]를 눌러주세요.

 

 

그럼 아래와 같은 창이 보입니다.

 

 

이렇게 Project를 생성했습니다. 다음으로 package를 만들겠습니다.

 

 

 

2. Package 생성

 

여기서 잘보시면 [Project Explorer] 라고 되어있던 부분이 [Package Explorer]라고 변경된 것을 볼 수 있습니다.

 

펼쳐보면 아래와 같은 상태가 됩니다.

 

 

 

Package는 여러 코드들을 용도에 따라 구분해 정리하기 위한 폴더단위라고 생각하시면 좋을꺼같습니다.

 

Package를 'src'이하에 생성해 보겠는데요. Package 이름은 '소문자'를 사용하는게 약속입니다.

 

1) src 우클릭 -> New -> Package 클릭

2) package 이름 입력(소문자쓰기) -> 생성

src 이하에 패키지 생성완료

 

 

 

 

3. Java Class 생성

Java는 Class 기반 언어라고 불립니다. 그렇기에 모든 코드는 Class라는 단위에서 작성되고 실행됩니다.

 

그렇기 때문에 흔히 C언어에서 'Main'이라고 부르는 부분 역시도 Java에서는 Class로 정의됩니다.

 

Class 생성을 해보겠습니다.

Class의 이름은 '대문자'로 사용하는게 약속입니다~!

 

1) 패키지 우클릭 -> New -> Class

 

 

2) Class 이름 입력(클래스는 대문자) -> [public static void main(String[] args] 선택 -> Finish

public static void main(String[] args) create 는 해당 클래스에 main 영역을 생성한다는 의미로 생각하시면 됩니다.

 

 

3) 패키지 아래 HelloWorld.java 클래스 생성 완료

 

 

4. Hello World 출력하기

 Java에서 print는 왜 이렇게 길까... 라고 종종생각합니다.

 

아래 코드를 봐주세요.

 

실행화면

겨우 Hello World를 출력하는데도 앞에 System.out 이라는 녀석들이 붙습니다.

 

printf, print 등에 익숙했던 입장에서는 불편하게 보일 수 있습니다.

 

하지만, 나중에보면 이게 꽤 직관적이여서, 구문을 이해하는데 유용할 때도 있습니다.

 

 

 

 

Java라는 녀석도 코딩을 한 후 '컴파일'이라는 과정을 수행해야 실행할 수 있는 상태가됩니다.

 

이클립스에서는 여기에 대해 편리하는 기능을 제공하는데요.

 

바로 사용자가 코드를 [저장]하면 자동으로 컴파일을 수행하게됩니다.

 

때문에 코드를 작성하고 [저장] -> [실행]을 수행하면 별도로 컴파일을 수행하는 부분없이 코드가 실행됩니다.

 

만약 수정된 코드를 저장하지 않고 실행하면 아래와 같은 창이 뜨게 됩니다.

 

 

[ Save == 컴파일 ] 이라는 관점에서 보면, 이 창은

 

"컴파일을 수행하고 실행할까요?"

 

라는 의미를 갖습니다.

 

 

단, 혹시라도 실수로 Project에 Build Automatically를 해제한 상태라면, 위와같은 자동 컴파일이 수행되지 않습니다.

 

 

 

 

이클립스를 통해 프로그래밍의 시작인 "Hello World"를 출력해보았습니다.

 

이제 시작입니다~!

 

 

 

'프로그래밍 > Java 기초' 카테고리의 다른 글

[Java 기초] 2. Project 시작하기  (0) 2019.12.25
[Java 기초] 1. Java 설치  (0) 2019.12.24

0. 시작하기 전에

프로그래밍 전반에 대한 기본적인 지식('프로그래밍이 무엇인지, 컴파일과 컴파일러가 무엇인지' 와 같은)에 대한 개념은 따로 다루지 않습니다.

개발환경은 이클립스 프로그램을 사용하며, Github를 이용하여 코드를 공유하도록 하겠습니다.

GUI 부분은 Swing과 JavaFX를 이용할 예정입니다.

Java SE는 현재 최신버전인 Java 13.0.1을 사용합니다.

 

 

1. Java 설치

Java를 통해 개발을 하기 위해서는 JDK(Java Development Kit)을 설치해야합니다.

 

더보기

1) (MAC OS 기준) 만약 java가 설치되어있는지 확인해 보시려면, 터미널에 'java'라고 입력해보세요. 만약 설치되어있지 않다면 아래와 같은 창이 표시됩니다.

 

 

2) (window 기준) CMD 창에서 'java -version'을 입력했을 때, 정상 출력되면 설치가 잘 되어있는 것입니다.

 

단, 환경설정이 안되어있는 경우 MAC, Window 모두 설치가 안된것 처럼 보일 수 있습니다. Mac은 자동으로 설치시 java를 잡아주지만, window는 별도로 환경변수 설정을 해야할 수 있습니다. 이부분은 다루지 않겠습니다.

 

다음 링크는 현재 최신버전인 Java SE 13.0.1 JDK 설치 링크입니다.

 

https://www.oracle.com/technetwork/java/javase/downloads/jdk13-downloads-5672538.html

 

Java SE Development Kit 13 - Downloads

Java SE Development Kit 13 Downloads Thank you for downloading this release of the Java™ Platform, Standard Edition Development Kit (JDK™). The JDK is a development environment for building applications, and components using the Java programming language.

www.oracle.com

 

들어가보시면 '라이센스'와 관련된 부분이 명시되어있고, 하단에 아래와 같은 OS별 JDK 다운로드 링크가 존재합니다.

(ps, 라이센스 : 2019년 4월 이후로 라이센스가 기준이 변경됨, 개인적인 용도를 위한 개발은 무료지만 그 외의 허가되지 않은 용도로 사용불가)

 

 

저는 macOS 유저라 .dmg라고 되어있는 녀석을 설치했습니다.

 

본인의 운영체제에 맞게 설치해주세요.

 

 

2. Eclipse 설치

아래 링크로 들어가시면 이클립스 다운로드를 위한 링크를 볼 수 있습니다.

 

https://www.eclipse.org/downloads/

 

Eclipse Downloads | The Eclipse Foundation

The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 350 open source projects, including runtimes, tools and frameworks.

www.eclipse.org

링크를 통해 다운로드 후 실행시켜보시면 아래와 같이 이클립스 인스톨러 화면을 볼 수 있습니다.

 

 

'by Oomph' 라고 되어있는 부분이 이클립스의 버전이라고 보시면됩니다.

 

꾸준히 새로운 버전을 출시하는 이클립스네요.

 

[Eclipse IDE for Enterprise Java Developers]를 클릭해 주신 후 설치를 진행하시면됩니다.

 

Java 설치 경로를 변경하지 않았다면, 그냥 'Next', 'Accept', 'Select All'을 통해 넘어가면 설치가 끝납니다.

 

 

설치가 끝나면 아래와같이 workspace를 선택하는 창이 나옵니다. 이럼 끝~

 

이제 다음장에서 본격적으로 프로그래밍 시작해보겠습니다.

'프로그래밍 > Java 기초' 카테고리의 다른 글

[Java 기초] 2. Project 시작하기  (0) 2019.12.25
[Java 기초] 1. Java 설치  (0) 2019.12.24

Naver Cloud Platform

 

1. 네이버 클라우드 사용하기

https://www.ncloud.com/

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

네이버에서도 이제 아마존 AWS와 같은 클라우드 플랫폼을 제공하고있습니다.

 

국내 사용자에게는 AWS의 1년 무료 서비스처럼 micro 서버를 무료로 1년 제공하며, 3개월간 사용할 수 있는 10만 크리딧을 제공하고있습니다.(2019년 1월 이후 가입자)

 

사용방법은 간단합니다.

 

위의 링크에 들어가서 가입 후 원하는 서비스를 신청하면 끝~ 한글이고 설명이 친절해서 대부분의 기능은 손쉽게 사용할 수 있습니다.

 

 

 

2. Micro Server 신청

웹페이지를 위한 서버로 Micro 서버를 신청하여 사용해보겠습니다.

 

https://www.ncloud.com/product/compute/server

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

위의 링크에서 [이용신청]을 클릭하면 됩니다.

 

이후 서버생성 부분에 들어가서 아래와 같이 설정해주었습니다.

 

 

사용할 OS는 Ubuntu, 용량과 서버타입은 1년 무료인 50기가에 Micro로 신청합니다. -> 하단에 다음클릭

 

 

서버 설정은 아래와 같습니다.

 

 

저는 현재 Micro 서버를 이미 만든 상태여서 설정부분이 붉게 표시되어있는 것을 볼 수 있습니다.

 

Micro는 HDD만 지원됩니다. 위와같이 설정하고 다음을 눌러주세요.

 

 

 

다음 인증키 부분에 [인증키 이름]을 입력해주신 후 해당 파일을 다운로드해주세요.

 

 

네트워크 설정은 기본적으로 위와같이 되어있습니다. 그냥 다음눌르고 최종확인도 완료해주시면 됩니다.

 

 

 

이 후 Server 부분을 보면 아래와같은 상태를 볼 수 있습니다.

 

 

상태가 [운영중]이 아니라면 조금 기다려주세요. 자동으로 운영중상태가됩니다.

 

 

보시면 공인IP부분이 빠져있는 것을 볼 수 있습니다.

 

이부분은 추후 다루겠지만, 일단 과금이 되는 부분이기 때문에 현재는 다루지 않겠습니다.

 

참고로 가격은 아래와 같습니다.

 

 

 

 

아나콘다 에러 해결하기

 

UPDATA : 2019.11.20

최근 맥북의 OS업데이트와 아나콘다의 버전 업데이트가 비슷한 시기에 있었습니다.

덕분에 정확하게 누구 문제인지는 모르겠지만, 오랜만에 Jupyter notebook을 사용해보려고하니 경로에러가 계속 발생하더군요.

 

그냥 절대경로 잡아서 수행하다가 불편함이 많아 싹 지우고 클린설치했는데 그래도 문제가 있더군요...

 

 

이런식으로 아나콘다 관련 명령을 입력했음에도 실행이 안되는 문제가 있었습니다.

 

 

1. 경로 확인하기

맥에서 Anaconda의 명령어 경로는 이전부터 동일했었습니다.

 

/Users/<사용자명>/anaconda3/bin/ 명령어

 

위와같은 형태였는데, 이번에 다시 확인해보니 이 경로가 달라졌던것을 볼 수 있었습니다.

 

/Users/<사용자명>/opt/anaconda3/bin/명령어

 

위와같이 중간에 'opt'라는 폴더가 지나가는 것을 볼 수 있었습니다.

 

그럼 환경변수는 잘 되어있는가?

 

 

왠지 모르지만, 아나콘다의 경로가 변함없는 것을 볼 수 있었습니다.

 

그럼 왜 이렇게 됬을까?

 

 

 

 

2. ~/.bash_profile 확인하기

 

리눅스 시스템에서 부팅과 함께 수행할 명령을 적어두는 bash_profile을 확인해보았습니다.

 

흠... 잘 보시면, 중간에 < #added by Anaconda3 2019.10 installer > 라는 부분이 있습니다. 해당 부분을 보게되면 경로설정 영역에 분명하게 '/opt/' 라는 부분이 존재합니다.

 

즉, opt폴더가 경로상에 존재한다는 것을 anaconda3를 설치하는 과정에서 시스템에게 알려주려했다는 것을 볼 수 있습니다.

 

하지만, 여기서 문제가 있죠...

 

일반적인 리눅스라면 문제가 없었겠지만, 저의 PC는 맥...

 

부팅시 bash_profile을 확인하는 것이 아니라, zshrc파일을 확인하게됩니다...

 

 

 

3. ~/.zshrc 파일 확인

 

실행결과 이전에 옛날 아나콘다의 환경변수를 설정하는 부분만 존재하고 새롭게 추가된 'opt'폴더에 대한 명시가 없는 것을 볼 수 있습니다.

 

따라서 기존의 것은 제거하고, bash_profile에서 추가되어있던 opt관련 부분을 복사하여 여기에 추가해주겠습니다.

 

아래는 추가한 모습입니다.

 

변경한 모습

 

이 후 확실한 확인을 위해 재부팅을 해주었습니다.

 

부팅 후 환경변수를 확인해보면 아래와같이 잘 적용된 것을 볼 수 있습니다.

 

 

환경변수도 잘 들어갔고 conda와 같은 명령어도 아래와같이 정상적으로 실행되는 것을 볼 수 있었습니다.

 

 

 

 

문제해결~~~~~!

  1. 2020.02.06 03:32

    비밀댓글입니다

  2. cmc 2020.03.16 17:05

    안녕하세요 이 문제로 잘 안되서 맥 사자마자 기가 팍 죽은 맥린이 입니다 ㅜㅜ
    cat ~/.zshrc 라고 쳐봤는데 no such file or directory가 나와서요
    cat 자체가 하나의 명령어인 걸까요? 초보라서 터미널에 어떤걸 쳐야하는지 헷갈리다 보니 따라하고 싶은데 마음처럼 잘 안되네요 ㅜㅠ

  3. vivlavie 2020.04.26 17:29

    올려주신 글 덕분에 겨우 mac에서 anaconda 2.7 package를 사용할 수 있게되었네요. 감사합니다.

  4. zshrc 2020.07.01 19:09

    안녕하세요!
    맥에 아나콘다 깔았는데, zshrc 파일이 안보여서요.. 어디 가야 저 파일을 볼 수 있을까요?

    • 뒹굴뒹굴 YoungQ 2020.07.24 09:57 신고

      ~/. zshrc

      파일은 계정의 홈디렉토리에 숨김파일로 존재합니다.
      때문에 위 게시물과 같이 그냥 물결 뒤에 위와같이 입력하면 보실 수 있습니다.

WAV 음악파일 속도 변형

 

 

1. WAV 파일이란?

WAV(웨이브 오디오 포맷, Waveform audio format)은 마이크로소프트와 IBM의 오디오 파일 표준입니다.

 

덕분에 해당 포맷에 대해 상세하게 적혀있는 사이트들과 각종 pdf자료들이 존재합니다. 아래는 그중 한 사이트입니다.

 

http://soundfile.sapp.org/doc/WaveFormat/

 

Microsoft WAVE soundfile format

WAVE PCM soundfile format The WAVE file format is a subset of Microsoft's RIFF specification for the storage of multimedia files. A RIFF file starts out with a file header followed by a sequence of data chunks. A WAVE file is often just a RIFF file with a

soundfile.sapp.org

 

 

 

 

아래는 WAV 파일에 대한 포맷 정보입니다.

 

WAV 파일 포맷

 

WAV 파일은 크게 세 개의 영역으로 분류되는 것을 볼 수 있으며, Big Little dndian을 섞어 사용하는 것을 볼 수 있습니다.

 

Python에서 WAV 파일을 불러와 위의 포맷을 확인해보겠습니다.

 

binary read

단순히 샘플 파일을 하나 갖고 와서 위와 같이 열어보았습니다.

 

이를 위 사이트(http://soundfile.sapp.org/doc/WaveFormat/)에 나와있는 정보와 비교해보며 보겠습니다.

 

 

 

 

2. First Block - RIFF 영역 헤더

 

먼저 Little endian과 Big endian에 따라 hex값을 출력해주는 함수를 만들어주었습니다.

 

 

다음으로 위의 사이트에 나와있는 첫 번째 블록 정보를 보았습니다.

 

ChunkID : "RIFF"라는 문자를 ASCII로 갖고 있음. (big-endian기준 : 0x52494646)

ChunkSize : 전체 파일크기 중 ChunkID와 ChunkSize부분인 8Byte를 제외한 전체 크기를 말함

Format : "WAVE"라는 문자를 갖고 있음 (big-endian기준 : 0x57415645)

 

이번에는 파이썬에서 보겠습니다.

 

위와 같이 홈페이지에 나와있는 것과 동일한 ChunkID와 Format값을 갖고 있는 것을 볼 수 있으며, ChunkSize의 값을 10진수로 표시하고 8을 더해 전체 파일크기와 비교해보겠습니다.

 

예측되는 전체 파일크기
실제 파일정보

 

보시는 것과 같이 동일한 파일크기를 갖는 것을 볼 수 있습니다.

 

 

 

 

3. Second Block - fmt 영역 헤더

 

다음은 두 번째 블록 정보입니다.

Subchunk1ID : "fmt "값을 갖고 있음. (big-endian기준 : 0x666d7420)

Subchunk1Size : Subchunk1의 크기

AudioFormat : PCM 방식이면 1

NumChannels : Mono = 1, Stereo = 2

SampleRate : 샘플링 주기

ByteRate : SampleRate * NumChannels * BPS/8

BlockAlign : NumChannels * BPS/8

BPS : 초당 비트 값

Extra Data

 

마찬가지로 파이썬에서 실제 데이터로 보겠습니다.

 

각각의 데이터는 Hex데이터임을 생각하시고 봐주세요.

 

위의 데이터를 보게 되면, 해당 음원(wav파일)은 아래와 같은 정보를 갖고 있습니다.

 

PCM 방식 파일 압축, 스테레오 음원, 샘플링 주기는 44100Hz(0xac44), BPS는 16bit

 

위 정보를 기반으로 음원 재생 프로그램은 노래를 재생하게 되는 중요한 정보입니다.

 

 

 

 

4. Last Block - data 영역

 

마지막 블록입니다.

 

Subchunk2ID : "Data"라는 값을 갖고 있음. (big-endian 기준 : 0x64617461)

Subchunk2Size : Subchunk2의 크기를 말합니다.

Data : 실제 음원 정보를 갖고 있는 데이터입니다.

 

Data 영역은 Little endian으로 구성되어있는 모습 그대로 표시한 것입니다.

 

 

이렇게 해서 일단 WAV 파일의 정보를 모두 확인해보았습니다.

 

다음장에서는 해당 데이터를 수정하여 음원을 변경하는 것을 보여드리겠습니다.

DHCP 깊게 알아보기

 

 

1. 원하는 IP주소 할당받기

DHCP Request Message를 자세히 보게되면 아래와 같은 [Requested IP Address]라는 항목이 존재합니다.

 

DHCP Request Option

 

DHCP Server가 할당하기를 원하는 IP주소가 아닌 다른 IP주소를 요청할 경우 어떤 응답이 올지 궁금하지 않습니까?

(크흠... 저는 궁금했습니다.)

 

 

확인해보기

위의 상황을 만들어보기 위해서 먼저 Jupyter notebook을 열었습니다.

IP주소를 일단 할당받을 이후에 새로운 IP주소를 요청하는 형태로 진행해보았습니다.

 

 

 

먼저 기존의 DHCP PACKET을 그대로 복제해서 전송해보았습니다.

 

DHCP PACKET

 

Wire Shark를 이용하여 Packet Data를 Hex Stream으로 복사한 후 해당 데이터중 dhcp의 데이터 부분만 뽑아내어 그대로 전송하였습니다.

 

여기서 특이한 부분은 UDP부분에 들어가는 CheckSum값이 틀리게 전송되고 있다는 것이었습니다.(복제되기전 패킷부터)

 

덕분에 Checksum값을 계산해주지 않고 그냥 전송할 수 있었습니다. ㅎㅎ

 

socket은 UDP이기 때문에 DGRAM으로 열어주시고, 68번 port를 Source로 67을 Destination으로 설정해주었습니다.

 

< 68번 Port로 Socket을 Bind를 해준 상태로 와이파이를 연결하면 IP주소를 받아오지 못할 수 있습니다. >

< 중간에 와이파이를 다시 잡아야할 필요가 있다면, socket close 후 진행해주세요 >

 

 

어찌되었든 패킷을 복제해서 전송해봤는데, ACK가 정상적으로 수신되는 것을 볼 수 있었습니다.

 

이제 DHCP의 메시지 중 Request IP 부분을 수정해서 다시 전송해보겠습니다.

 

IP Address 영역
Hex Data 중 IP 영역

ac(16) : 172

1e(16) : 30

01(16) : 01

23(16) : 35

 

위의 데이터의 마지막 23(16)을 64(16)으로 변경해서 전송해보겠습니다.

(64(16)은 10진수로 100입니다. 즉, 172.30.1.100 으로 요청)

 

실행결과

 

실행결과 위와같이 NAK 메시지를 수신하였습니다.

 

NAK는 'Negative ACK'를 의미합니다. 즉, 싫다는 뜻입니다. 힝...

 

NAK...

그 이후로 IP주소를 변경해가며 요청해보았지만, 전부 거절당했습니다.

 

서버측에서 DHCP Discover 단계에서 허가해준 IP주소에 한정해서 할당이 가능한듯합니다.

 

 

 

2. DHCP Discover 요청

위에서의 실패를 발판삼아 이번에는 Discover 요청부터 수행해보겠습니다.

 

마찬가지로 Discover 패킷을 복제해보았습니다. (역시나 Checksum은 맞지 않습니다.)

 

DHCP Discover

 

DHCP Discover에 대한 응답도 잘 왔습니다. (DHCP Offer)

 

다만, Discover의 경우 IP주소를 요청할 뿐 원하는 IP주소를 선택할 수 없으며, 동시에 이미 IP주소를 할당받은 상태로는 아무리해도 결과가 동일합니다.

 

고민이군요...

 

테스트하는 공간에 카페이다보니 공유기 설정창에 접속해서 만져보기가 힘드네요.

 

추후에 다른 환경에서 확인 후 이어서 포스팅 하겠습니다 ㅎㅎ

DHCP 프로토콜이란?

 

1. DHCP란?

DHCP(Dynamic Host Configuration Protocol)는 조직의 네트워크(사설망)의 호스트에게 동적으로 IP주소를 할당하는 프로토콜입니다.

예를들어 본다면, 쉽게 생각하여 IP를 할당하는 공유기에 PC를 연결하면 자동으로 192.168.~ 로 시작하는 IP주소를 자동으로 할당해주는 것과 같습니다.

 

개인 또는 소규모 사업체의 경우 위와같은 공유기 등을 이용하여 사설IP를 할당받아 사용하거나, 각 호스트별로 IP를 관리자가 직접 할당하지만, 호스트가 네트워크 케이블을 연결함과 동시에 자동으로 IP를 할당받아 통신이 될 필요가 있으면서 연결된 호스트 IP를 정해진 규칙에 맞에 관리할 필요가 있다면 DHCP를 선택하는 방법이 좋습니다.

 

 

 

2. DHCP의 장단점

 

DHCP의 장점

 : DHCP 이전에는 네트워크 관리자가 IP주소를 관리하기 위해서는 [ MAC주소 - IP주소 ]를 관리자가 직접 맵핑하여 서버에 저장해 두고 PC와 같은 노드(node)가 부팅되면 BOOTP라는 프로토콜을 이용하여 서버로부터 IP를 알아오는 방식이었습니다.

이러한 방식은 매번 새로운 IP장비를 연결할때마다 관리자가 직접 IP주소와 MAC 주소를 맵핑시켜줘야 할 필요가 있습니다. 하지만 DHCP방식이 도입되면서는 자동으로 PC에 IP주소를 할당해주기 때문에 이러한 문제를 해결할 수 있었습니다.

 

또한 DHCP는 서버에서 모든 사설 IP주소를 관리하기 때문에 IP주소 충돌과 같은 문제를 예방할 수 있습니다.

 

 

DHCP의 단점

: DHCP는 서버가 자동으로 IP를 할당하기 때문에 몇가지 문제가 있습니다. 예를 들어 A라는 PC가 192.168.0.2라는 IP주소를 갖고 있다가 연결이 해제되면 해당 IP주소를 다른 B라는 PC가 할당받을 수 있습니다. 일반적인 경우라면 문제가 없겠지만, 만약 포트포워딩으로 특별한 서비스를 제공하는 경우 정전 등에 의해 공유기(DHCP 서버)가 재부팅될 때, 갑작스럽게 IP주소가 변경되어 서비스가 불통이 될 수 있습니다.

 

또한 IP주소를 기반으로한 인증방식을 갖고 있는 서비스가 사설 네트워크에 제공된다면 이것 역시도 문제를 발생시킬 수 있습니다.

 

이러한 문제들 외에도 보안과 서비스에 관련된 문제들이 있고 이러한 문제를 해결하는 여러 방식들이 존재합니다.

 

 

 

3. DHCP의 원리

DHCP의 IP주소 할당방식은 'IP주소 임대'가 핵심입니다.

특정 장비에 특정 IP주소를 일정 기간동안 빌려주는 방식이고, 해당 시간이 끝나면 다시 서버가 회수합니다.

이 과정에서 장비와 서버는 [IP주소 임대 요청], [임대기간 연장], [IP주소 사전 반납], [재연결 요청] 등의 통신을 수행합니다.

 

 

4. DHCP PACKET

DHCP는 Client는 UDP 68번, Server는 UDP 67번을 사용합니다.

 

 

1) DHCP DISCOVER ( Client -> Server )

 

 

DHCP Discover
DHCP Discover

DHCP Discover Message는 위와같이 네트워크 전체에 '브로드캐스팅'되는 것을 볼 수 있습니다.

 

Client가 Server에 전송하는 Packet으로 Client는 자신의 MAC 주소를 네트워크에 브로드캐스팅합니다.

 

브로드캐스팅된 해당 패킷을 DHCP 서버가 확인하면 'DHCP 서버의 IP주소'와 'DHCP 서버가 할당할 수 있는 IP주소'를 해당 장비에게 전달합니다. (DHCP OFFER)

 

 

2) DHCP OFFER ( Server-> Client )

 

DHCP Offer
DHCP Offer

 

위에서 보면 [172.30.1.254 = 공유기(DHCP 서버)]가 [172.30.1.35 = Client에게 할당하려는 IP주소]에게 DHCP Offer Message를 전송하는 것을 볼 수 있습니다.

 

특이한 것은 DHCP Server가 목적지로 하는 172.30.1.35는 아직 Client의 IP주소가 아니라는 것입니다. 때문에 Client 측에서는 해당 패킷을 수신하면 이더넷(Layer 2) 계층에서는 자신의 MAC 주소를 목적지로 하기 때문에 상위계층(Layer 3, Network)으로 올려 보내지만 해당 Layer에서는 자신을 목적지로 한 IP주소가 아니라고 생각합니다. 해당 장비가 Routing 기능이 활성화되어있다면 어떻게 될지 궁금하네요.

 

어찌 되었든 해당 DHCP Offer Message를 좀 더 보겠습니다.

 

DHCP의 메시지 영역을 보면 아래와 같은 내용이 있습니다.

 

DHCP Offer

해당 내용은 현재 IP주소를 할당하려는 DHCP 서버가 Client에게 할당하려는 IP주소와 네트워크의 정보들을 공지한 것입니다.

 

해당 내용을 참고하여 Client는 해당 IP주소를 사용할 것인지를 판단하고, 해당 IP주소를 할당받기를 원한다면 DHCP 서버에게 DHCP REQUEST Message를 전달합니다.

 

 

3) DHCP REQUEST ( Client -> Server )

 

DHCP Request
DHCP Request

 

DHCP Request는 DHCP Server가 알려준 IP주소와 네트워크 정보를 잘 수신하였고, 해당 IP주소를 할당받겠다는 응답을 전달하는 역할을 수행합니다.

 

위에 보시면 아직 송신지 주소는 0.0.0.0인 상태이며, DHCP Server의 IP주소로 내용을 전달하는 것이 아니라 브로드캐스팅을 수행하는 것을 볼 수 있습니다. 즉, 아직 Client는 IP주소를 할당받지 않은 상태임을 말합니다.

 

서버는 Client의 DHCP Request Message를 수신하면, 해당 내용을 확인했으며 IP주소를 사용해도 좋다는 응답(DHCP ACK)을 보냅니다.

 

 

 

4) DHCP ACK ( Server -> Client )

 

DHCP Ack
DHCP Ack

 

DHCP Ack Message를 수신한 Client는 이제부터 해당 IP주소를 사용하여 네트워크에 패킷을 전송할 수 있습니다.

 

즉, 이 시점부터 IP임대가 시작되는 것입니다. (172.30.1.35 가 저의 IP주소가 되었습니다.)

 

DHCP ACK 패킷을 좀 더 보겠습니다.

 

DHCP Option

DHCP의 Option을 보면 위와 같이 IP주소의 임대 기간이 나와있습니다.

 

해당 DHCP Server는 정확하게 1시간을 임대기간으로 할당하는 것을 볼 수 있습니다.

 

만약 1시간 동안 PC에서 IP 주소 임대 연장에 관련한 요청이 없다면 해당 IP주소는 1시간 후 회수됩니다.

 

그럼 이제 임대연장에 대해 보겠습니다.

 

 

 

5) DHCP IP 임대기간 연장

 

DHCP에서 IP주소의 임대기간을 연장할 때에는 앞서 사용한 DHCP Request Message를 사용합니다.

 

DHCP Request & Ack

위에 패킷을 보게 되면 [172.30.1.35]라는 제가 위에서 할당받았던 IP주소를 사용하여 DHCP 서버(172.30.1.254)에 DHCP Request 메시지를 보내는 것을 볼 수 있습니다.

 

앞서 0.0.0.0으로 브로드캐스팅했던 것과 큰 차이가 있습니다.

 

패킷의 Option 부분에도 큰 차이가 있습니다.

 

DHCP Request ( Client -> Server )

클라이언트가 보낸 메시지에는 위와 같은 내용이 있습니다.

 

즉, IP주소의 임대기간을 90일로 변경해달라는 내용입니다. 기존에 1시간을 할당받았던 것을 생각해보면 너무 파격적이네요.

 

그리고 응답(DHCP Ack)을 보겠습니다.

 

DHCP Ack ( Server -> Client )

응답을 보게 되면 Client의 90일은 할당해주지 않았지만, 위와 같이 1시간으로 임대기간을 변경해 준 것을 볼 수 있습니다.

 

기존에 1시간을 받았다가 30분 정도가 지나 30분이 남았던 임대기간을 1시간으로 재조정한 것입니다.

 

 

 

5. 다음 이야기

이번에 알아본 DHCP의 네 가지 [Discover, Offer, Request, Ack]이외에도 몇 가지 Message들이 존재합니다.

 

물론 위의 네 가지가 가장 압도적인 비율을 차지합니다만, 다음 페이지에서는 위 네가지 이외의 메시지들과 Client 측에서 DHCP Server를 귀찮게 하는 몇 가지 것들을 알아보겠습니다.

1. 가상환경 생성

conda create -n [가상환경이름] python=[버전]

 

ex) conda create -n datasci python=3.7

 

 

2. 가상환경 목록 확인

conda info --envs

 

3. 가상환경 실행

conda activate [가상환경이름]

 

ex) conda activate datasci

 

 

4. 가상환경 해제

conda deactivate

 

 

5. 가상환경 제거

conda remove -n [가상환경이름] --all

 

ex) conda remove -n datasci --all

 

1. 회선교환 (Circuit Switching) 방식

회선교환 방식은 회선 독점을 통한 통신방식이라고 볼 수 있습니다.

 

아래와 같은 간단한 네트워크망이 존재한다고 가정하겠습니다.(실제로는 대부분 전화망에서 사용하기 때문에 구성이 조금 다릅니다.)

 

(PC와 교환기로 이루어진 네트워크망입니다.)

(교환기는 단순히 전용선을 할당하는 장비라고 생각하셔도 무관합니다.)

 

 

네트워크망 예시

회선교환 방식의 가장 큰 특징은 [전용선 할당]에 있습니다.

 

예를들어 전송할 데이터가 있다고 하면 아래와 같이 전송을 위한 전용선을 할당하고 해당 선로로 모든 데이터를 전송합니다.

 

회선교환 방식

위 그림과 같이 송수신을 연결하는 전용선을 설정하고 전송을 하는게 핵심입니다.

 

개념을 이해하셨다면 특징에 대해 말해보겠습니다.

 

 

 

2. 회선교환의 특징

  • 회선교환은 통신 회선을 설정하여 데이터를 교환하는 방식
  • 회선 교환방식으로 음성 전화 시스템에 사용됨
  • 송신자의 모든 데이터는 동일한 경로로 전송됨
  • 안정적인 통신이 가능함
  • Point-To-Point 방식으로 연결됨
  • 통신중 중간경로에 문제가 발생할 경우 전체 연결이 끊어짐 (새로운 경로를 통한 새로운 회선할당 필요)

 

장점

 - 대용량 + 고속 데이터 처리에 우수

 - 고정적인 대역폭을 사용

 - 연속적인 데이터 처리에 우수

단점

 - 회선 이용 효율이 떯어짐 (대역폭 낭비)

 - 통신과정에서 회선문제시 회선할당부터 다시해야함

 - 통신비용이 고가임

 

 

 

3. 패킷교환 (Packet Switching) 방식

회선교환 방식과 비교된다면, 대충 눈치채셨을 수 있습니다. 패킷교환은 회선교환과 다르게 [전용선]의 개념이 없습니다.

 

패킷교환은 전송하려는 데이터를 패킷이라는 단위로 나눠 네트워크망으로 뿌려주게됩니다.

 

이때 패킷에는 해당 데이터가 어떤 데이터의 몇번째 데이터인지의 정보와 최종 목적지에 대한 정보가 들어있습니다.

 

위의 정보를 라우터가 보고 패킷을 최적경로를 향해 전달하게 됩니다. 이때 최적경로는 단순하게 거리만을 계산하는 것이아니라, 망의 혼잡도(대역폭 사용율), 연결상태, 기타 설정등에 따라 그때그때 변경될 수 있기 때문에 경로는 수시로 변경될 수 있습니다.

 

따라서 특정한 데이터가 100개의 패킷으로 분해되어 전송된다면, 100개의 패킷들은 라우터에의해 서로다른 경로로 전송될 수 있고, 최종적으로 목적지에 100개의 패킷이 전달되면 패킷의 순서를 통해 다시 원래의 데이터로 합쳐지는 방식입니다.

 

 

(PC와 라우터로 이루어진 네트워크 망입니다.)

(라우터는 데이터의 최적경로를 파악하고 결정하여 송신하는 장비로 일단은 공유기의 상위호환 정도로 생각하셔도 괜찮습니다.)

 

패킷교환 방식

위의 그림과 같이 3개의 패킷이 [왼쪽]에서 [오른쪽]으로 전송될 때, 각각의 패킷은 서로 다른 경로로 전송될 수 있습니다.

 

또한 이러한 특성 때문에 전송되는 패킷은 순서와 다르게 수신될 수 있습니다.

 

 

 

4. 패킷교환의 특징

  • 전송되는 패킷은 여러 경로를 이용가능(패킷별로 최적의 경로 선택)
  • 송신 패킷의 순서와, 수신 패킷의 순서가 다를 수 있음
  • 전송 속도 및 흐름 제어가 가능
  • 에러 탐지가 가능(패킷정보를 통해)
  • 일반적인 인터넷 망에서 사용됨

 

장점

 - 회선의 이용률이 높음

 - 애러 및 장애에 강함 : 라우터 고장시 다른 경로를 즉각적으로 이용, 애러에 대해 특정 패킷만 재전송 가능

 - 인터넷 뿐만 아닌 다양한 통신망에서 사용가능(전화도 가능)

단점

 - 경로 탐색과정에서 지연이 발생됨

 - 전송량 증가에 따라 지연율이 급격하게 상승

 - 패킷헤더 추가로 인한 오버헤드 발생이 가능함

 

 

 

 

5. 가상회선(Virtual Circuit) 기술

가상회선 기술은 위의 패킷교환방식의 네트워크에서 회선교환과 같은 통신을 만들어주는 기술입니다.

 

패킷단위로 데이터를 전송하지만, 사전에 논리적으로 구성된 특정한 경로로 데이터를 전송하게 됨으로 모든 패킷은 동일한 경로를 통해 데이터가 전송됩니다.

 

수신측은 위의 특징 때문에 순차적으로 패킷을 수신할 수 있습니다.

 

다만 전송을 수행하기 전에 앞서 언급한것처럼, 경로를 결정해야하고 이를 위해 몇가지 특수한 패킷들을 네트워크에 전송할 필요가 있어 처음 연결에 약간의 시간이 필요하며, 또한 경로만 일정할 뿐, 전용회선이 아니기 때문에 설정한 경로를 통해 다른 노드에 의해 대량의 데이터가 유입될 경우 네트워크 지연이 발생할 수 있습니다.

  1. S Kim 2020.07.04 05:57

    네트워크 문외한인데 네트워크 기초를 익혀야 할 일이 있는데 이렇게 잘 정리해주셔서 감사합니다 ㅠㅠ 혹시 초보자가 보기 좋은 개념 정리서 같은 게 있을지요?

    • 뒹굴뒹굴 YoungQ 2020.07.24 09:53 신고

      네트워크에 대한 가벼운 이해정도를 목표로 하신다면, 책보다는 그냥 잘 정리된 블로그를 찾아보시는게 좋다고 생각됩니다.
      만약 전공자 과정을 희망하신다면, 아래 책으로 시작하시는 것을 추천드립니다.

      TCP/IP 프로토콜
      Behrouz A. Forouzan 저

      국내 번역도 나름 잘 번역되어 있기 때문에 번역으로 보시는 것을 추천드립니다.

+ Recent posts