이전 CPU의 명령어 처리 주기에 이어서 CPU가 기존 1 core에서 Multi-core로의 발전과 process 단위 실행에 대한 문제점을 개선하기 위해 나온 threading에 대해서 설명한다 

  • Process 
    • process는 하나의 코어에 하나만 동시에 작업될 수 있고 여러개의 process를 맡길 수 있는데 이때 동시에라는 말은 시간에 대한 개념으로 여러개의 process를 맡기더라도 정해진 스케쥴의 프로세스들을 시분할로 몇 ms씩 번갈아가면서 작업을 한다 
    • process에는 5가지 상태가 있다 -
      • create - 프로세스가 생성되는 중이다 
      • running - 프로세스가 CPU를 차지하여 명령어들이 실행되고 있다 
      • ready - 프로세스가 CPU를 사용하고 있지는 않지만 언제든 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있다. ready상태의 프로세스들은 정해진 schedule에 따라 우선순위를 가지고 있고 우선순위가 높은 프로세스가 먼저 CPU를 할당받는다 
      • waiting(block) - 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태
      • terminated - 프로세스의 실행이 종료되었다 
    • 프로세스는 OS kernel에 설정된 Timeout에 따라 running, ready, waiting 상태를 계속 반복하게 된다
    • 이렇게 계속해서 프로세스를 중지시키고 다시 시작하고 할 때마다 계속해서 메모리의 특정 영역에 이전 프로세스의 정보를 저장하고 이번에 작업해야하는 프로세스의 정보를 읽어오는데 이러한 작업을 Context Switching 이라 한다 
    • Process context switching에 포함되는 정보는 다음과 같다
      • Process ID 
      • Process state 
      • program counter ( 이 프로세스가 다음에 실행할 명령어의 주소를 가지고있음)
      • registers
      • scheduling 정보 
      • memory 관리 정보 
      • process 계정 정보 
      • I/O state 정보 
    • 프로세스가 너무 자주 변경되면 context switching overhead가 커져 효율적이지 못하다 
    • 하지만 사용자는 더 많은 작업들을 동시에 실행시키고 싶어하고 이를 위해 사용하는 기술이 threading이다 
  • thread 
    •  어떤 프로세스내에서 실행되는 흐름의 단위를 말한다.
    • 일반적으로 하나의 프로그램은 하나의 스레드를 가지고 있지만 프로그램의 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다 
    • multi process의 경우 각 process는 독립적으로 실행되며 별개의 메모리를 차지하고 있는 것과 달리 multi thread는 프로세스 내부에서는 메모리를 공유해 사용할 수 있다. 또한 context switching overhead가 작아 프로세스간의 전환보다 스레드간의 전환속도가 더 빠르다 
    • 하지만 하나의 메모리를 둘이상의 흐름이 동시에 접근 할 수 있어 값을 읽고 쓸때 동시에 같은 메모리 주소에 접근하지 못하게 프로그래머의 계획이 필요로 하게 된다 
    • thread는 또 2가지로 나뉘는데 
      • User-Level Thread 
        • 커널 영역의 상위에서 지원되며 일반적으로 사용자 레별의 라이브러리를 통해 구현됨 
        • 프로세스내부의 하나의 스레드가 중단되면 다른 모든 스레드도 중단된다 . 커널이 프로세스 내부의 스레드를 인식하지 못하며 해당 프로세스를 대기상태로 전환하기 때문이다 
        • 일반적으로 프로그래밍을 할 때 사용되는 스레드가 사용자 레별 스레드와 비슷하게 실행된다 
      • Kernel-Level Thread
        • OS가 지원하는 스레드 기능으로 구현되고 커널이 스레드의 생성과 스케줄링을 관리한다 
        • 하나의 스레드가 중지되더라도 같은 프로세스 내부의 다른 스레드를 중단시키지 않는다

thread의 흐름 출처 : https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85), https://m.blog.naver.com/three_letter/220333796848
thread level

  • multi-threding
    • TMT ( Temporal Multi-Threading) - 일시적 멀티스레딩
      • 하나의 코어에서 여러개의 스레드를 시분할로 번갈아가면서 작동시킴 
    • SMT ( Simultaneous Multi-Threading) - 동시 멀티스레딩
      • 여러개의 스레드를 동시에 작동시킴 
      • 하드웨어 상에서 1개 이상의 명령어를 issue하고 dispatch 할 수 있다면 동시 멀티스레딩을 위해서는 각 스레드의 context를 저장할 추가적인 레지스터 정도의 하드웨어 모듈이 추가되면 구현이 가능하다 
      • 현재는 2-way, 4-way, 8-way SMT들이 있고  양방향(2-way) 동시 멀티스레딩을 주로 사용하는데 Intel에서 개발한 2-way SMT를 Hyper threading이라 한다 

*programing에서의 thread - 일반적인 프로그래밍에서 thread를 사용하면 여러개의 코어에 스레드를 적절하게 분배하지만 python의 경우 GIL(Global Interpreter Lock)로 인해 하나의 프로세스에서만 동작하게 되고 결국 하나의 프로세스에서 시분할로 여러개의 스레드가 작동되게 된다 그렇기에 완전한 병렬이라고 볼 수 없다.

 

  • Multi-processing 
    • Multi processing은 여러개의 프로세스들끼리 자원을 공유하며 동시에 작업을 진행하는 기술을 말한다 - multi threading의 경우 하나의 프로세스안에서 여러개의 스레드가 시분할로 작동된다면 multi processing은 다수의 프로세스들끼리 통신하여 한개 이상의 코어에서 동시에 프로세스에서 작업을 진행하는 것이다. 여기서 여러개의 코어로 말하지 않는 이유는 특정 코어에 고정적으로 프로그램을 동작시키지 않는다면 OS의 코어 할당 우선순위에 따라 같은 코어에 2개의 프로세스가  시분할로 작업될 수 있기 때문이다 
    • 하지만 process들간에는 메모리 공유가 되지 않고 각각의 독립된 공간에서 작업을 진행하기 때문에 같이 사용하는 데이터가 있을 경우 IPC(Inter Process Communication)을 사용하여 자원을 공유하여야 한다. 여기서 공유된 자원에 대하여 동시에 여러 프로세스들이 접근하는 것은 매우 위험하기에 권장되지 않는다 
    • IPC의 종류 
      • Pipe 방식 
        하나의 프로세스는 데이터를 쓰기만 하고 다른 하나는 데이터를 읽기만 한다 
        한쪽으로만 통신하기 때문에 Half-Duplex(반이중) 통신이라 부르기도 한다 
        만약 Full-Duplex(전이중) 통신을 원한다면 하나의 Pipe를 더 생성하여 Cycle을 만들면 된다 
        프로세스간에 PPID를 알고 있어야 정보의 전달이 가능하다 - 주로 자식, 부모 프로세스간 사용
      • Named Pipe (FIFO) 
        프로세스의 통신을 위해 이름이 있는 파일을 이용한다 
        위의 pipe와 다르게 부모 프로세스와 무관하게 전혀 다른 모든 프로세스들 사이에서 통신이 가능하다 
        하지만 위와 마찬가지로 전이중 통신을 위해서는 두개의 FIFO파일이 필요로 하게 된다 
      • Message Queue 
        프로세스간에 공유하는 Queue를 생성한다 선입선출의 자료구조를 가지며 커널에서 관리한다 
        메모리공간에 위치하기 때문에 어느 프로세스에서던 데이터를 이용할 수 있다. 
      • Socket 
        네트워크를 이용하여 socket으로 데이터를 공유한다 
        127.0.0.1:50000 이런 IP:PORT로 접근 할 수 있기 때문에 물리적으로 다른 위치에 있는 하드웨어의 프로세스에서도 접근할 수 있다 
      • Shared memory 
        메모리의 일정공간(주소)를 공유한다 
        일반적으로 프로세스는 자신만의 메모리 공간을 가지고 있는데 kernel상에서 공유할 메모리공간을 따로 할당하여 프로세스에서 사용할 수 있게 한다 
        공유메모리 방식은 중간에 broker가 없기 때문에 IPC 방식들 중에 가장 빠르게 작동할 수 있다 
        공유메모리를 두개이상의 프로세스가 동시에 접근할 시 문제가 될 수 있기에 semaphore같은 관리장치를 이용하여 동시접근을 예방할 수 있다 
      • Memory map 
        Shared memory와 비슷하지만 열린 파일을 메모리에 올려 공유한다는 점이 다르다 
        파일은 시스템의 전역적인 자원이므로 서로다른 프로세스들 끼리 공유하는데 문제가 없다 

shared memory와 socket 방식
Pipe 방식

 

IPC Socket : https://github.com/dldidfh/distributed_process

 

GitHub - dldidfh/distributed_process

Contribute to dldidfh/distributed_process development by creating an account on GitHub.

github.com

공유 메모리 : https://github.com/dldidfh/tistory_code/tree/master/%EA%B3%B5%EC%9C%A0%EB%A9%94%EB%AA%A8%EB%A6%AC

'IT기초' 카테고리의 다른 글

(2) CPU Instruction Cycle  (0) 2022.11.09
(1) Linux 기초 - 리눅스란?  (0) 2021.11.22
[네트워크] 개발자용 네트워크 기초  (0) 2021.09.28

CPU는 사람의 두뇌라고 볼 수 있다. 모든 컴퓨터 장비들을 통제하고 실질적으로 모든 작업에 대해서 main으로 처리하는 장비이다

 

매우 좋은 자료 : https://www.youtube.com/watch?v=Fg00LN30Ezg 

 

CPU가 처리하는 작업으로는 대표적으로 4가지가 있다 

Fetch, Decode, Execute, Writeback 

  • Fetch 
    1. PC(Program Counter)에 저장되어있는 주소를 MAR(Memory Address Register)에 복사한다 
    2. MAR에 저장되어있는 주소를 address bus*에 배치시킨다 
    3. 제어장치가 read signal을 발생시키기 위해 control bus에 read state를 배치시킨다 
    4. address bus에 있는 주소를 참조하여 메모리에서 해당 주소에 해당하는 값을 읽어 Data bus(Buffer bus)에 배치시킨다 
    5. Data bus에 배치되어있는 명령 또는 데이터를 MDR(Memory Data(Buffer) Register)에 불러들인다 
    6. MDR의 명령어가 IR(Instruction Register)에 복사된다 
    7. Program Counter에 메모리 주소가 다음 주소로 증가한다 ( CPU의 처리 단위 bit에 따라 주소 증가 값이 다름*)
  • Decodes
    1. CU(Control Unit)이 IR에 저장된 명령어를 decodes 한다 - CPU 제조사에 따라 opcode가 다를 수 있음
      명령어 : 00000001 -> opcode 리스트를 확인하여 -> 저장명령어구나 ! 한다. 
  • Execute 
    1. 해석된 명령어에 따라 데이터에 대한 명령을 수행한다 
  • Writeback
    • 처리가 완료된 캐시에 있는 데이터를 메모리에 기록한다. 결과값을 기다리는 명령어가 있다면 결괏값이 생겼다 알려준다

*address bus - 일정한 메모리 번지를 찾을 때 사용되는 신호를 운반하는 컴퓨터 내의 배선 버스 

*CPU의 처리단위 bit에 따라 주소 증가값 : RAM에 주소 하나에는 8bit씩 저장되어 OS 64bit process의 경우 8씩 증가한다
(64bit = 8bit의 묶음 8개) 

 

위의 CPU의 4가지 작업은 간단한 순차적 처리의 경우의 단순한 예시이다. 

만약 특정 메모리 주소의 데이터를 참조해야하는 명령어가 진행 중인데 특정 메모리 주소의 값이 아직 처리되기 전이라면 가만히 기다릴 것인가? 

  • Out-of-Order Execution OoOE - 비순차적 명령어 처리
    1. 만약 어떤 결과값을 받아야 다음이 실행되어야 하는 명령어가 있을 때 결괏값을 받을 때까지 계속 대기한다면 Idle time이 길어지게 된다
    2. 이때 현재까지 진행하던 명령어 처리를 잠시 뒤로하고 다음 명령어를 실행하면 Idle time을 줄일 수 있다
    3. 그러면 이전 명령어는 어떻게 다시 불러올까? 
    4. 이전 명령어의 진행단계를 특정 저장장소에 저장해놓자 
    5. 그렇게 하기위해서는 일정 명령어들끼리 미리 의존성(이전 결괏값을 기다려야 하는 명령어가 있는가?)을 조사하여 의존성이 해결된 명령어들을 먼저 실행하자! 
    6. 그렇기 위해서는 위에서 설명한 Decode 단계를 Issue, read-operand 2단계로 나눈다. 바로실행할 수 없는 명령어는 대기상태(stall)로 변경된다 
      • issue - 다음 명령어가 실행가능한지 검증한다 
      • read-operand - 실행가능한 명령어의 opcode를 불러온다 
    7. 비순차적 명령어 처리로 인해 발생할 수 있는 문제 
      1. WAR - Write after Read - 변경된 값을 읽어옴
      2. WAW - Write after Write - 변경하고 또 변경함 
      3. 아래 SMT를 설명할 때 추가설명

* 분기 예측 (Branch Prediction): 특정 조건에 맞는 상황에 다음에 실행할 명령어의 주소를 예측한다

* 추측 실행 (Speculative Execution): 어떤 명령어가 특정 단계에서 필요한 정보가 없어 진행이 막혔을 때 필요한 정보를 예측해서 높은 확률로 맞춘다면 틀렸을 때의 다소 큰 손해를 넘어서는 큰 이익을 취할 수 있다. 

 

비순차적 명령어 처리에서 이전 명령어의 진행단계는 어디에 어떻게 저장하나? 

기존 CPU의 명령 cycle이 4단계에서 8단계로 세분화된다

  • Rename 
    1. 실제 프로그래머가 보는 레지스터 주소는 0x0001 이런 논리적 주소(Architecture Register file )이다 이를 프로그래머가 실제로 보지 못하는 물리 레지스터 파일(Physical Register File )과 메핑 한다 이러한 메핑에 대한 정보는 RAT(Register Alias table)에 저장된다 

Renaming 출처 : https://en.wikipedia.org/wiki/Register_renaming

 

  • Dispatch
    • 명령어가 실행하기 위해 대기하는 대기열 - 순서를 기다리는 Reservation Station : ROB(Reorder Buffer)
  • Issue
    • 대기열에 있는 명령어가 실행될 수 있는지 검증하고 실행하기 위한 장치 
  • Commit 
    • 명령어를 수행하며 사용한 자원을 반환

 

그럼 또 생각나는 것은 브라우저를 이용하면서 카카오톡도 쓰고 싶다. 

초창기에는 하나의 작업을 빨리 끝내고 다음 작업을 시작하자!라고 생각하여 CPU의 성능(clock, 면적)을 올리는 것에 집중했다. 하지만 한계에 다 달았고 그로 인해 Dual, Octa core 등의 다수의 core를 장착한 CPU가 사용되어 보편화되기 시작한다

다음 장에서는 멀티태스킹의 발전에 대해서 설명하기 위해 Multi-process, Multi-Threading에 대해서 설명하겠다

 

 

 

 

 

 

 

 

대학교 시절에는 리눅스란 말을 듣고 지레 겁먹었던 기억이 난다. 

아무것도 모르는 것에 다가간다는것은 어려웠다 

이후에 리눅스를 자주 사용하며 개발이나 운영에 있어서 윈도보다 편하다는 느낌이 들기도 한다. 

리눅스에 대해서 알아보자 

 

 

1. 리눅스의 정의 

  • 컴퓨터의 운영체제 중 하나 - 리누스 토르발스가 처음 출시한 운영 체제 커널인 리눅스 커널에 기반을 둔 오픈 소스 유닉스 계열 운영체제 계열 
  • 위의 말은 너무 어렵다 그냥 리누스 토르발스라는 사람이 처음 제작했구나 만 알면 된다 
  • 우리가 주로 사용하는 리눅스 운영체제로는 Ubuntu, CentOS, SuLinux, 등등이 있다. 
  • 여기서 위의 각각의 운영체제가 다 같은 리눅스라는 것인가? - 아니다 
  • 위에서 말한 Ubuntu, CentOS, SuLinux는 정확히 말하면 리눅스 배포판(Linux distribution)이다. 
  • 리눅스 배포판이 먼가? 말 그대로 리눅스에서 분산? 나눠진? 분리된? 운영체제들이다 
    리눅스 커널을 기반으로 동작하고 GNU 소프트웨어 및 여러 가지 자유 소프트웨어로 구성된 운영체제이다 
    GNU Software? - "그누"라고도 부르며 운영 체제의 하나이자 컴퓨터 소프트웨어의 모음집이다. 

2. 리눅스 배포판의 종류 

  • 리눅스 배포판 나무위키에 나와있는 리눅스의 발전과정이다. 
  • 보면 생각과 다르게 매우 엄청 많은 수의 운영체제, 갈래, 가지들이 있다. 
  • 대표적인 리눅스 배포판의 시조?는 데비안(Debian), 레드햇(Redhat), 안드로이드(Android) 가있다.
    MacOS는 UNIX이다
  • 그럼 다음 궁금증은 데비안에는 어떤게어떤 게 있고 레드햇에는 어떤 게 있냐일 것이다 
    또는 우분투는 어딧지? CentOS는 어딨지? 가 될 것이다. 
  • 그다음 궁금증은 데비안? 레드햇? 안드로이드가 어떻게 다르냐? 가 될 것이다 

3. 우분투와 CentOS는 어느 배포판에 속하나? 

  • 우분투는 데비안계열 배포판에서 가장 유명하다고 할 수 있다. 
  • 데비안 계열에서 들어봤을 법한 운영체제는 글쓴이 기준으로는 라즈베리파이OS와 우분투 밖에 없는 거 같다.
  • 레드햇 계열은 대표적으로 CentOS와 페도라가 있다. 
    CentOS는 무료 버전이라 많이 들어보았겠지만 페도라는 글쓴이도 사용해보지는 않았다. VirtualBox에서 가끔 아 저런 거도 있구나 라고 보기만 했던 기억이 있다. 

3. 데비안과 레드햇의 차이점 

  • 데비안과 레드햇은 기본적으로 몇 가지 명령어가 다르다 대표적으로 다른 명령어는 설치 - apt, yum, 패키지 - dpkg, rpm
  • yum, apt 
    처음 리눅스를 가지고 계발을 했을 때 가장 자주한 실수가 구글 검색에 "리눅스 XXX 설치"라고 검색한 것이다. 
    계속 우분투에서 YUM이 안된다고 YUM은 어떻게 설치하는지 알아봤던 기억이 있다. 물론 우분투에 yum을 설치할 수 있지만 저장소가 업데이트가 자동으로 되지 않아 가능하면 사용하지 않는 것이 좋은 거 같다 
  • dpkg, rpm ( RedHat Package Manager)
    윈도를 예로 들면 설치 exe파일이라고 생각하면 된다 위의 명령어를 통해 다운로드한 패키지 파일을 설치할 수 있다. 
    가끔 우분투에서 rpm확장자로 된 설치 파일을 실행해야 할 수도 있는데 그때는 Alien을 install 한 후 파일을 변환하기도 한다 
    확장자는 dpkg - .deb    rpm - .rpm이다 

4. 리눅스의 기본 명령어 

  • cd - change directory - 경로를 이동할 때 사용한다 
  • pwd - print working directory - 현재 디렉터리(폴더)의 경로를 출력한다 
  • ls - list - 디렉토리 내에 있는 파일 또는 폴더의 목록을 출력한다 
  • cp - copy - 파일 또는 디렉터리를 복사한다 
  • mv - move - 파일 또는 디렉터리를 이동한다 ( 복사 후 삭제를 함으로 cp보다 오래걸림, 이름 변경할 때도 사용함)
  • mkdir - make directory - 디렉토리를 생성한다 
  • rm - remove - 삭제 
  • cat - concatenate - 단순 파일의 내용을 출력할 때 또는 파일 여러 개를 합쳐서 하나의 파일로 만들 때 
  • find - find - 특정 파일이나 디렉터리 검색
  • ps - process - 실행 중인 프로세스 출력 \
  • kill - kill - 대상 하는 프로세스 중지 
  • service - 시스템 전체 서비스에 대한 명령 -서비스 재시작, 시작, 중지 등등 
  • shutdown - 시스템 종료
  • top -  시스템의 상태 확인 - 메모리, GPU, Process
  • wget - URL에서 파일 다운로드
  • grep - 정규식 터미널 명령 - 하나의 명령어에 부가적으로 사용해서 특정 파일들만 추출 
  • clear - 터미널 화면 출력 지우기 
  • echo - 터미널 콘솔 창에 특정 텍스트 출력 
  • sudo - 관리자 권한으로 실행 
  • chmod - 권한 변경 777, 666, .... 000 
  • tar - 압축파일 관련 압축해제, 압축하기
  • df - 디스크 확인 

'IT기초' 카테고리의 다른 글

(3) Process, Thread, Multi-thread, Multi-process  (0) 2022.11.09
(2) CPU Instruction Cycle  (0) 2022.11.09
[네트워크] 개발자용 네트워크 기초  (0) 2021.09.28

IT는 Information Technology이다 

정보기술에는 전기통신, 방송, 컴퓨팅, 통신망 등이 속해있다

 

이번 장에서는 개발을 하기 전 필수로 알아야 하는 네트워크 기초 중 OSI 7계 층중 계발에 매우 자주 사용되는 2~4, 7 계층에 대해서 이야기를 나누어 보겠다 

 

소프트웨어에 관심이 있는 사람은 3계층 부터 보기 바란다.

1~2 계층은 소프트웨어 개발자가 작업할 영역이 없다시피 한다 

 

OSI 7 Layer 

출처 : 나무위키

위의 표는 매우 좋은 자료지만 처음 공부를 시작한다면 뭔가 할 것이다. 

 

 

1. 물리계층( Physical Layer)

UTP 케이블과 RJ45 커넥터

  • 위의 사진을 보면 처음 보는 것이라고 생각할 수 있다. 하지만 모든 PC에 인터넷을 하고 싶으면 연결하는 그 선이다
  • 1 계층은 전기적 특성을 이용해 신호를 전송하는 역할을 한다 
  • 전송을 주고받을 미디어 타입을 설명한다. - UTP(10BASE-T, 100BASE-TX .....)로 받을 거냐 HDMI로 받을거냐 등등~
  • 하드웨어 개발을 할 때는 해당 사항에 대해서 생각을 해야 하지만 그렇게 심각하게 고려할 필요는 없다 복잡하다
    (문제가 생기면 생각하는 편)
  • 주로 PC에서 사용되는 UTP(비차폐 꼬임 쌍선 : Unshielded Twisted Pair cable)의 이름은 말 그대로 차폐되지 않은 꼬인 두 가닥의 선을 의미한다 

출처 : 나무위키

  • 차폐선은 위와 같이 선 주변에 주로 금속으로 된 껍질로 감싸고 있다 

 

2. 데이터 링크 계층 ( Data link layer )

출처 : 나무위키

  • 위 사진처럼 우리가 많이 접한 저런 랜카드(NIC : Network Interface card)가 1,2 계층에 해당한다 
  • UTP 케이블을 연결할 때 어떻게 하는가 위에 RJ45에 해당하는 부분을 삽입한다. 
  • 그렇다 RJ45를 연결하는 부분은 1 계층이고 그 뒤에 딱 봐도 회로로 되어있는 것은 2 계층이다 
  • 여기부터가 인터넷의 시작인 이더넷이 있다 ( 이더넷 : 802.3, Wifi : 802.11 )
  • 각자 공유기를 살 때 제품 상세 설명을 보면 뒤에 802.11ac, 802.11b, 등이 쓰여있다 해당 규격이 와이파이의 규격을 이야기해준다 
  • 자신의 와이파이가 좋은 것인지 보고 싶으면 https://ko.wikipedia.org/wiki/IEEE_802.11 를 참고하기 바란다 
  • 2 계층에는 그 유명한 MAC( Media Access Control ) 주소가 있다. 해당 MAC 주소를 이용하여 주변에 있는 다른 기기와의 통신이 가능하다 MAC을 단순하게 아파트에 몇 호인지를 나타낸다고 생각해도 된다 
  • MAC은 총 48비트로 구성되어있고 이중 첫 24비트는 해당 제품을 만든 회사의 고유 번호이고 그 뒤는 해당 랜카드의 고유 번호이다. MAC 주소는 오직 하나만 존재한다 라고 말해야 하지만 같게 만들수도 있다

 

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

IPv4 의 2진수, 10진수 표기

  • 위의 사진은 IPv4의 경우이다 현재 보통의 PC에는 IPv4를 사용하고 있고 스마트폰의 경우 IPv6를 이용하고 있다 

IPv6의 16진수 표기 출처 : 나무위키

 

  • IPv6는 보통 16진수로 표현한다 IPv4와 같이 표기하기에는 너무 길어진다 무려 2의 128 제곱을 표현해야 한다 
  • 위를 보면 중간에 : 0000 :인 경우 생략하는 것을 볼 수 있다 너무 짧다고 당황하지 말자 
  • IPv6가 생긴 이유는 IPv4가 유한하기 때문이다 2의 32 제곱의 경우 대략 43억의 주소를 가질 수 있기 때문에 요즘같이 한 명당 3개 이상의 IP주소를 가지는 시대에는 IP주소는 부족해질 수밖에 없다 생각해 거의 무한에 가까운 IPv6를 만들었다 
  • 그런데 생각해보면 아직 IPv4를 이용하고 있는데 그게 가능한 이유는 여러 가지 IP를 대신하여 사용할 방법이 있기 때문이다 대표적으로 NAT( Network Address translation ) 이 있다 모두가 사용해봤다 안 해봤다면 거짓말이다 
  • NAT ( Network Address translation ) 
    - 웬만한 공유기(라우터)가 모두 사용하고 있다 
    - 대표적인 공유기로 예를 들겠다 IPtime의 공유기의 경우 192.168.0.1의 게이트웨이를 사용하며 DHCP(Dynamic Host Configuration Protocol )을 이용하여 내부 서브넷에게 192.168.0.0/24의 주소를 뿌려주게 된다 
    - 서브넷이라는 말이 나왔다 서브넷은 해당 IP에서 어디까지가 네트워크의 주소인지를 뜻한다  

    - 서브넷이 나온 이유는 IP의 문제점 때문이다. IP는 자신이 어디로 가야 할지 길을 찾기 위해 같은 네트워크의 모든 End point에게 자신이 찾고 있는 주소를 broadcasting 한다 하지만 만약 하나의 네트워크에 매우 매우 많은 Endpoint가 있다면 모든 endpoint로 Ack가 전송되어 서버에 과부하가 생길 수 있다. 그렇기 때문에 Subnet(Sub network)을 나누어 broadcasting의 범위를 제한하는 것이다. ( 여기까지가 내 네트워크니까 여기서 찾아 - 아파트에서 동을 생각하면 좋다 )
    - 그럼 여기서 너희 집도 192.168.0.1이고 내 집도 192.168.0.1이네?라고 생각이 될 수 있다 여기서 Public IP와 Private IP에 대해서 알게 된다 
    출처 : 나무위키
    - 위의 사진에 설명돼있듯이 IETF에서 정해놓은 규칙에 따라 해당 범위의 IP는 Private IP - 사설망이 되었다 
    - Private IP는 인터넷으로 나가지 못하고 차단된다 
    - 공유기에서는 들어온 공인 아이피를 사설 아이피로 바꾸고 다시 사설 아이피에서 공인 아이피로 바꾸는 작업을 진행한다 

 

4. 전송 계층 ( Transport Layer )

  • 전송계층은 protocol의 영역이고 TCP와 UDP가 대부분을 차지하고 인터넷에서 주로 사용되는 TCP에 대해서 짧게 설명하겠다 
  • TCP ( Transmission Control Protocol )
    - IP의 핵심 프로토콜 중 하나로 TCP/IP라고 많이 부른다 
    - 연결 지향형으로 3 way hand shaking을 통해 사용자를 인증한다 3 way hand shaking은 3번의 악수를 통해 서로 믿는다는 의미인데 해당 사항에 대해서 자세히 알고 싶다면 책을 보고 깊게 공부하는 것을 추천한다 
  • UDP ( User Datagram Protocol ) 
    - 위의 TCP와 반대되는 성격으로 비연결 지향형으로 연결이 되지 않아도 계속해서 패킷을 전송을 한다 

 

7. 응용 계층 ( Application Layer )

ssh

  • 개발자에게 아주 중요한 부분이고 Port에 대해서 설명하겠다
  • TCP와 UDP는 다음 자신의 목적지인 port 정보에 대해서 가지고 있다 
  • port는 Well-Known ports와 Registered ports, Dynamic Ports가 있다 
    - Well-Known ports ( 0 ~ 1023 )는 말 그대로 잘 알려진 포트이다 이미 사용하고 있을 확률이 높은 port로 다른 프로그램에서 해당 범위의 포트를 사용하는 것은 추천하지 않는다. 물론 다른 시스템이 사용하고 있다고 해서 못 사용하는 것은 아니다 단지 충돌이 일어날 수 있기 때문에 잘 사용하지 않고, default로 설정돼있더라도 보안의 문제 때문에 변경하여 사용하는 경우가 많다. 어떤 것이 있는지 자세히 보고 싶다면 https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers 를 참고하기 바란다
    - Registered ports ( 1024 ~ 49151 )는 위의 Well-Known ports와 같지만 대부분 잘 알려진 사용법이 없는 포트들이다. 대표적으로 3306 - MySQL, 3389- 원격 접속, 8080 - HTTP 등이 있다 
    - Dynamic ports ( 49152 ~  65535 ) 는 뭐로든 이용 가능한 포트이다. 딱히 대표적인 포트가 없다 사용하고 싶은 대로 사용해도 되지만 숫자가 길어 글쓴이의 경우 잘 사용하지 않는다. 

 

 

'IT기초' 카테고리의 다른 글

(3) Process, Thread, Multi-thread, Multi-process  (0) 2022.11.09
(2) CPU Instruction Cycle  (0) 2022.11.09
(1) Linux 기초 - 리눅스란?  (0) 2021.11.22

+ Recent posts