<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>나의 기록</title>
    <link>https://thisisme0101.tistory.com/</link>
    <description>무엇이든 시작이라도 해보기</description>
    <language>ko</language>
    <pubDate>Mon, 18 May 2026 11:07:51 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>도도히히</managingEditor>
    <image>
      <title>나의 기록</title>
      <url>https://tistory1.daumcdn.net/tistory/5442824/attach/fc5ece6ab4294fae959669f50cafcfea</url>
      <link>https://thisisme0101.tistory.com</link>
    </image>
    <item>
      <title>[리눅스 기초] 12 쉘 스크립트(셸 스크립트) (1)</title>
      <link>https://thisisme0101.tistory.com/23</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;셸의 기능과 종류&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;셸의 기능&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;셸은 사용자와 커널 사이에서 중계자 역할을 수행하는 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;셸의 종류&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;본 셸 (Bourne shell)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순하고 처리 속도가 빠른 이유로 많이 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 관리작업을 수행할 때 많은 스크립트는 본 셸을 기반으로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh 명령 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C 셸 (C shell)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 셸의 기능 확장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에일리어스, 히스토리와 같은 사용자 편의 기능이 추가되어 제공됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셸 스크립트 작성의 문법 형식이 C 언어와 비슷함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기가 커지고 처리 속도가 느린 단점 등의 이유로 배시 셸에 밀림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;csh 명령 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;콘 셸 (Korn shell)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 셸과의 호환성 및 편의 기능을 제공하면서 속도가 빠름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우분투 리눅스에서는 별도로 콘 셸을 설치하여 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ksh 명령 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배시 셸 (bash shell)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 셸을 기반으로 개발된 셸, 본 셸과의 호환성을 유지하면서 C 셸, 콘 셸의 편리한 기능까지 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPL(General Public License)을 따르는 공개 소프트웨어, 리눅스의 기본 셸로 제공 (우분투 리눅스에서도 O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bash 명령 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대시 셸 (dash shell)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 셀을 기반으로 개발됨, 포직스(POSIX) 표준을 준수하여 보다 작은 크기로 개발된 셸&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부팅 시 셸 스크립트를 빠르게 실행시키며, 파일 크기가 작고 신뢰성이 높아 우분투 6.10 버전부터는 대시 셸을 시스템 기본 셸로 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;셸 스크립트 환경 변수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배시 셸의 주요한 환경변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수 의미 환경변수 의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;환경변수&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;td&gt;환경변수&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HOME&lt;/td&gt;
&lt;td&gt;현재 사용자의 홈 디렉터리&lt;/td&gt;
&lt;td&gt;PATH&lt;/td&gt;
&lt;td&gt;실행 파일 찾는 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LANG&lt;/td&gt;
&lt;td&gt;기본적으로 지원되는 언어&lt;/td&gt;
&lt;td&gt;PWD&lt;/td&gt;
&lt;td&gt;사용자의 디렉터리 위치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TERM&lt;/td&gt;
&lt;td&gt;로그인 터미널 타입&lt;/td&gt;
&lt;td&gt;SHELL&lt;/td&gt;
&lt;td&gt;로그인에서 사용하는 셸&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USER&lt;/td&gt;
&lt;td&gt;현재 사용자의 이름&lt;/td&gt;
&lt;td&gt;DISPLAY&lt;/td&gt;
&lt;td&gt;X 디스플레이 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COLUMNS&lt;/td&gt;
&lt;td&gt;현재 터미널의 컬럼 수&lt;/td&gt;
&lt;td&gt;LINES&lt;/td&gt;
&lt;td&gt;현재 터미널 라인 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PS1&lt;/td&gt;
&lt;td&gt;1차 명령 프롬프트 변수&lt;/td&gt;
&lt;td&gt;PS2&lt;/td&gt;
&lt;td&gt;2차 명령 프롬프트(&amp;gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BASH&lt;/td&gt;
&lt;td&gt;bash 셸의 경로&lt;/td&gt;
&lt;td&gt;BASH_VERSION&lt;/td&gt;
&lt;td&gt;bash 버전&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HISTFILE&lt;/td&gt;
&lt;td&gt;히스토리 파일의 경로&lt;/td&gt;
&lt;td&gt;HISTSIZE&lt;/td&gt;
&lt;td&gt;히스토리 파일에 저장 개수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HOSTNAME&lt;/td&gt;
&lt;td&gt;호스트 이름&lt;/td&gt;
&lt;td&gt;USERNAME&lt;/td&gt;
&lt;td&gt;현재 사용자 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LOGNAME&lt;/td&gt;
&lt;td&gt;로그인 이름&lt;/td&gt;
&lt;td&gt;LS_COLORS&lt;/td&gt;
&lt;td&gt;ls 명령의 확장자 색상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MAIL&lt;/td&gt;
&lt;td&gt;메일을 보관하는 경로&lt;/td&gt;
&lt;td&gt;OSTYPE&lt;/td&gt;
&lt;td&gt;운영체제 타입&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 변수를 출력할 때 $를 붙여야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo $HOME : 사용자의 홈 디렉터리 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo $BASH_VERSION : bash 버전 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;셸 변수 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 지정한 이름으로 설정할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=을 사용하여 선언할 때 변수 이름과 문자열 사이에 공백이 존재해서는 안 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대/소문자 엄격하게 구별&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;변수 이름=문자열&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) INSA=Hello&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo INSA : 변수명이 아닌 문자열로 취급하여 INSA가 출력됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo $INSA : 변수에 대입한 문자열인 Hello가 출력됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;환경변수 설정 명령 : export&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 셸 변수를 정의하고 export 명령을 사용하여 설정된 환경변수를 변경할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;export 환경변수=값&amp;rsquo; 과 같이 선언할 수 O&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;export [옵션] [셸 변수]&lt;/b&gt; : 지정한 셸 변수를 환경변수로 변경하여 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-n : 환경변수를 셸 변수로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 환경변수 확인 : env | grep 변수명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;export INSA : 셸 변수 INSA를 환경변수로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;export SPACE=key : 셸 변수를 선언하면서 곧바로 환경변수로 한번에 등록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;환경변수를 셸 변수로 변경 : export -n&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수로 등록했던 셸 변수를 다시 셸 변수로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;export -n 환경변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) export -n SPACE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;셸 변수 해제 : unset&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 정의된 셸 변수를 해제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;unset 변수명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unset을 하면 echo $변수명 을 해도 아무 값이 출력되지 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 12-01&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;셸 변수 DEPT를 선언하고 문자열 database를 대입하기&lt;/li&gt;
&lt;li&gt;DEPT 변수에 대입된 문자열 출력하기&lt;/li&gt;
&lt;li&gt;DEPT 변수를 환경변수로 전환하기&lt;/li&gt;
&lt;li&gt;환경변수에 등록된 정보 출력하기&lt;/li&gt;
&lt;li&gt;환경변수로 전환된 DEPT 변수를 다시 셸 변수로 전환하기&lt;/li&gt;
&lt;li&gt;등록된 DEPT 셸 변수 해제하기&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ DEPT=database
$ echo $DEPT
$ export DEPT
$ env (혹은 쉽게 찾기 위해 env | grep DEPT)
$ export -n DEPT
$ unset DEPT
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;셸 스크립트의 특징&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;셸 출력 명령&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공통 셸 출력 명령 : echo&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 셸 스크립트 프로그래밍에서 공통으로 사용할 수 있는 출력 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;echo [옵션] [문자열]&lt;/b&gt; : 화면에 한 줄의 문자열을 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-n : 문자열 중간에 선언하게 되면 선언한 위치에서 줄 바꿈을 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;new line을 넣지 말아달라는 의미임 (아래 예시 참고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-n을 어느 위치에 선언하느냐에 따라 출력결과가 다르게 나타날 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 사이에 공백이 존재할 경우 문자열을 큰따옴표로 묶어줘야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) echo &amp;ldquo;I Love Ubuntu&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo -n Nice : 옵션 지정으로 프롬프트 전에 문자열이 출력됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NIce유저명@ubuntu:~$ &amp;larr; 이런식으로 출력됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력형식 지정 명령 : printf&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력형식을 %d 지시자와 \n 줄바꿈 문자 등 C 언어에서 사용하는 출력함수인 printf() 함수의 형식을 지정하여 출력할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;printf [옵션] [문자열]&lt;/b&gt; : 출력형식을 지정하여 문자열을 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%d, \n 등 C언어의 printf()함수 형식을 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;printf SPACE : 프롬프트 앞에 문자열이 출력됨 (SPACE유저명@ubuntu:~$)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;printf &amp;ldquo;I Love \n Ubuntu&amp;rdquo; : Ubuntu를 다음 행으로 줄을 바꿔 출력 (두번째 줄: Ubuntu유저명@ubuntu:~$)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;printf &amp;ldquo;%d + %d = %d \n&amp;rdquo; 30 50 80 : 30 + 50 = 80 출력&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;셸 스크립트 프로그래밍&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;셸 스크립트 작성과 실행&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gedit을 사용하여 셸 스크립트 프로그래밍 수행&lt;/li&gt;
&lt;li&gt;/sh_test.d : 셸 스크립트 파일을 저장할 디렉터리 생성 (디렉터리 명은 자유)&lt;/li&gt;
&lt;li&gt;.sh : 셸 스크립트 파일임을 쉽게 구별하기 위해 확장자 선언 (확장자 선언은 자유)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;셸 스크립트 작성 후 sh 명령으로 실행하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gedit 또는 vi 에디터를 사용하여 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo mkdir /sh_test.d&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd /sh_test.d&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo gedit &lt;a href=&quot;http://myname.sh&quot;&gt;myname.sh&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

echo &quot; Name Print &quot;
echo &quot;&amp;gt;&amp;gt; Connect Name : &quot; $USERNAME

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#! : Shebang(셔뱅)이라고 함, 인터프리터 경로를 나타냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#! /bin/sh : bash를 사용하는 의미 (생략하면 안 됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo : 문자열 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$USERNAME : 현재 시스템에 접속된 사용자 이름을 출력하는 환경변수 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exit 0 : 종료 코드 (0은 성공 의미)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh &lt;a href=&quot;http://myname.sh&quot;&gt;myname.sh&lt;/a&gt; : 셸 스크립트 파일 실행&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;변수 선언&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수에 처음 값이 할당되면 변수는 자동으로 생성되므로 따로 변수를 선언하지 않음&lt;/li&gt;
&lt;li&gt;셸에서 사용하는 변수는 모두 문자열(String)으로 취급되므로 숫자 또한 문자열로 처리됨&lt;/li&gt;
&lt;li&gt;알파벳 대/소문자를 엄격하게 구별하며 변수의 값을 대입할 때는 &amp;lsquo;=&amp;rsquo; 의 좌우에 공백이 존재해서는 안 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var1 = HI &amp;larr; 오류: &amp;lsquo;=&amp;rsquo; 좌우에 공백 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var2=good&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var3=Nice day &amp;larr; 오류: 두 개의 문자열인 경우 큰따옴표로 묶어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var4=&amp;rdquo;Good morning&amp;rdquo;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;var5=88+95 &amp;larr; 오류는 없지만 연산은 안 됨(모두 문자열로 취급됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대입하는 값 사이에 공백이 있을 경우 반드시 큰따옴표로 묶기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수에 값을 대입할 경우 이를 변수로 받기 위한 방법은 &amp;lsquo;$변수명&amp;rsquo; 과 같이 변수명 앞에 $를 붙여주기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(변수임을 알리려고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수의 값에 공백 존재하지 않으면 $변수명, &amp;ldquo;$변수명&amp;rdquo; 상관 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공백이 존재하면 무조건 &amp;ldquo;$변수명&amp;rdquo; 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;변수의 입력과 출력&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd /sh_test.d&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo gedit &lt;a href=&quot;http://inout.sh&quot;&gt;inout.sh&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

echo &quot; Q. Input : &quot;
read input_string
echo &quot; A. Output : $input_string &quot;

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;read input_string : 키보드로 입력한 값을 변수 input_string에 저장하는 read 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;숫자 계산&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드 expr을 사용해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역따옴표(`)와 expr을 공백 없이 붙여서 사용해야 함, 역따옴표로 expr 연산식과 같이 시작과 끝을 묶어줘야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 연산식에서 괄호를 사용하려면 괄호 앞에 \를 반드시 붙여줘야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사칙연산(+, -, , /) 중에서 예외적으로 곱셈 연산() 앞에도 반드시 \를 붙여줘야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo gedit &lt;a href=&quot;http://arithmetic.sh&quot;&gt;arithmetic.sh&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

echo &quot; &amp;gt;&amp;gt; first : &quot;
read a
echo &quot; &amp;gt;&amp;gt; second : &quot;
read b
echo &quot; &amp;gt;&amp;gt; a = $a, b = $b &quot;

add=`expr $a + $b`
gob=`expr $a \\* $b`
na=`expr $a / $b`
avg=`expr $add / 2`
echo &quot; a + b = $add \\n a * b = $gob \\n a / b = $na \\n (a+b)/2 = $avg &quot;

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh &lt;a href=&quot;http://arithmetic.sh&quot;&gt;arithmetic.sh&lt;/a&gt; : 셸 스크립트 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파라미터 변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신이 실행한 명령어의 파라미터(매개변수)를 의미함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$0, $1, $2, &amp;hellip; 등과 같이 실행하는 명령의 부분을 각각 하나씩 변수로 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) dnf -y install xinetd 명령을 실행한다고 가정할 때 파라미터 변수&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 82.907%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;width: 15.2325%;&quot;&gt;수행할 명령&lt;/td&gt;
&lt;td style=&quot;width: 16.0466%;&quot;&gt;파라미터1&lt;/td&gt;
&lt;td style=&quot;width: 16.5116%;&quot;&gt;파라미터2&lt;/td&gt;
&lt;td style=&quot;width: 17.4419%;&quot;&gt;파라미터3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;명령어&lt;/td&gt;
&lt;td style=&quot;width: 15.2325%;&quot;&gt;dnf&lt;/td&gt;
&lt;td style=&quot;width: 16.0466%;&quot;&gt;-y&lt;/td&gt;
&lt;td style=&quot;width: 16.5116%;&quot;&gt;install&lt;/td&gt;
&lt;td style=&quot;width: 17.4419%;&quot;&gt;xinetd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;파라미터 변수&lt;/td&gt;
&lt;td style=&quot;width: 15.2325%;&quot;&gt;$0&lt;/td&gt;
&lt;td style=&quot;width: 16.0466%;&quot;&gt;$1&lt;/td&gt;
&lt;td style=&quot;width: 16.5116%;&quot;&gt;$2&lt;/td&gt;
&lt;td style=&quot;width: 17.4419%;&quot;&gt;$3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;표현 방법&lt;/td&gt;
&lt;td style=&quot;width: 15.2325%;&quot;&gt;$0 &amp;larr; dnf&lt;/td&gt;
&lt;td style=&quot;width: 16.0466%;&quot;&gt;$1 &amp;larr; -y&lt;/td&gt;
&lt;td style=&quot;width: 16.5116%;&quot;&gt;$2 &amp;larr; install&lt;/td&gt;
&lt;td style=&quot;width: 17.4419%;&quot;&gt;$3 &amp;larr; xinetd&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo gedit &lt;a href=&quot;http://mapping.sh&quot;&gt;mapping.sh&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

echo &quot; &amp;gt;&amp;gt; One : $0 &quot;
echo &quot; &amp;gt;&amp;gt; Two : $1 &quot;
echo &quot; &amp;gt;&amp;gt; Three : $2 &quot;
echo &quot; &amp;gt;&amp;gt; Total : $* &quot;

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo &amp;ldquo; &amp;gt;&amp;gt; Total : $* &amp;ldquo; : 전체 파라미터 출력 (*는 전체를 의미)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh &lt;a href=&quot;http://mapping.sh&quot;&gt;mapping.sh&lt;/a&gt; 35 87 text_string&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. text string 처럼 공백을 넣고 싶을 때 &amp;ldquo;text string&amp;rdquo; 입력, 큰따옴표 없이 입력하면 별개의 단어로 취급&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 12-02&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;셸 스크립트 프로그램 test_1302.sh 작성하기&lt;/li&gt;
&lt;li&gt;두 개의 변수 su1, su2를 선언하기&lt;/li&gt;
&lt;li&gt;su1 변수에 키보드로 23을 입력하여 저장하기&lt;/li&gt;
&lt;li&gt;su2 변수에 키보드로 56을 입력하여 저장하기&lt;/li&gt;
&lt;li&gt;두 수의 곱을 변수 gob에 저장하기&lt;/li&gt;
&lt;li&gt;키보드로 입력받은 값 출력하기&lt;/li&gt;
&lt;li&gt;두 수의 곱셈 연산과 결과값 출력하기&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;$ gedit test_1302.sh

//셸 스크립트
#! /bin/sh
echo &quot;1. 첫 번째 정수 입력&quot;
read su1
echo &quot;2. 두 번째 정수 입력&quot;
read su2
echo &quot;&amp;gt;&amp;gt; 두 수의 곱셈연산 결과&quot;
gob=`expr $su1 \\* $su2`
echo &quot; $su1 * $su2 = $gob &quot;
exit 0

$ sh test_1302.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조건문과 관계 연산자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 if 문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 조건이 참일 경우에만 수행하는 분기문으로 거짓일 경우에는 해당 명령을 수행하지 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건문을 묶는 대괄호 [] 안에 조건식을 선언할 때 각 단어와 연산자 사이에는 반드시 공백이 존재해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 단일 조건 (if ~ then ~ fi)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if [ 조건식 ]; then&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fi&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if [ 조건식 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;then&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fi&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 이분 조건 (if ~ then ~ else ~ fi)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if [ 조건식1 ]; then&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;else&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fi&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 1번처럼 ;를 쓰지 않고 then을 다음 줄로 보낼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 다중 조건&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if [ 조건식1 ]; then&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;elif [ 조건식2 ]; then&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;else&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fi&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이때 elif는 여러 개 올 수 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 if문 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo gedit &lt;a href=&quot;http://basicif.sh&quot;&gt;basicif.sh&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

if [ &quot;space&quot; = &quot;space&quot; ] 
then
	echo &quot;&amp;gt;&amp;gt; compare : space = space ?? &quot;
	echo &quot;&amp;gt;&amp;gt; result : True &quot;
fi

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh &lt;a href=&quot;http://basicif.sh&quot;&gt;basicif.sh&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo &amp;ldquo;&amp;gt;&amp;gt; compare : space = space ?? &amp;ldquo; : 여기서 물음표는 특별한 의미 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;if~else문 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo gedit ifelse_01.sh&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

echo &quot;&amp;gt;&amp;gt; compare : space != space ?? &quot;
if [ &quot;space&quot; != &quot;space&quot; ]
then
	echo &quot;&amp;gt;&amp;gt; result : True &quot;
else
	echo &quot;&amp;gt;&amp;gt; result : False &quot; 
fi

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh ifelse_01.sh&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;False가 출력될 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비교 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 비교 연산자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 84.0698%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.95349%;&quot;&gt;연산자&lt;/td&gt;
&lt;td style=&quot;width: 18.8372%;&quot;&gt;의미&lt;/td&gt;
&lt;td style=&quot;width: 25.9303%;&quot;&gt;사용 예&lt;/td&gt;
&lt;td style=&quot;width: 30.3488%;&quot;&gt;결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.95349%;&quot;&gt;=&lt;/td&gt;
&lt;td style=&quot;width: 18.8372%;&quot;&gt;같음&lt;/td&gt;
&lt;td style=&quot;width: 25.9303%;&quot;&gt;&amp;ldquo;문자열1&amp;rdquo; = &amp;ldquo;문자열2&amp;rdquo;&lt;/td&gt;
&lt;td style=&quot;width: 30.3488%;&quot;&gt;두 문자열이 같으면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.95349%;&quot;&gt;!=&lt;/td&gt;
&lt;td style=&quot;width: 18.8372%;&quot;&gt;같지 않음&lt;/td&gt;
&lt;td style=&quot;width: 25.9303%;&quot;&gt;&amp;ldquo;문자열1&amp;rdquo; != &amp;ldquo;문자열2&amp;rdquo;&lt;/td&gt;
&lt;td style=&quot;width: 30.3488%;&quot;&gt;두 문자열이 같지 않으면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.95349%;&quot;&gt;-n&lt;/td&gt;
&lt;td style=&quot;width: 18.8372%;&quot;&gt;Null이 아닌 값&lt;/td&gt;
&lt;td style=&quot;width: 25.9303%;&quot;&gt;-n &amp;ldquo;문자열&amp;rdquo;&lt;/td&gt;
&lt;td style=&quot;width: 30.3488%;&quot;&gt;문자열이 빈 문자열이 아니면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.95349%;&quot;&gt;-z&lt;/td&gt;
&lt;td style=&quot;width: 18.8372%;&quot;&gt;Null 값&lt;/td&gt;
&lt;td style=&quot;width: 25.9303%;&quot;&gt;-z &amp;ldquo;문자열&amp;rdquo;&lt;/td&gt;
&lt;td style=&quot;width: 30.3488%;&quot;&gt;문자열이 빈 문자열이면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;산술 비교 연산자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 88.1395%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.4651%;&quot;&gt;연산자&lt;/td&gt;
&lt;td style=&quot;width: 21.5116%;&quot;&gt;의미&lt;/td&gt;
&lt;td style=&quot;width: 20.8139%;&quot;&gt;사용 예&lt;/td&gt;
&lt;td style=&quot;width: 35.2326%;&quot;&gt;결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.4651%;&quot;&gt;-eq&lt;/td&gt;
&lt;td style=&quot;width: 21.5116%;&quot;&gt;같음&lt;/td&gt;
&lt;td style=&quot;width: 20.8139%;&quot;&gt;변수1 -eq 변수2&lt;/td&gt;
&lt;td style=&quot;width: 35.2326%;&quot;&gt;변수1과 변수2가 같으면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.4651%;&quot;&gt;-ne&lt;/td&gt;
&lt;td style=&quot;width: 21.5116%;&quot;&gt;같지 않음&lt;/td&gt;
&lt;td style=&quot;width: 20.8139%;&quot;&gt;변수1 -ne 변수2&lt;/td&gt;
&lt;td style=&quot;width: 35.2326%;&quot;&gt;변수1과 변수2가 같지 않으면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.4651%;&quot;&gt;-gt&lt;/td&gt;
&lt;td style=&quot;width: 21.5116%;&quot;&gt;큼 (초과)&lt;/td&gt;
&lt;td style=&quot;width: 20.8139%;&quot;&gt;변수1 -gt 변수2&lt;/td&gt;
&lt;td style=&quot;width: 35.2326%;&quot;&gt;변수1이 변수2보다 크면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.4651%;&quot;&gt;-ge&lt;/td&gt;
&lt;td style=&quot;width: 21.5116%;&quot;&gt;크거나 같음 (이상)&lt;/td&gt;
&lt;td style=&quot;width: 20.8139%;&quot;&gt;변수1 -ge 변수2&lt;/td&gt;
&lt;td style=&quot;width: 35.2326%;&quot;&gt;변수1이 변수2보다 크거나 같으면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.4651%;&quot;&gt;-lt&lt;/td&gt;
&lt;td style=&quot;width: 21.5116%;&quot;&gt;작음 (미만)&lt;/td&gt;
&lt;td style=&quot;width: 20.8139%;&quot;&gt;변수1 -lt 변수2&lt;/td&gt;
&lt;td style=&quot;width: 35.2326%;&quot;&gt;변수1이 변수2보다 작으면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.4651%;&quot;&gt;-le&lt;/td&gt;
&lt;td style=&quot;width: 21.5116%;&quot;&gt;작거나 같음 (이하)&lt;/td&gt;
&lt;td style=&quot;width: 20.8139%;&quot;&gt;변수1 -le 변수2&lt;/td&gt;
&lt;td style=&quot;width: 35.2326%;&quot;&gt;변수1이 변수2보다 작거나 같으면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.4651%;&quot;&gt;!&lt;/td&gt;
&lt;td style=&quot;width: 21.5116%;&quot;&gt;부정&lt;/td&gt;
&lt;td style=&quot;width: 20.8139%;&quot;&gt;!변수1&lt;/td&gt;
&lt;td style=&quot;width: 35.2326%;&quot;&gt;변수1이 아니면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo gedit ifelse_02.sh&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

echo &quot; &amp;gt;&amp;gt; compare : 300 -gt 800 ?? &quot;
if [ 300 -gt 800 ] 
then
	echo &quot; &amp;gt;&amp;gt; result : True &quot;
else
	echo &quot; &amp;gt;&amp;gt; result : False &quot;
fi

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh ifelse_02.sh&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 관련 조건&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산자 결과&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 76.1628%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0245%;&quot;&gt;연산자&lt;/td&gt;
&lt;td style=&quot;width: 57.1383%;&quot;&gt;결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0245%;&quot;&gt;-d 파일 이름&lt;/td&gt;
&lt;td style=&quot;width: 57.1383%;&quot;&gt;주어진 파일 이름이 디렉터리이면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0245%;&quot;&gt;-e 파일 이름&lt;/td&gt;
&lt;td style=&quot;width: 57.1383%;&quot;&gt;주어진 파일 이름이 존재하면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0245%;&quot;&gt;-f 파일 이름&lt;/td&gt;
&lt;td style=&quot;width: 57.1383%;&quot;&gt;주어진 파일 이름이 일반 파일이면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0245%;&quot;&gt;-g 파일 이름&lt;/td&gt;
&lt;td style=&quot;width: 57.1383%;&quot;&gt;주어진 파일 이름이 set-group-id가 설정되면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0245%;&quot;&gt;-r 파일 이름&lt;/td&gt;
&lt;td style=&quot;width: 57.1383%;&quot;&gt;주어진 파일 이름이 읽기가 가능하면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0245%;&quot;&gt;-s 파일 이름&lt;/td&gt;
&lt;td style=&quot;width: 57.1383%;&quot;&gt;주어진 파일의 크기가 0이 아니면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0245%;&quot;&gt;-u 파일 이름&lt;/td&gt;
&lt;td style=&quot;width: 57.1383%;&quot;&gt;주어진 파일 이름이 set-user-id가 설정되면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0245%;&quot;&gt;-w 파일 이름&lt;/td&gt;
&lt;td style=&quot;width: 57.1383%;&quot;&gt;주어진 파일 이름이 쓰기 가능한 상태이면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0245%;&quot;&gt;-x 파일 이름&lt;/td&gt;
&lt;td style=&quot;width: 57.1383%;&quot;&gt;주어진 파일 이름이 실행 가능한 상태이면 참&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. setuid를 하면 파일 권한에서 -rws와 같이 원래 x가 써져있을 자리에 s가 들어감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo gedit ifelse_03.sh&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

sample=/lib/systemd/system/udev.service
if [ -f $sample ]
then
	echo &quot; &amp;gt;&amp;gt; result : True &quot;
	head -3 $sample
else
	echo &quot; &amp;gt;&amp;gt; result : False &quot;
fi

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh ifelse_03.sh&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;head -3 $sample : 앞에서부터 3줄 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;case~esac 문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if~else문은 조건이 많아지게 되면 구문이 복잡해지는 단점 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if~else문은 조건을 참과 거짓으로 판별하여 참과 거짓에 해당하는 명령을 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;case~esac문은 여러 개의 조건을 펼쳐놓고 어느 조건에 해당되는지를 판별하여 명령을 수행하는 방식으로 구문 전개&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;case~esac 문법구조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;case 파라미터 또는 키보드 입력값 in&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령1;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령2;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건n)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령n;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 주어진 조건 이외의 모든 경우 실행할 명령;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;esac&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 명령 끝에 ;; 를 붙이는 이유: case문 탈출하기 위함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo gedit case_01.sh&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

echo &quot; &amp;gt;&amp;gt; season choice : Spring / Summer / Fall / Winter &quot;
case &quot;$1&quot; in
	Spring)
		echo &quot; &amp;gt;&amp;gt; choice : Spring &quot;;;
	Summer)
		echo &quot; &amp;gt;&amp;gt; choice : Summer &quot;;;
	Fall)
		echo &quot; &amp;gt;&amp;gt; choice : Fall &quot;;;
	Winter)
		echo &quot; &amp;gt;&amp;gt; choice : Winter &quot;;;
	*)
		echo &quot; No choice ~ &quot;;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh case_01.sh Spring&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh case_01.sh exit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키보드로 Yes 또는 No를 입력하거나 Y 또는 y 그리고 알파벳 n 또는 N으로 시작하는 모든 단어가 입력될 경우 해당 조건을 수행하도록 *를 함께 사용하여 조건을 선언하는 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo gedit case_02.sh&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

echo &quot; &amp;gt;&amp;gt; state choice : (Yes / No / Y / N) &quot;
read mind
case $mind in
	Yes | YES | yes | Y | y)
		echo &quot; &amp;gt;&amp;gt; choice : Yes &quot;
		echo &quot; &amp;gt;&amp;gt; result : Linux Master &quot;;;
	[nN]*)
		echo &quot; &amp;gt;&amp;gt; choice : No &quot;
		echo &quot; &amp;gt;&amp;gt; result : Good Luck~ &quot;;;
	*)
		echo &quot; &amp;gt;&amp;gt; choice error !! &quot;;;
esac

exit 0 
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh case_02.sh&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[nN]* : n또는 N으로 시작 (n, N만있어도 됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;;; 이 없을 경우 case문을 빠져나오지 않고 그 다음 줄로 커서를 이동시킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Yes | YES | yes | Y | y) : 5개 중 하나에 해당하면 됨(or 연산)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조건문에서의 관계 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- and 연산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if [ 조건1 ] &lt;b&gt;&amp;amp;&amp;amp;&lt;/b&gt; [ 조건2 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if [ 조건1 &lt;b&gt;-a&lt;/b&gt; 조건2 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- or 연산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if [ 조건1 ] &lt;b&gt;||&lt;/b&gt; [ 조건2 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if [ 조건1 &lt;b&gt;-o&lt;/b&gt; 조건2 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo gedit &lt;a href=&quot;http://ifandor.sh&quot;&gt;ifandor.sh&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

echo &quot;&amp;gt;&amp;gt; Search Name : &quot;
read file_name
if [ -f $file_name ] &amp;amp;&amp;amp; [ -s $file_name ]; then
	echo &quot;&amp;gt;&amp;gt; File Select : $file_name &quot;
	head -3 $file_name
else
	echo &quot;&amp;gt;&amp;gt; Search File : $file_name &quot;
	echo &quot;&amp;gt;&amp;gt; File not found &quot;
fi

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sh &lt;a href=&quot;http://ifandor.sh&quot;&gt;ifandor.sh&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo &amp;ldquo;&amp;gt;&amp;gt; Search Name : &amp;ldquo; 과 read file_name을 한 줄로 병합하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;read -p &amp;ldquo;Search Name : &amp;ldquo; file_name 이라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(ppt에는 없는 문제) - 일반 파일 혹은 디렉터리일 때 파일 이름 출력 (-o 옵션 이용)&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#! /bin/sh

read -p &quot;Search name: &quot; file_name

if [ -f $file_name -o -d $file_name ]; then
	echo &quot;&amp;gt;&amp;gt; File Select : $file_name &quot;
else
	echo &quot;&amp;gt;&amp;gt; Search File : $file_name &quot;
	echo &quot;&amp;gt;&amp;gt; File not found &quot;
fi

exit 0

&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 12-03&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;셸 스크립트 프로그램 test_1303.sh 작성하기&lt;/li&gt;
&lt;li&gt;명령 수행 파라미터 $1 사용하기&lt;/li&gt;
&lt;li&gt;혈액형을 알파벳 대/소문자 구별 없이 A, B, O, AB 조건으로 정하기&lt;/li&gt;
&lt;li&gt;혈액형 이외의 알파벳에 대해서는 다시 입력하기&lt;/li&gt;
&lt;li&gt;혈액형에 대해서는 출력 메시지는 &amp;ldquo;무슨 형을 선택하였습니다.&amp;rdquo;로 출력하기&lt;/li&gt;
&lt;li&gt;마지막에는 &amp;ldquo;프로그램을 종료합니다.&amp;rdquo;를 출력하기&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;$ gedit test_1303.sh

#! /bin/sh
echo &quot;&amp;gt;&amp;gt; 명령 수행 파라미터 (A, B, O, AB)&quot;

case &quot;$1&quot; in
A | a)
echo &quot;A형을 선택하였습니다.&quot; ;;
B | b)
echo &quot;B형을 선택하였습니다.&quot; ;;
O | o)
echo &quot;O형을 선택하였습니다.&quot; ;;
AB | ab)
echo &quot;AB형을 선택하였습니다.&quot; ;;
*)
echo &quot;혈액형은 알파벳 대/소문자 구별 없이 A, B, O, AB만 가능합니다.&quot; ;;
esac
echo &quot;프로그램을 종료합니다.&quot; 
exit 0

$ sh test_1303.sh
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>공부 기록/리눅스 기초</category>
      <author>도도히히</author>
      <guid isPermaLink="true">https://thisisme0101.tistory.com/23</guid>
      <comments>https://thisisme0101.tistory.com/23#entry23comment</comments>
      <pubDate>Sat, 17 Jan 2026 14:49:15 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 기초] 11 소프트웨어 관리</title>
      <link>https://thisisme0101.tistory.com/22</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;패키지 설치 Overview&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패키지&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 설치 후 바로 실행할 수 있는 설치 파일&lt;/li&gt;
&lt;li&gt;확장명은 *.deb&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://kr.archive.ubuntu.com/ubuntu/pool&quot;&gt;kr.archive.ubuntu.com/ubuntu/pool&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dpkg&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우분투에서 패키지(프로그램)를 설치할 때 많이 사용되던 명령어&lt;/li&gt;
&lt;li&gt;apt-get이 나오기 전에 주로 씀&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;apt-get&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dpkg의 확장 개념&lt;/li&gt;
&lt;li&gt;dpkg 기능이 포함되어 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의존성이 있는 deb 파일 다운로드 및 설치하기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;의존성 문제를 해결하기 위해 다른 패키지를 설치하고 싶지만 패키지를 설치하기 전 어떤 deb 파일을 설치해야 하는지 정확히 알 수 X&lt;/li&gt;
&lt;li&gt;설치해야 할 deb 파일을 알아내더라도 그 파일 또한 의존성 문제가 있을 수 있음&lt;/li&gt;
&lt;li&gt;우분투에서는 이러한 문제를 한번에 해결하기 위해 apt-get 명령어 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;apt-get 명령어&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;apt-get 명령어는 *.deb 패키지를 설치하는 편리한 도구&lt;/li&gt;
&lt;li&gt;우분투가 제공하는 deb 파일 저장소에서 자동으로 deb 파일을 다운로드하여 설치&lt;/li&gt;
&lt;li&gt;의존성 문제를 걱정하지 않아도 됨&lt;/li&gt;
&lt;li&gt;dpkg 명령어의 경우, *.deb 파일을 다운로드한 후 설치해야 하는 번거로움이 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;main, universe, restricted, multiverse의 의미&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;main: 우분투에서 공식적으로 지원하는 무료 소프트웨어&lt;/li&gt;
&lt;li&gt;universe: 우분투에서 지원하지 않는 무료 소프트웨어&lt;/li&gt;
&lt;li&gt;restricted: 우분투에서 공식적으로 지원하는 유료 소프트웨어&lt;/li&gt;
&lt;li&gt;multiverse: 우분투에서 지원하지 않는 유료 소프트웨어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;미러(mirror) 사이트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우분투 패키지 저장소는 우분투 사이트에서 제공&lt;/li&gt;
&lt;li&gt;전 세계적으로 동일한 저장소가 수백 개 존재&lt;/li&gt;
&lt;li&gt;대학, 연구소, 기업 등이 자발적으로 구축한 것&lt;/li&gt;
&lt;li&gt;apt-get -y install 패키지명 : sources.list에 기록된 사이트에 자동으로 접속해서 다운로드 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;apt 패키지 관련 명령어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;apt-cache [옵션] [서브 명령]&lt;/b&gt; : 패키지 검색 및 정보보기 명령 (패키지 데이터베이스(APT 캐시)에서 패키지와 관련된 정보를 출력)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-f : 패키지에 대한 전체 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-h : 관련 도움말 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서브&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stats : 캐시 통계 정보(전체 패키지 이름과 단일 가상 패키지 등) 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dump : 현재 설치되어 있는 패키지 업그레이드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pkgnames : 사용 가능한 모든 패키지의 이름 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;search [키워드] : 키워드에 해당하는 패키지 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;show [패키지 이름] : 해당 패키지의 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;showpkg [패키지 이름] : 패키지의 의존성과 역의존성에 대한 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;APT 캐시 통계정보 출력 : apt-cache stats&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템에 설치되어 있는 전체 패키지의 이름과 일반 패키지&lt;/li&gt;
&lt;li&gt;순수 가상과 단일 가상 및 혼합 가상 패키지&lt;/li&gt;
&lt;li&gt;등의 APT 캐시의 전반적인 통계정보를 출력하는 명령&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 업데이트 : apt-cache dump&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 시스템에 설치되어 있는 모든 패키지에 대한 업데이트 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 패키지 이름 출력 : apt-cache pkgnames&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 시스템에 설치되어 있는 모든 패키지의 이름 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 정보 출력 : apt-cache show [패키지명]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 시스템에 설치되어 있는 특정 패키지의 정보 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;apt-get [옵션] [서브 명령]&lt;/b&gt; : 패키지 설치 및 업데이트 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-d : 패키지 다운로드 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-f : 의존성이 깨진 패키지 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-h : 관련 도움말 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서브 명령&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;update : 패키지 저장소에서 새로운 패키지 정보를 가져옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;upgrade : 모든 패키지를 최신 버전으로 업그레이드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;install [패키지 이름] : 해당 패키지 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;remove [패키지 이름] : 설치된 해당 패키지 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;purge [패키지 이름] : 설치된 해당 패키지와 설정 파일을 모두 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autoremove : 시스템에 설치된 패키지를 자동으로 정리 및 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;download [패키지 이름] : 해당 패키지를 현재 디렉터리에 다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autoclean : 오래된 패키지 또는 불완전한 다운로드 패키지 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;check : 의존성이 깨진 패키지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;clean : /var/cache/apt/archives 디렉터리에 캐시되어 있는 모든 패키지를 제거하여 디스크 공간 확보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 정보 업데이트 : sudo apt-get update&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;update 서브 명령을 수행하면 /etc/apt/sources.list에 새로운 패키지 정보(목록)를 가져와서&lt;/li&gt;
&lt;li&gt;만약 /etc/apt/sources.list 파일을 수정하였다면 반드시 이 명령 수행해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 업그레이드 : sudo apt-get upgrade&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 시스템에 설치되어 있는 모든 패키지 중에서 업그레이드가 필요한 패키지를 찾은 다음 새로운 버전이 있는 패키지에 대해서는 모두 업그레이드를 수행&lt;/li&gt;
&lt;li&gt;업그레이드 필요여부 검색 : sudo apt-get upgrade | grep [패키지 이름]&lt;/li&gt;
&lt;li&gt;검색과정 멈춤 : Ctrl+C 누르기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 패키지 설치 또는 업그레이드 : sudo apt-get install&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1개 또는 1개 이상의 패키지를 설치하거나 업그레이드 수행&lt;/li&gt;
&lt;li&gt;1개의 패키지만 설치할 경우 : sudo apt-get install [패키지 이름]&lt;/li&gt;
&lt;li&gt;패키지를 설치할 때 진행여부에 대한 y를 입력하지 않아도 자동으로 입력되도록 수행하려면 -y 옵션 사용 sudo apt-get -y install [패키지 이름]&lt;/li&gt;
&lt;li&gt;여러 패키지 설치할 경우 : sudo apt-get install [패키지 이름1] [패키지 이름2]&lt;/li&gt;
&lt;li&gt;새로운 패키지를 설치하지 않고 업그레이드만 수행 : sudo apt-get install [패키지 이름] --only-upgrade&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 패키지 삭제 : purge 또는 remove&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;remove: 해당 패키지의 설정 파일은 남아있게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;purge: 남은 설정 파일까지 모두 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 파일을 남겨놓는 이유: 나중에 동일한 패키지를 다시 설치할 때 재사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get purge [패키지 이름]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get remove [패키지 이름] --purge (두 옵션을 함께 쓸 수 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 자동 정리 및 삭제 : autoremove&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 이상 존재할 필요가 없는 패키지가 남아있을 수 있으므로 잔존해 있는 패키지에 대해서 자동 정리 및 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get autoremove&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 공간 정리 : clean&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지를 검색하였거나 다운로드한 파일들을 삭제한 후 디스크 공간 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get clean&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 패키지 다운로드 : download&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 패키지를 직접 설치하지 않고 다운로드만 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get download [패키지 이름]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 패키지의 소스 관련 서브 명령 : source&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 패키지의 소스 코드가 필요할 경우 다운로드할 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get --download-only source [패키지 이름]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드를 수행한 특정 패키지의 소스코드에 대한 압축 해제 : sudo apt-get source [패키지 이름]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 패키지의 소스 코드 다운로드를 수행하여 압축을 해제하고 컴파일 : sudo apt-get --compile source [패키지 이름]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 11-01&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;pkgnames 서브 명령으로 모든 패키지 이름 출력하기&lt;/li&gt;
&lt;li&gt;upgrade 서브 명령으로 업그레이드를 수행할 패키지 확인하기&lt;/li&gt;
&lt;li&gt;install 서브 명령과 옵션 y를 설정하여 netcat 패키지 설치하기&lt;/li&gt;
&lt;li&gt;설치된 netcat 패키지의 정보 출력하기&lt;/li&gt;
&lt;li&gt;netcat 패키지의 설정 파일까지 모두 삭제하기&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ sudo apt-cache pkgnames
$ sudo apt-get upgrade
$ sudo apt-get -y install netcat
$ sudo apt-cache show netcat
$ sudo apt-get purge netcat
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DPKG 패키지 관련 명령어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DPKG 명령&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템의 특정 파일이 어느 패키지에 포함되어 있는지 등에 대한 구체적인 기능을 확인할 때 옵션과 함께 사용&lt;/li&gt;
&lt;li&gt;APT 명령은 소프트웨어 관리를 위해 내부적으로 DPKG 명령을 이용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dpkg [옵션] [패키지 이름 또는 파일 이름]&lt;/b&gt; : 패키지 관리 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-l : 설치된 패키지 목록 전체 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-l [패키지 이름] : 해당 패키지의 설치상태 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-r [패키지 이름] : sudo 명령을 사용하여 해당 패키지를 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-P [패키지 이름] : sudo 명령을 사용하여 해당 패키지와 설정 정보 모두 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-s [패키지 이름] : 해당 패키지의 자세한 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-L [패키지 이름] : 해당 패키지가 설치된 파일목록 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-S [경로명] : 경로명이 포함된 패키지 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-c [.파일 확장자] : 해당 파일 확장자를 가진 파일의 내용 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-i [.파일 확장자] : sudo 명령으로 해당 파일 확장자를 가진 파일 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-x [.파일 확장자] [디렉터리명] : 해당 파일 확장자를 가진 파일을 지정한 디렉터리에 풀어놓음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dpkg -l : 시스템에 설치되어 있는 패키지의 목록 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dpkg -l zip : 설치된 패키지 중에서 zip 패키지에 대한 정보만 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dpkg -l gnome-chess : gnome-chess 패키지가 설치되어 있는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get download gnome-chess&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ls gnome* : 다운로드한 패키지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo dpkg -i gnome-chess_1%3a3.36.0-1_amd64.deb : 의존성 패키지 hoichess가 설치되어 있지 않으므로 설치가 정상적으로 안됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get install hoichess : gnome-chess 패키지의 의존성을 가진 hoichess 패키지 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 패키지를 못 찾는다는 오류 메시지가 출력되면 해당 패키지는 제외하고 설치 진행&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;APTITUDE 패키지 관련 명령어&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;APTITUDE 명령&lt;/b&gt; : sudo 명령으로 root 계정 권한 위임&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;apt 명령과 같이 패키지 관리를 쉽게 작업할 수 있도록 자동화 기능 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;aptitude [서브 명령]&lt;/b&gt; : 패키지 설치 및 업데이트 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서브&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단독 실행 : 비주얼 모드로 실행하기 위한 curses 프로그램 활성화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;update : 패키지 저장소에서 새로운 패키지 정보를 가져옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;upgrade : 모든 패키지를 최신 버전으로 업그레이드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;install [패키지 이름] : 해당 패키지 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;remove [패키지 이름] : 설치된 해당 패키지 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;purge [패키지 이름] : 설치된 해당 패키지와 설정 파일을 모두 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autoremove : 시스템에 설치된 패키지를 자동으로 정리 및 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;download [패키지 이름] : 해당 패키지를 현재 디렉터리에 다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autoclean : 오래된 패키지 또는 불완전한 다운로드 패키지 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;check : 의존성이 깨진 패키지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;clean : /var/cache/apt/archives 디렉터리에 캐시되어 있는 모든 패키지를 제거하여 디스크 공간 확보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get install aptitude : aptitude 패키지 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo aptitude update : 기존에 설치된 패키지의 새로운 정보를 가져와서 apt 캐시를 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aptitude search gnome : gnome으로 시작하는 패키지 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aptitude show gnome-clock : gnome-clocks 패키지의 상세한 정보 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo aptitude install gnome-clocks : gnome-clocks 패키지 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 11-02&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;aptitude 명령으로 gnome-dictionary 패키지에 대한 상세한 정보 확인하기&lt;/li&gt;
&lt;li&gt;aptitude 명령으로 gnome-dictionary 패키지 설치하기&lt;/li&gt;
&lt;li&gt;apt 명령으로 gnome-dictionary 패키지가 설치한 파일목록 확인하기&lt;/li&gt;
&lt;li&gt;gnome-dictionary 패키지를 실행하기&lt;/li&gt;
&lt;li&gt;우분투 소프트웨어 센터를 통해 OpenTTD 게임 설치하기&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;$ aptitude show gnome-dictionary
$ sudo aptitude install gnome-dictionary
$ sudo apt-cache show gnome-dictionary
&amp;gt; 윈도 화면에 설치된 패키지 아이콘을 클릭하여 실행
&amp;gt; 우분투 소프트웨어 센터에서 OpenTTD 게임 설치 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파일 아카이브와 압축&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 아카이브&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아카이브(Archive)란 특정 시간에 함께 묶인 파일이나 디렉터리의 집합을 의미 (저장소 또는 보관소)&lt;/li&gt;
&lt;li&gt;다른 시스템과 파일이나 디렉터리를 주고 받거나 파일을 백업하는 용도로 사용&lt;/li&gt;
&lt;li&gt;파일 아카이브를 위해 사용되는 명령은 tar, cpio, ar 등이 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;tar 기능[옵션] [아카이브 생성 파일명] 대상 파일명&lt;/b&gt; : 파일과 디렉터리를 묶어 하나의 아카이브로 생성하는 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c : 새로운 tar 아카이브 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;r : 새로운 파일 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;t : tar 파일에 존재하는 파일 리스트 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;u : 수정된 파일에 대해 업데이트 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x : tar 파일에 있는 원본 파일을 추출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C [디렉터리명] : 파일들을 특정 디렉터리에 풀어 놓음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f [디바이스명 또는 파일명] : 아카이브 파일 또는 테이프 장치를 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(디바이스명을 -으로 지정하면 tar 파일 대신 표준입력에서 읽어 들임)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;h : 심볼릭 링크의 원본 파일 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;j : bzip2로 압축 또는 해제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p : 파일 복구 시 원래의 접근 권한을 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v : 처리하고 있는 파일의 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;z : gzip으로 압축 또는 해제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Z : compress를 통해 아카이브를 필터링&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아카이브 생성 : cvf&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mkdir arch_test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd arch_test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mkdir ex_ac.d&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;touch test_01.txt test_02.txt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gedit test_01.txt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gedit test_02.txt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd ~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ls arch_test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar cvf arch_test.tar arch_test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 기존에 존재하던 arch_test 디렉터리는 삭제되지 않고 그대로 남아있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아카이브 내용 출력 : tvf&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar tvf arch_test.tar : 앞서 생성한 arch_test.tar 파일에 대한 상세한 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아카이브 풀기 : xvf&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 존재하는 아카이브 파일을 풀기 위함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cp arch_test.tar arch_test/ex_ac.d : arch_test.tar 아카이브를 arch_test/ex_ac.d 디렉터리에 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd arch_test/ex_ac.d&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar xvf arch_test.tar&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아카이브 업데이트 : uvf&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 존재하는 아카이브 파일에 수정된 파일을 추가할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;u 기능은 아카이브에 존재하는 파일의 내용이 수정될 경우 아카이브를 업데이트하기 위해 사용하는 기능 (기존 파일의 내용에 변경 사항이 없다면 아카이브 파일에 아무런 변화 X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd ~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar uvf arch_test.tar arch_test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gedit arch_test/test_01.txt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar uvf arch_test.tar arch_test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아카이브에 파일 추가 : rvf&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 존재하는 아카이브에 지정한 파일을 무조건 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar rvf arch_test.tar hosts : 복사한 hosts 파일을 아카이브에 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아카이브와 파일 압축&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아카이브를 생성하면서 파일 압축을 수행 (디스크 공간이 부족할 때 유용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar cvzf arch_test.tar.gz arch_test : arch_test 디렉터리를 아카이브 생성과 동시에 압축 파일로 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아카이브 생성과 동시에 bzip2 형식으로 파일 압축&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar cvjf arch_test.tar.bz2 arch_test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 확장자 이름을 붙이는 것은 쉽게 알아보기 위한 것임 (필수로 붙여야 하는 것 X)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파일 압축과 해제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) gzip 명령으로 파일 압축&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;gzip [옵션] 파일 이름&lt;/b&gt; : gzip 형식으로 파일 압축 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-d : 파일 압축 해제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-l : 압축된 파일의 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-r : 하위 디렉터리로 이동하여 파일 압축&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-t : 압축 파일 검사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-v : 압축 정보를 화면에 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-9 : 최대한 압축&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gzip arch_test.tar arch_test : arch_test 디렉터리를 arch_test.tar 파일명으로 압축 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; arch_test.tar 파일은 사라지고 arch_test.tar.gz 압축 파일이 새로 생성됨 arch_test는 디렉터리이므로 무시됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;압축 파일 내용 보기 : zcat&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zcat arch_test.tar.gz | more&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. more은 페이지 단위, less는 줄 단위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;압축 파일 풀기 : gunzip&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gzip 명령으로 압축된 파일은 gunzip 명령으로 복원할 수 있으며 옵션 -d를 사용하여 압축된 파일을 복원할 수도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gunzip arch_test.tar.gz&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) bzip2 명령으로 압축&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bzip2는 gzip 명령에 비해 압축률은 좋지만 속도가 약간 느림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;bzip2 [옵션] 파일 이름&lt;/b&gt; : bzip2 형식으로 파일 압축 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-d : 파일 압축 해제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-l : 압축된 파일의 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-t : 압축 파일 검사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-v : 압축 정보를 화면에 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-best : 최대한 압축&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bzip2 arch_test.tar arch_test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;압축 파일 내용 보기 : bzcat&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bzcat arch_test.tar.bz2 | more&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;압축 파일 풀기 : bunzip2&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bunzip2 arch_test.tar.bz2&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;tar cvf my.tar /etc/fonts/  -- 묶기
tar cvJf my.tar.xz /etc/fonts/  -- 묶기+xz로 압축
tar cvzf my.tar.gz /etc/fonts/  -- 묶기+gzip로 압축
tar cvjf my.tar.bz2 /etc/fonts/  -- 묶기+bzip2로 압축
tar tvf my.tar  -- 파일 확인
tar xvf my.tar  -- tar 풀기

tar Cxvf newdir my.tar  -- newdir에 tar 풀기
tar xJf my.tar.xz  -- xz 압축 풀기+tar 풀기
tar xzf my.tar.gz  -- gzip 압축 풀기+tar 풀기
tar xjf my.tar.bz2  -- bzip2 압축 풀기+tar 풀기
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;파일 아카이브와 압축 해보기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar 아카이브를 현재 디렉터리에 풀기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tar xvf T.tar&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar 아카이브를 지정된 디렉터리에 풀기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tar xvf T.tar -C ./test&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tar 아카이브의 내용 확인하기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tar tvf T.tar&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 디렉터리를 tar로 묶고 gzip으로 압축하기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tar cvzf T.tar.gz *&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gzip으로 압축된 tar 아카이브를 현재 디렉터리에 풀기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tar xvzf T.tar.gz&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 디렉터리를 tar로 묶고 bzip2로 압축하기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tar cvjf T.tar.bz2 *&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bzip2로 압축된 tar 아카이브를 현재 디렉터리에 풀기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tar xvjf T.tar.bz2&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 11-03&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;새로운 zip_test.d 디렉터리 생성하기&lt;/li&gt;
&lt;li&gt;zip_test.d 디렉터리로 이동하기&lt;/li&gt;
&lt;li&gt;touch 명령으로 ex_01.txt와 ex_02.txt 파일 생성하기&lt;/li&gt;
&lt;li&gt;gedit 창에서 ex_01.txt와 ex_02.txt 파일에 간단한 내용 각각 편집하기&lt;/li&gt;
&lt;li&gt;cd ~ 명령으로 사용자 계정의 홈 디렉터리로 이동하기&lt;/li&gt;
&lt;li&gt;tar 명령으로 zip_test.d 디렉터리를 대상으로 아카이브 ac_zip.tar 생성하기&lt;/li&gt;
&lt;li&gt;아카이브 ac_zip.tar의 내용 확인하기&lt;/li&gt;
&lt;li&gt;ac_zip.tar 아카이브 풀기&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ mkdir zip_test.d
$ cd zip_test.d
$ touch ex_01.txt ex_02.txt
$ gedit ex_01.txt
$ gedit ex_02.txt
$ cd ~
$ tar cvf ac_zip.tar zip_test.d
$ tar tvf ac_zip.tar
$ tar xvf ac_zip.tar
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;소프트웨어 컴파일&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컴파일러의 개념 (광의의 개념)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자연어로 작성된 고급언어를 컴퓨터가 이해할 수 있는 기계어로 번역해 주는 SW&lt;/li&gt;
&lt;li&gt;자연어를 기계어로 번역해 주는 과정을 컴파일(Compile)이라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;gcc 컴파일러&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우분투에서 사용하는 C언어 기본 컴파일러는 gcc&lt;/li&gt;
&lt;li&gt;관련 패키지가 설치되어 있지 않으면 패키지를 설치하기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aptitude show gcc : aptitude 명령으로 gcc 패키지가 설치되어 있는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get install gcc : gcc 패키지가 설치 안되어있을 때 패키지 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;gcc 컴파일러 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 파일의 이름을 사용자가 지정하지 않으면 기본적으로 a.out 파일명으로 생성됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 디렉터리의 경로를 지정하기 위해 ./를 사용하여 ./a.out 명령으로 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;gcc -o [변경할 실행파일명] [C 프로그램 소스 파일명]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;geany 에디터 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get install geany&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get install geany-plugins&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;geany 컴파일러 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-c : 링킹 전단계까지 오브젝트 파일을 만들어놓은 상태 (? 확실 X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴파일 &amp;rarr; 빌드 &amp;rarr; 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**void qsort(void *base, size_t nmemb, size_t size, int (*compare)(const void , const void ));&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;#include &amp;lt;stdlib.h&amp;gt;에 정의된 quick sort 알고리즘 라이브러리 함수&lt;/li&gt;
&lt;li&gt;base: 정렬할 배열의 시작 주소&lt;/li&gt;
&lt;li&gt;nmemb: 배열 요소의 개수&lt;/li&gt;
&lt;li&gt;size: 배열의 한 요소당 크기 (bytes 단위)&lt;/li&gt;
&lt;li&gt;compare: 비교 함수의 포인터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**int compare(const void a, const void b)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반환값에 따라 요소들의 순서를 결정&lt;/li&gt;
&lt;li&gt;비교 함수는 두 void * 포인터를 받아 정수로 캐스팅 후 값을 비교&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 56.0462%; height: 84px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 12.7243%;&quot;&gt;반환값&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 17.2089%;&quot;&gt;의미&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 19.8532%;&quot;&gt;정렬 결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 12.7243%;&quot;&gt;&amp;lt; 0&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 17.2089%;&quot;&gt;a가 b보다 작다&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 19.8532%;&quot;&gt;a가 b보다 앞에 온다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 12.7243%;&quot;&gt;== 0&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 17.2089%;&quot;&gt;a와 b가 같다&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 19.8532%;&quot;&gt;순서 유지 (stable 아님)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 12.7243%;&quot;&gt;&amp;gt; 0&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 17.2089%;&quot;&gt;a가 b보다 크다&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 19.8532%;&quot;&gt;a가 b보다 뒤에 온다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stable: 순서를 보장하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코딩 실습&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제) qsort_example.c&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

// 오름차순 비교 함수
int compare(const void *a, const void *b) {
	return (*(int*)a - *(int*)b);
}

int main() {
	int arr[] = {7, 2, 9, 4, 3, 8, 1};
	int n = sizeof(arr)/sizeof(arr[0]);
	
	printf(&quot;정렬 전 배열: &quot;);
	for (int i = 0; i &amp;lt; n; i++) {
		printf(&quot;%d &quot;, arr[i]);
	}
	printf(&quot;\\n&quot;);
	
	qsort(arr, n, sizeof(int), compare);
	
	printf(&quot;정렬 후 배열: &quot;);
	for (int i = 0; i &amp;lt; n; i++) {
		printf(&quot;%d &quot;, arr[i]);
	}
	printf(&quot;\\n&quot;);
	
	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. (int)a : dereferencing&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 배열이 주어졌을 때, 다음 기준에 따라 정렬하여 출력하시오.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;문자열 길이가 짧은 순서대로 정렬한다.&lt;/li&gt;
&lt;li&gt;길이가 같다면 사전 순으로 앞선 문자열이 먼저 오도록 정렬한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;입력&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 줄에 정렬할 문자열의 개수 N이 주어진다. (1&amp;le;N&amp;le;100)&lt;/li&gt;
&lt;li&gt;이후 N개의 줄에 문자열이 한 줄에 하나씩 주어진다.&lt;/li&gt;
&lt;li&gt;문자열은 알파벳 소문자로만 구성되며, 길이는 최대 100자이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정렬된 결과를 한 줄에 하나씩 출력한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 예시:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apple&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kiwi&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;banana&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pear&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grape&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 예시:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kiwi&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pear&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apple&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grape&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;banana&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;답)&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

#define MAX 100
#define MAX_LEN 101

// 문자열 비교 함수
int compare(const void *a, const void *b) {
	const char *str1 = *(const char **)a;
	const char *str2 = *(const char **)b;
	
	int len1 = strlen(str1);
	int len2 = strlen(str2);
	
	if (len1 != len2) {
		return len1 - len2;
	} else {
		return strcmp(str1, str2);
	}
}

int main() {
	int N;
	char *words[MAX];
	
	scanf(&quot;%d&quot;, &amp;amp;N);
	getchar(); // 개행 문자 제거
	
	for (int i = 0; i &amp;lt; N; i++) {
		words[i] = malloc(MAX_LEN * sizeof(char));  // 동적 할당
		fgets(words[i], MAX_LEN, stdin);
		words[i][strcspn(words[i], &quot;\\n&quot;)] = '\\0'; // 개행 제거
	}
	
	qsort(words, N, sizeof(char *), compare);
	
	for (int i = 0; i &amp;lt; N; i++) {
		printf(&quot;%s\\n&quot;, words[i]);
		free(words[i]);
	}
	
	return 0;
}	
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;words[i][strcspn(words[i], &quot;\n&quot;)] = '\0';&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;널 문자를 넣어서 문자열을 끝내야 하는데 &amp;ldquo;\0&amp;rdquo; 를 쓰면 널 문자를 가리키는 포인터로 해석될 수 있기 때문에 작은 따옴표로 써야 함&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부 기록/리눅스 기초</category>
      <author>도도히히</author>
      <guid isPermaLink="true">https://thisisme0101.tistory.com/22</guid>
      <comments>https://thisisme0101.tistory.com/22#entry22comment</comments>
      <pubDate>Sat, 17 Jan 2026 13:23:42 +0900</pubDate>
    </item>
    <item>
      <title>[리눅스 기초] 10 프로세스 관리</title>
      <link>https://thisisme0101.tistory.com/21</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 번호와 작업 번호&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스 번호
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU가 프로세스를 구분하기 위해 부여되는 고유 번호&lt;/li&gt;
&lt;li&gt;각 프로세스가 가지는 고유의 번호를 PID라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;작업 번호 (Job number)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 셸에서 실행되는 작업을 구분&amp;middot;제어하기 위해 셸에서 부여하는 식별 번호&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 서비스와 관계&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데몬 프로세스
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우분투에서 특정 서비스를 제공하기 위해 존재하는 프로세스&lt;/li&gt;
&lt;li&gt;시스템 백그라운드에서 계속 실행되며 특정 기능이나 서비스를 제공하는 프로세스&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;부모-자식 관계의 프로세스
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모 프로세스는 PPID를 가지며 자식 프로세스는 PID를 보유&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고아 프로세스와 좀비 프로세스 (이 부분은 흘려들으라고 하심)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고아 프로세스
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모-자식 관계의 프로세스에서 자식 프로세스가 종료되지 않은 상태에서 부모 프로세스가 종료되는 경우&lt;/li&gt;
&lt;li&gt;고아 프로세스의 종료는 1번 프로세스를 부모 프로세스로 의존하게 되어 작업을 무난히 마치고 프로세스를 종료하게 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;좀비 프로세스
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모 프로세스가 자식 프로세스의 종료를 기다린 뒤에 종료를 처리해 주는 정상적인 과정을 거치지 않고 부모 프로세스를 종료할 경우 발생하게 되는 프로세스를 의미 (자식 프로세스가 종료된 상태)&lt;/li&gt;
&lt;li&gt;좀비 프로세스는 kill 명령으로 제거할 수 없음 (SIGCHLD 시그널을 부모 프로세스에 보내 부모 프로세스가 자식 프로세스를 정리하도록 수행하거나 부모 프로세스 자체를 종료해야만 좀비 프로세스를 제거할 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로세스 관리 명령&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로세스 상태 확인:&lt;/b&gt; &lt;b&gt;ps 명령&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우분투에서 ps 명령의 옵션은 유닉스, BSD, GNU 3가지 유형으로 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ps [옵션]&lt;/b&gt; : 현재 실행 중인 프로세스의 상태 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;유닉스 옵션&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-e : 시스템에서 실행 중인 모든 프로세스의 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-f : 프로세스에 대한 상세한 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-u UID : 특정 사용자에 대한 모든 프로세스의 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-p PID : PID로 지정한 특정 프로세스의 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;BSD 옵션&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a : 터미널에서 실행한 프로세스의 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;u : 프로세스 소유자의 이름, CPU와 메모리 사용량 등 상세한 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x : 시스템에서 실행 중인 모든 프로세스의 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;GNU 옵션&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--pid PID 목록 : 목록으로 지정한 특정 PID 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션 한번에 여러 개 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ps : 프로세스 목록 출력 (현재 프로세스 상태 정보)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 68.7219%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.7907%;&quot;&gt;PID&lt;/td&gt;
&lt;td style=&quot;width: 53.6703%;&quot;&gt;실행 중인 프로세스를 구별하기 위한 프로세스의 고유 ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.7907%;&quot;&gt;TTY&lt;/td&gt;
&lt;td style=&quot;width: 53.6703%;&quot;&gt;프로세스가 시작되고 있는 현재 터미널 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.7907%;&quot;&gt;TIME&lt;/td&gt;
&lt;td style=&quot;width: 53.6703%;&quot;&gt;해당 프로세스가 현재까지 사용된 CPU의 시간과 양&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.7907%;&quot;&gt;CMD&lt;/td&gt;
&lt;td style=&quot;width: 53.6703%;&quot;&gt;프로세스가 실행한 명령이 무엇인지를 알려줌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 터미널마다 PID와 TTY가 다름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. sudo cat /etc/passwd | tail : ??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ps -f : 현재 프로세스의 상세한 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 178px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;항목&lt;/td&gt;
&lt;td&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;UID&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;프로세스를 실행한 사용자 ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;PID&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;실행 프로세스 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;PPID&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;부모 프로세스 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;C&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;CPU 사용량을 % 값으로 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;STIME&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;프로세스 시작 날짜 또는 시각&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;TTY&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;터미널의 종류와 번호&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;TIME&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;프로세스 실행 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;CMD&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;실행되고 있는 프로그램 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. ps -p PPID (이때 CMD가 bash인 PPID 입력) : CMD가 gnome-terminal임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로세스 관리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 프로세스 정보를 검색할 때는 pgrep 명령 사용&lt;/li&gt;
&lt;li&gt;ps 명령과 grep 명령을 하나로 통합하여 만든 명령어로 인식&lt;/li&gt;
&lt;li&gt;pgrep 명령은 옵션 다음에 선언한 인자와 일치하는 패턴의 프로세스를 찾아 PID를 알려줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;pgrep [옵션] [인자]&lt;/b&gt; : 인자와 일치하는 패턴의 프로세스 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-x : 인자와 정확히 일치하는 패턴의 프로세스 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-n : 인자를 포함하고 있는 가장 최근의 프로세스 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-u 사용자 계정 이름 : 특정 사용자 계정에 대한 모든 프로세스의 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-l : PID와 프로세스의 이름 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-t term : 특정 단말기와 관련된 프로세스의 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pgrep -x bash : bash 프로세스의 PID 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pgrep -l bash : bash 프로세스의 PID와 프로세스의 이름 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ps -fp $(pgrep -x bash) : pgrep -x bash 명령의 실행 결과(PID 목록)을 ps 명령의 -p 옵션에 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. $(pgrep -x bash): command substitution&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kill 명령으로 프로세스 종료
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스를 종료하는 kill 명령은 종료할 프로세스에 인자로 지정한 숫자 메시지를 시그널로 보내 해당 프로세스를 종료&lt;/li&gt;
&lt;li&gt;프로세스에 보내는 시그널은 인터럽트, 프로세스 종료, 강제 종료 등의 숫자로 기능이 지정되어 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;kill [시그널] PID&lt;/b&gt; : 프로세스 종료를 위해 지정한 시그널을 해당 프로세스에 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시그널&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-2 : 인터럽트 시그널 전송 (Ctrl+C)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-9 : 프로세스 강제 종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-15 : 프로세스가 관련 파일을 정리 후 종료 (종료되지 않는 프로세스도 존재)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kill 명령으로 프로세스를 종료하기 위해 2개의 터미널 창 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yes &amp;gt; /dev/null : 무한루프 명령 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. /dev/null : 아무런 반응을 하지 않는 장치 선언, yes: yes 라는 문자열을 화면에 반복해서 출력하라는 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl+C를 누르면 강제 종료됨 (Ctrl+Z는 일시 중단)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;강제 종료 방법&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;새 터미널에서 &lt;b&gt;ps -ef | grep yes&lt;/b&gt; 로 PID 확인 &amp;rarr; &lt;b&gt;kill -9 PID&lt;/b&gt;로 강제 종료&lt;/li&gt;
&lt;li&gt;ps -fp $(pgrep -x yes) &amp;rarr; kill -9 PID&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pkill 명령으로 프로세스 종료 (잘 사용하진 X)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kill 명령와 같이 시그널을 보내는 방식은 같음&lt;/li&gt;
&lt;li&gt;PID를 보내는 것이 아니라 프로세스의 명령이름으로 프로세스를 찾아서 종료해 줌 (kill 명령과 차이점)&lt;/li&gt;
&lt;li&gt;같은 명령으로 수행한 프로세스를 명령 이름으로 찾아주기 때문에 pkill yes와 같이 한꺼번에 같은 이름의 명령을 찾아서 모두 종료할 수 있다는 편의성 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 10-01&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ps 명령과 옵션으로 프로세스의 상세한 정보 출력하기&lt;/li&gt;
&lt;li&gt;pgrep 명령으로 bash를 실행하고 있는 프로세스의 PID 출력하기&lt;/li&gt;
&lt;li&gt;ps 명령과 옵션으로 터미널에서 실행한 프로세스의 정보 출력하기&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ ps -f
$ pgrep -x bash
$ ps a
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #2c2c2b; text-align: start;&quot; data-block-id=&quot;1e616a53-5435-8063-9650-e8599948e1ea&quot;&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;포그라운드와 백그라운드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;포그라운드&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;터미널 창에서 명령어를 입력하면 셸은 사용자가 입력한 명령을 수행하여 그 결과를 화면에 보여줌&lt;/li&gt;
&lt;li&gt;사용자는 화면에 나타난 출력결과를 보고 다른 명령을 입력하는 대화식으로 수행하는 작업&lt;/li&gt;
&lt;li&gt;즉, 사용자와 상호작용을 하여 작업을 수행하도록 해주는 프로세스를 포그라운드 작업이라 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;백그라운드&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 실행되었지만 직접 눈으로 프로세스가 확인되지 않는 작업&lt;/li&gt;
&lt;li&gt;ex) 백신 프로그램, 서버 데몬 등과 같이 화면에 나타나 눈에 보이지는 않지만 실행되는 명령 작업&lt;/li&gt;
&lt;li&gt;이때 수행하는 프로세스를 백그라운드 프로세스라 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sleep 10&lt;/b&gt; : 10초 동안 포그라운드 작업 (작업이 끝날 때까지 기다려야 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sleep 30&amp;amp;&lt;/b&gt; : 30초 동안 백그라운드 작업 (다른 작업 수행 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작업 제어&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포그라운드 작업을 백그라운드 작업으로 전환하거나 백그라운드 작업을 포그라운드 작업으로 전환하는 제어를 의미&lt;/li&gt;
&lt;li&gt;작업 제어는 작업 전환과 작업의 일시 중지, 작업 종료로 구분되어 수행됨&lt;/li&gt;
&lt;li&gt;jobs 명령: 현재 실행중인 작업 목록 출력 (멈춰있는 작업도 포함)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;jobs [%작업 번호]&lt;/b&gt; : 작업 목록 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;%작업 번호&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%번호 : 해당 작업의 정보만 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%+ 또는 %% : 작업순서가 +인 작업 정보를 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%- : 작업순서가 -인 작업 정보를 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sleep 20&amp;amp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sleep 30&amp;amp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sleep 10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jobs (포그라운드 작업은 목록에 보이지 않음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;작업 전환&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 포그라운드로 실행 중인 작업을 백그라운드 작업으로 전환하거나 백그라운드 작업을 포그라운드로 전환&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 62.5582%; height: 73px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.9302%;&quot;&gt;명령&lt;/td&gt;
&lt;td style=&quot;width: 33.1456%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 24.9302%;&quot;&gt;Ctrl+Z 또는 stop [%작업 번호]&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 33.1456%;&quot;&gt;포그라운드 작업을 잠시 중단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 24.9302%;&quot;&gt;bg [%작업 번호]&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 33.1456%;&quot;&gt;작업 번호가 지시하는 작업을 백그라운드 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 24.9302%;&quot;&gt;fg [%작업 번호]&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 33.1456%;&quot;&gt;작업 번호가 지시하는 작업을 포그라운드 전환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sleep 100&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl+Z 눌러 일시 중단&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bg %1 : 백그라운드로 작업 전환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. bg 명령만 사용할 경우 작업순서가 +인 작업에 대해서만 적용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jobs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; sleep 100이 sleep 100&amp;amp;로 전환되어 작업 목록에 보이게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;포그라운드 작업 종료 : Ctrl+C&lt;/b&gt; (Ctrl+Z는 작업 일시 중지)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포그라운드 작업은 Ctrl+C를 누르면 대부분 종료&lt;/li&gt;
&lt;li&gt;또다른 방법은 해당 프로세스의 PID를 찾아서 강제 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl+C를 눌러 현재 수행 중인 포그라운드 작업을 강제로 종료하고 jobs 명령으로 작업 목록을 확인해보면 수행 중인 작업이 없는 것을 알 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;백그라운드 작업 종료 : kill&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;kill 명령을 사용하여 강제 종료&lt;/li&gt;
&lt;li&gt;인자는 PID 대신 &amp;lsquo;%작업 번호&amp;rsquo; 를 선언해도 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;kill PID&lt;/b&gt; 또는 &lt;b&gt;kill %작업 번호&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 10-02&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;터미널 창에서 gedit 명령 수행하기&lt;/li&gt;
&lt;li&gt;실행 중인 gedit를 정지된 작업으로 만들기&lt;/li&gt;
&lt;li&gt;터미널 창에서 수행 중인 백그라운드 작업 목록 확인하기&lt;/li&gt;
&lt;li&gt;정지 중인 백그라운드 작업을 포그라운드 작업으로 전환하기&lt;/li&gt;
&lt;li&gt;단축키를 사용하여 수행 중인 포그라운드 작업 강제 종료하기&lt;/li&gt;
&lt;li&gt;현재 수행 중인 작업 목록 출력하기&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ gedit 
$ Ctrl+Z 누르기
$ jobs
$ fg %1
$ Ctrl+C 누르기
$ jobs
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부 기록/리눅스 기초</category>
      <author>도도히히</author>
      <guid isPermaLink="true">https://thisisme0101.tistory.com/21</guid>
      <comments>https://thisisme0101.tistory.com/21#entry21comment</comments>
      <pubDate>Sat, 17 Jan 2026 09:57:20 +0900</pubDate>
    </item>
    <item>
      <title>SQL 기본 문법 (2)</title>
      <link>https://thisisme0101.tistory.com/20</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 데이터 조작 (INSERT, UPDATE, DELETE)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;INSERT (삽입)&lt;/b&gt;: 테이블에 새 데이터를 삽입
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본: INSERT INTO 테이블 VALUES (값1, 값2, ...);&lt;/li&gt;
&lt;li&gt;열 지정: INSERT INTO 테이블 (열1, 열2) VALUES (값1, 값2);&lt;/li&gt;
&lt;li&gt;대량 삽입: INSERT INTO 테이블 SELECT ... 구문을 사용하여 다른 테이블의 데이터를 한 번에 삽입할 수 있음&lt;/li&gt;
&lt;li&gt;테이블 생성 + 삽입: CREATE TABLE 새테이블 (SELECT ...)을 사용하면 SELECT 결과로 새 테이블을 바로 생성할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UPDATE (수정)&lt;/b&gt;: 기존 데이터를 수정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구문: UPDATE 테이블 SET 열1=값1, 열2=값2 WHERE 조건;&lt;/li&gt;
&lt;li&gt;WHERE 절을 생략하면 테이블의 모든 행이 수정됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DELETE (삭제)&lt;/b&gt;: 데이터를 행 단위로 삭제
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구문: DELETE FROM 테이블 WHERE 조건;&lt;/li&gt;
&lt;li&gt;WHERE 절을 생략하면 테이블의 모든 데이터가 삭제됨&lt;/li&gt;
&lt;li&gt;LIMIT 절을 사용해 삭제할 행 수를 제한할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. MySQL 데이터 형식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;숫자 형식&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정수: TINYINT(1바이트), SMALLINT(2바이트), INT(4바이트), BIGINT(8바이트)&lt;/li&gt;
&lt;li&gt;실수: FLOAT(4바이트), DOUBLE(8바이트)&lt;/li&gt;
&lt;li&gt;정밀 소수: DECIMAL(m, d) (전체 m자리 중 소수점 이하 d자리)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문자 형식&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CHAR(n): 고정 길이 문자열 (1~255)&lt;/li&gt;
&lt;li&gt;VARCHAR(n): 가변 길이 문자열 (1~65535)&lt;/li&gt;
&lt;li&gt;TEXT / BLOB: 매우 긴 텍스트(문자) 또는 바이너리 데이터(이미지, 파일 등)를 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 내장 함수&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;형 변환 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CAST(expression AS 데이터형식)&lt;/li&gt;
&lt;li&gt;CONVERT(expression, 데이터형식)&lt;/li&gt;
&lt;li&gt;예: SELECT CAST(AVG(amount) AS SIGNED INTEGER) ... (평균값을 정수로 변환)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문자열 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASCII(문자) , CHAR(숫자): 아스키코드 변환&lt;/li&gt;
&lt;li&gt;LENGTH(문자열): 바이트 수 (UTF-8에서 한글은 3바이트)&lt;/li&gt;
&lt;li&gt;CHAR_LENGTH(문자열): 문자 수&lt;/li&gt;
&lt;li&gt;CONCAT(...) , CONCAT_WS(구분자, ...): 문자열 연결&lt;/li&gt;
&lt;li&gt;LOWER() , UPPER(): 대소문자 변환&lt;/li&gt;
&lt;li&gt;LEFT(문자열, 길이) , RIGHT(문자열, 길이): 문자열 자르기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수학 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ABS(숫자): 절댓값&lt;/li&gt;
&lt;li&gt;CEILING(숫자): 올림&lt;/li&gt;
&lt;li&gt;FLOOR(숫자): 내림&lt;/li&gt;
&lt;li&gt;ROUND(숫자): 반올림&lt;/li&gt;
&lt;li&gt;RAND(): 0 이상 1 미만의 난수&lt;/li&gt;
&lt;li&gt;TRUNCATE(숫자, 정수): 소수점 기준 버림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시스템 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SLEEP(초): 지정된 시간(초) 동안 실행을 멈춤&lt;/li&gt;
&lt;li&gt;VERSION(): MySQL 버전을 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 조인 (JOIN)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 개 이상의 테이블을 묶어 하나의 결과 테이블로 만드는 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cookDB의 userTBL (회원)과 buyTBL (구매)처럼 '일대다' 관계 테이블을 연결할 때 유용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;INNER JOIN (내부 조인)&lt;/b&gt;: 두 테이블에 모두 공통으로 존재하는 데이터만 결합
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구문: ... FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.열 = 테이블2.열&lt;/li&gt;
&lt;li&gt;테이블 이름이 길 경우 userTBL U, buyTBL B와 같이 별칭(Alias)을 사용하면 쿼리가 간결해짐&lt;/li&gt;
&lt;li&gt;DISTINCT와 함께 사용하면 '구매 이력이 있는 회원 목록'을 중복 없이 조회할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OUTER JOIN (외부 조인)&lt;/b&gt;: 조인 조건을 만족하지 않는(짝이 없는) 행까지 포함하여 출력
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LEFT OUTER JOIN: 왼쪽 테이블(먼저 쓴 테이블)의 모든 행을 포함 (오른쪽 테이블에 짝이 없으면 NULL로 표시됨)&lt;/li&gt;
&lt;li&gt;RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행을 포함&lt;/li&gt;
&lt;li&gt;외부 조인과 WHERE ... IS NULL 조건을 조합하면 '구매 이력이 없는 회원'을 찾을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CROSS JOIN (상호 조인)&lt;/b&gt;: 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 결합 (카티션곱) (결과 행 수 = A테이블 행 수 &amp;times; B테이블 행 수)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UNION / UNION ALL&lt;/b&gt;: 두 SELECT 문의 결과를 위아래로 합침
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UNION: 중복된 행은 제거하고 합침&lt;/li&gt;
&lt;li&gt;UNION ALL: 중복 여부와 상관없이 모두 합침&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NOT IN / IN&lt;/b&gt;: 서브쿼리와 함께 사용하여 특정 조건을 제외하거나 포함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: ... WHERE userName NOT IN (SELECT ... WHERE mobile1 IS NULL) (휴대폰 번호가 없는 회원을 제외)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부 기록/MySQL</category>
      <author>도도히히</author>
      <guid isPermaLink="true">https://thisisme0101.tistory.com/20</guid>
      <comments>https://thisisme0101.tistory.com/20#entry20comment</comments>
      <pubDate>Wed, 12 Nov 2025 10:40:03 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크 보안] 인터넷 프로토콜(IP)</title>
      <link>https://thisisme0101.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 프로토콜&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TCP/IP 프로토콜이 사용하는 전송 메커니즘&lt;/li&gt;
&lt;li&gt;신뢰성이 없고 최선의 노력 전달 서비스 제공&lt;/li&gt;
&lt;li&gt;데이터그램을 사용하는 패킷 교환망을 위한 비연결형 프로토콜&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터그램&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IPv4 데이터그램&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IP 계층의 패킷&lt;/li&gt;
&lt;li&gt;가변 길이 패킷, 헤더와 데이터 부분으로 구성&lt;/li&gt;
&lt;li&gt;헤더: 20바이트 ~ 60바이트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 헤더가 20바이트, 옵션 헤더가 0~40바이트로 가변적&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;라우팅(경로 지정)과 전달에 필요한 정보 포함&lt;/li&gt;
&lt;li&gt;헤더를 4바이트(32비트) 단위로 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;헤더 내의 필드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전(VER)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4비트&lt;/li&gt;
&lt;li&gt;IP 프로토콜의 버전&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤더 길이(HLEN)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4비트&lt;/li&gt;
&lt;li&gt;데이터그램 헤더의 전체 길이 4바이트 단위로 표시
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5(=45=20bytes)에서 15(=415=60bytes)까지 표현&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 유형(TOS)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;8비트&lt;/li&gt;
&lt;li&gt;데이터그램 처리 방식 정의&lt;/li&gt;
&lt;li&gt;일부는 데이터그램 우선순위, 나머지는 서비스 유형 정의&lt;/li&gt;
&lt;li&gt;처음 6비트는 코드포인트 부필드
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;과거에는 마지막 2비트 사용 X&lt;/li&gt;
&lt;li&gt;현재는 DSCP가 삽입되어 마지막 2비트에 ECN&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IPv6에서는 Traffic Class 라는 이름으로 정의&lt;/li&gt;
&lt;li&gt;오른쪽 세 비트가 0일 경우 왼쪽 세 비트는 우선순위
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;혼잡과 같은 문제가 발생했을 경우 데이터그램의 우선순위 정의&lt;/li&gt;
&lt;li&gt;혼잡이 발생해 폐기해야 하는 경우 가장 낮은 우선순위 값을 가진 데이터그램을 우선적으로 폐기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(변경 전) 오른쪽 세 비트가 0이 아닐 경우(6비트: bit0~bit5)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bit 3: delay(지연) &amp;rarr; 0: 보통의 지연, 1: 높은 지연&lt;/li&gt;
&lt;li&gt;bit 4: throughput(처리율) &amp;rarr; 0: 보통 처리율, 1: 높은 처리율&lt;/li&gt;
&lt;li&gt;bit 5: reliability(신뢰성) &amp;rarr; 0: 보통 신뢰성, 1: 높은 신뢰성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(변경 후) 인터넷 당국이나 지역 당국에 의해 부여된 우선순위에 따라 56가지의 서비스 정의
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;xxxxx0: 표준 목적, 24가지 (인터넷 당국 지정)&lt;/li&gt;
&lt;li&gt;xxxx11: 실험용/로컬, 16가지 (지역 당국 지정)&lt;/li&gt;
&lt;li&gt;xxxx01: 실험용/예약, 16가지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ECN(명시적 혼잡 알림)필드
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;00: 패킷이 ECN 기능 사용하지 X&lt;/li&gt;
&lt;li&gt;01 또는 10: 발신 측에서 종단점이 ECN 기능을 수용함&lt;/li&gt;
&lt;li&gt;11: 라우터가 혼잡이 발생했음을 알리기&lt;/li&gt;
&lt;li&gt;새로운 정의에서는 사용되지 X &amp;larr; 이게 무슨 뜻인지..??&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 길이(Total Length)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;16비트&lt;/li&gt;
&lt;li&gt;헤더와 데이터를 포함하는 전체 길이를 바이트 단위로 표시 (65535 바이트로 제한)&lt;/li&gt;
&lt;li&gt;상위 계층으로부터 받은 데이터 길이 = 전체 길이 - 헤더 길이&lt;/li&gt;
&lt;li&gt;헤더의 길이= HLEN 필드 값 * 4&lt;/li&gt;
&lt;li&gt;실제 데이터 영역의 크기 확인이 요구되는 경우 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식별(identification)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;16비트&lt;/li&gt;
&lt;li&gt;단편화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플래그(flags)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3비트&lt;/li&gt;
&lt;li&gt;단편화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단편화 옵셋(fragmentation offset)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;13비트&lt;/li&gt;
&lt;li&gt;단편화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식별, 플래그, 단편화 옵셋은 뒤에 나오는 단편화 파트에서 조금 더 자세히 다룰 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수명(time to live)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;8비트&lt;/li&gt;
&lt;li&gt;데이터그램은 전달되는 동안 제한된 수명을 가짐 (폐기되기 전 지나갈 수 있는 홉의 개수 지정)&lt;/li&gt;
&lt;li&gt;타임스탬프 기능 수행을 위해 설계&lt;/li&gt;
&lt;li&gt;필드의 값이 0이 되면 데이터그램 폐기 (방문되는 라우터에 의해 감소)&lt;/li&gt;
&lt;li&gt;라우팅 테이블이 잘못된 경우를 위해 필요 (잘못된 상황으로 인해 네트워크가 혼잡해질 수 있는 상황 관리)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우팅 정보 오류로 데이터그램이 네트워크에 머무를 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;패킷의 전달 범위 제한
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1로 제한하는 경우 지역 네트워크 내에서만 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토콜(protocol)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;8비트&lt;/li&gt;
&lt;li&gt;상위 계층 프로토콜 정의&lt;/li&gt;
&lt;li&gt;여러 종류 상위 계층 프로토콜 캡슐화 O
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TCP/UDP: 전송 계층&lt;/li&gt;
&lt;li&gt;ICMP/IGMP: 네트워크 계층
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 네트워크 계층이지만 IP 프로토콜의 전달 서비스를 이용하므로 상위 계층이라고 할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ICMP/IGMP/OSPF는 IP의 상위 프로토콜(같은 계층이지만)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로토콜의 헤더가 IP 패킷의 데이터에 해당&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1 &amp;rarr; ICMP, 2 &amp;rarr; IGMP, 6 &amp;rarr; TCP, 17 &amp;rarr; UDP, 89 &amp;rarr; OSPF&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검사합(checksum)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;16비트&lt;/li&gt;
&lt;li&gt;오류 확인을 위한 검사합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발신지 주소(source address)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;32비트&lt;/li&gt;
&lt;li&gt;발신지의 IP 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지 주소(destination address)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;32비트&lt;/li&gt;
&lt;li&gt;목적지의 IP 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 8비트가 다음과 같은 IP 패킷이 도착 (01000010)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수신자가 이 패킷을 폐기하는 이유를 설명하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답(풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽의 4비트가 HLEN에 해당하는 부분인데 이는 2 * 4 = 8바이트로 헤더의 최소 바이트 수인 20에 미치지 못함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HLEN의 값이 2진수로 1000. 이 패킷에 옵션이 몇 바이트 있는지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답(풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HLEN의 값은 8이고 이는 헤더 내 총 바이트 수가 32바이트임을 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주 헤더가 20바이트이므로 옵션은 12바이트가 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IPv6 데이터그램&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 헤더 40바이트, 페이로드(최대 65535 바이트)로 구성&lt;/li&gt;
&lt;li&gt;페이로드: 선택적인 확장 헤더 + 상위 계층에서 온 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4비트&lt;/li&gt;
&lt;li&gt;IP의 버전 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트래픽 클래스(traffic class)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;8비트&lt;/li&gt;
&lt;li&gt;페이로드 구분하는 데 쓰임&lt;/li&gt;
&lt;li&gt;IPv4의 서비스 클래스(TOS) 필드를 대신함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흐름 레이블(flow label)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;20비트&lt;/li&gt;
&lt;li&gt;패킷들의 흐름에 대한 특성&lt;/li&gt;
&lt;li&gt;기본적으로 0, 실시간 데이터의 트래픽을 나타내기 위해 0이 아닌 값으로 설정&lt;/li&gt;
&lt;li&gt;IPv6에서 연결형 서비스를 제공하기 위해 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IPv4에서는 MPLS라는 별도의 헤더를 통해 연결형 서비스 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이로드 길이&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;16비트&lt;/li&gt;
&lt;li&gt;기본 헤더를 제외한 IP 데이터그램의 전체 길이를 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 헤더&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;8비트&lt;/li&gt;
&lt;li&gt;데이터그램에서 기본 헤더 다음의 헤더를 정의&lt;/li&gt;
&lt;li&gt;IP에 의해 이용되는 선택적인 확장 헤더 또는 상위 계층 프로토콜을 위한 헤더&lt;/li&gt;
&lt;li&gt;기본 고정 헤더 뒤 선택적인 확장 헤더가 뒤따라올 수 O&lt;/li&gt;
&lt;li&gt;기본헤더만 라우터에서 처리, 확장 헤더는 종류에 따라 처리 방식 다름&lt;/li&gt;
&lt;li&gt;헤더 확장 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;옵션 헤더가 없을 경우 바로 이어서 페이로드 영역에 헤더와 데이터가 옴&lt;/li&gt;
&lt;li&gt;옵션 헤더가 있을 경우 그에 맞는 옵션을 추가하기(여러번 추가할 수도 있음)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본헤더 이후의 확장 헤더들은 모두 페이로드 영역에 들어감&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;홉 제한&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;8비트&lt;/li&gt;
&lt;li&gt;IPv4의 TTL 필드와 같은 목적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발신지 주소&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;16바이트(128비트)&lt;/li&gt;
&lt;li&gt;데이터그램의 원래 발신지 주소 식별&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지 주소&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;16바이트(128비트)&lt;/li&gt;
&lt;li&gt;최종 목적지&lt;/li&gt;
&lt;li&gt;발신지 라우팅 사용되면 이 필드는 다음 라우터 주소 기재&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;흐름 레이블&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IPv4: MPLS라는 별도의 헤더(필드)를 사용해 IPv4 패킷 캡슐화&lt;/li&gt;
&lt;li&gt;IPv6: 흐름 레이블이 데이터그램 형식에 추가되어 연결형 서비스를 디폴트로 포함시켜 데이터그램 설계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 흐름 레이블은 발신지 호스트에 의해 패킷에 할당됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트가 흐름 레이블을 제공하지 않으면 이 필드를 0으로 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일 흐름에 속하는 모든 패킷은 동일한 조건에서 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IPv4와 IPv6 헤더 비교&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IPv6에서 헤더의 길이는 고정됨 &amp;rarr; 헤더 길이 필드 X&lt;/li&gt;
&lt;li&gt;IPv6에서 서비스 유형 필드(TOS) 없음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트래픽 클래스와 흐름 레이블 필드가 기능을 대신함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IPv6에 총 길이 필드 X, 페이로드 길이 필드로 대체&lt;/li&gt;
&lt;li&gt;식별, 플래그, 단편화 옵셋 필드가 IPv6 기본 헤더에 X, 단편화 확장 헤더에 포함&lt;/li&gt;
&lt;li&gt;IPv4에서의 TTL필드 &amp;rarr; IPv6에서의 홉 제한&lt;/li&gt;
&lt;li&gt;프로토콜 필드(IPv4) &amp;rarr; 다음 헤더 필드(IPv6)&lt;/li&gt;
&lt;li&gt;헤더 검사합은 상위 계층 프로토콜에서 제공되므로 IPv6에서는 필요X&lt;/li&gt;
&lt;li&gt;IPv4의 옵션 필드(헤더 영역) &amp;rarr; IPv6의 확장 헤더(페이로드 영역)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단편화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터그램의 크기를 MTU 이하로 작게 나누어 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최대 전달 단위(MTU)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터그램의 크기는 MTU보다 작아야 함&lt;/li&gt;
&lt;li&gt;네트워크 프로토콜마다 값이 다름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식별자&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;16비트&lt;/li&gt;
&lt;li&gt;동일한 데이터그램의 식별을 위한 값(같은 데이터그램인지 확인)&lt;/li&gt;
&lt;li&gt;식별자 유일성 보장 &amp;rarr; 카운터 사용 (1씩 증가)&lt;/li&gt;
&lt;li&gt;목적지에서 데이터그램을 재조립시 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플래그&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3비트&lt;/li&gt;
&lt;li&gt;첫 비트 사용 X&lt;/li&gt;
&lt;li&gt;2번째 비트: do not fragment &amp;rarr; 1인 경우 단편화 금지
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1인 경우 단편화가 필요하면 데이터그램 폐기하고 ICMP 메시지를 발신지 호스트로 전송해 오류 상황 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3번째 비트: more fragment &amp;rarr; 1인 경우 마지막 단편이 아니라는 뜻&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단편화 옵셋&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;13비트&lt;/li&gt;
&lt;li&gt;전체 데이터그램 내에서 단편의 상대적 위치&lt;/li&gt;
&lt;li&gt;원래의 데이터그램 내에서 데이터의 옵셋을 8바이트 단위로 나타냄&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;옵션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고정된 기본 헤더 부분(20바이트)과 가변인 옵션 부분(0~40바이트)으로 나뉨&lt;/li&gt;
&lt;li&gt;최대 길이는 40바이트, 32비트(4바이트)의 배수가 되도록 패딩됨&lt;/li&gt;
&lt;li&gt;네트워크를 시험하거나 디버그하기 위해 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유형 필드, 길이 필드, 가변 길이의 값 필드로 구성&lt;/li&gt;
&lt;li&gt;TLV라고 함 (Type-Length-Value)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유형(Type)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복사
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1비트&lt;/li&gt;
&lt;li&gt;단편화에 옵션을 포함시킬 것인지 제어&lt;/li&gt;
&lt;li&gt;0: 첫번째 단편에만 복사&lt;/li&gt;
&lt;li&gt;1: 모든 단편에 복사&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;클래스
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2비트&lt;/li&gt;
&lt;li&gt;옵션의 목적 정의&lt;/li&gt;
&lt;li&gt;첫 번째 비트만 의미를 가짐
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;00: 데이터그램의 제어에 사용&lt;/li&gt;
&lt;li&gt;10: 디버그나 관리 목적&lt;/li&gt;
&lt;li&gt;01, 11: 정의 X&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;번호
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5비트&lt;/li&gt;
&lt;li&gt;옵션의 유형 정의
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;32개의 유형 정의할 수 있지만 현재 6개의 유형만 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이(Length)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 필드와 길이 필드를 포함한 옵션의 전체 길이 정의&lt;/li&gt;
&lt;li&gt;모든 옵션 유형에 있지 X&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값(Value)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특별한 옵션이 필요로 하는 데이터 포함&lt;/li&gt;
&lt;li&gt;모든 옵션 유형에 있지 X&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션 유형&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;6개의 값만 실제로 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2개: 1바이트 옵션, 길이나 데이터 필드 필요 X&lt;/li&gt;
&lt;li&gt;4개: 다중 바이트 옵션, 길이와 데이터 필드 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1바이트 옵션 유형&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;No Operation
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;옵션들 사이의 여백을 채워줌
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;송신측이 필드를 4바이트의 배수가 되도록 채우기 위함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;End of Option
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;옵션의 필드 끝에 패딩할 목적으로 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마지막 옵션으로만 사용 가능&lt;/li&gt;
&lt;li&gt;오직 하나의 옵션 종료만 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;옵션 필드의 경계를 맞추기 위해 1바이트 이상 필요하면 No Operation 사용 후 마지막에 End of Option 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다중 바이트 옵션 유형&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Record Route 옵션
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터그램을 처리한 인터넷 라우터들을 기록
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;40바이트에 최대 9개의 IP 주소 기록 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;발신지는 공간을 미리 준비(방문되는 라우터에 채워질 수 있는 공간)&lt;/li&gt;
&lt;li&gt;유형과 길이 필드: 앞의 형식과 동일&lt;/li&gt;
&lt;li&gt;포인터 필드: 사용 가능한 첫 번째 빈 엔트리의 위치 정보 포함&lt;/li&gt;
&lt;li&gt;데이터그램을 가지고 있는 라우터는 포인터 필드의 값과 길이 필드 비교
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포인터 값 초기에 4로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비교 결과에 따라 자신의 IP 주소를 빈 필드에 넣음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포인터 필드의 값이 길이보다 크면 새로운 IP를 추가할 수 X&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IP를 기록할 때 포인터 값 4만큼 증가 (길이는 byte 단위)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Strict Source Route 옵션
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;경로를 미리 지정&lt;/li&gt;
&lt;li&gt;비용 면에서 장점&lt;/li&gt;
&lt;li&gt;대부분 사용자는 결과적으로 이 옵션 사용할 수 X (인터넷의 물리적인 접속형태를 모르므로)&lt;/li&gt;
&lt;li&gt;송신자가 모든 IP 주소 지정한 점 제외 Record Route 옵션과 유사&lt;/li&gt;
&lt;li&gt;라우터는 포인터의 값과 길이 값 비교&lt;/li&gt;
&lt;li&gt;포인터 값 &amp;lt; 길이 값 &amp;rarr; 라우터는 포인터가 가리키고 있는 IP 주소와 데이터그램이 들어온 IP 주소 비교
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포인터 값 &amp;gt; 길이 값: 지정된 라우터 모두 방문했음&lt;/li&gt;
&lt;li&gt;더 이상 이동 X, 데이터그램 폐기 &amp;amp; 오류 메시지 발송&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IP주소가 같다면 데이터그램 처리, 다르다면 현재 IP 주소를 나가는 IP 주소로 대치, 포인터 4만큼 증가, 데이터그램 계속 전달
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목적지까지 도착했는데 IP 주소가 다른 경우(지정된 경로와 다르게 도착) 데이터그램 폐기 &amp;amp; 오류 메시지 발송&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Loose Source Route 옵션
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Strict Source Route와 경로 비슷&lt;/li&gt;
&lt;li&gt;리스트 속의 라우터는 반드시 방문해야 하나 리스트에 없는 라우터 방문도 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Timestamp 옵션
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우터가 데이터그램을 처리하는 시간을 기록&lt;/li&gt;
&lt;li&gt;세계 표준시 자정으로부터의 milisecond 단위 표시&lt;/li&gt;
&lt;li&gt;하나의 라우터에서 다른 라우터까지 가는데 걸리는 시간 추정 가능&lt;/li&gt;
&lt;li&gt;code 0100100 &amp;rarr; copy=1, class=10, number=00100(timestamp)&lt;/li&gt;
&lt;li&gt;overflow 필드: 공간 부족으로 타임스탬프를 기록하지 못한 라우터의 수&lt;/li&gt;
&lt;li&gt;플래그 필드: 방문된 라우터의 의무
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0: 타임스탬프만 추가&lt;/li&gt;
&lt;li&gt;1: 나가는 IP 주소와 타임스탬프 기록&lt;/li&gt;
&lt;li&gt;3: 주어진 IP 주소와 데이터그램이 들어오는 IP 주소 비교, 같으면 라우터 IP 주소에 자신의 나가는 IP 주소를 덮어쓰고 타임스탬프 추가 (경로가 미리 지정된 경우 더 정확하게 측정)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;검사합&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 TCP/IP 프로토콜에 의해 사용되는 오류 검출 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패킷의 전달 중에 발생할 수 있는 오류에 대한 보호&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;송신자에 의해 계산, 패킷과 함께 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수신자는 패킷에 대해 동일한 값 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 만족되면 받아들여짐, 그렇지 않으면 폐기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;송신자의 검사합 계산&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메시지 16비트 워드로 구분&lt;/li&gt;
&lt;li&gt;검사합 워드의 초기값 0&lt;/li&gt;
&lt;li&gt;검사합을 포함한 모든 워드를 더한 후 1의 보수 취하기&lt;/li&gt;
&lt;li&gt;그 최종값이 검사합&lt;/li&gt;
&lt;li&gt;검사합 + 데이터 함께 송신&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수신자의 검사합 계산&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검사합이 포함된 수신 메시지를 16비트 워드 단위로 구분&lt;/li&gt;
&lt;li&gt;모든 워드를 더하고 1의 보수 취함&lt;/li&gt;
&lt;li&gt;그 최종값이 새로운 검사합&lt;/li&gt;
&lt;li&gt;검사합의 값이 0이면 오류 X (0이 아니면 오류 O)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검사합을 헤더에 대해서만 계산하는 이유&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;헤더는 라우터를 방문할 때마다 변경될 수 있는 부분으로, 무결성 확인 필요&lt;/li&gt;
&lt;li&gt;데이터가 포함되면 많은 처리 시간 필요 (비용 관점)&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부 기록/네트워크 보안</category>
      <author>도도히히</author>
      <guid isPermaLink="true">https://thisisme0101.tistory.com/18</guid>
      <comments>https://thisisme0101.tistory.com/18#entry18comment</comments>
      <pubDate>Tue, 11 Nov 2025 00:14:59 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크 보안] IP 패킷 전달과 포워딩</title>
      <link>https://thisisme0101.tistory.com/17</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;연결형과 비연결형 서비스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연결형 서비스&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패킷을 보내기 전에 목적지의 네트워크층 프로토콜과 연결 설정(경로 설정에 의해)&lt;/li&gt;
&lt;li&gt;연결 설정되면 발신지에서 목적지로 패킷들 전달
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순서대로 하나씩 전달&lt;/li&gt;
&lt;li&gt;모든 패킷은 같은 경로를 통해 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메시지에 속한 모든 패킷이 전달되면 연결 해제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비연결형 서비스&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 패킷은 서로 독립적으로 처리&lt;/li&gt;
&lt;li&gt;같은 목적지에 전달되더라도 서로 다른 경로로 전달될 수 있음&lt;/li&gt;
&lt;li&gt;IP 프로토콜은 비연결형 프로토콜&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전달&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전달을 위한 네트워크층의 역할&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;물리적인 네트워크에 의해 패킷이 처리되는 과정 감독&lt;/li&gt;
&lt;li&gt;패킷 포워딩을 통해 발신지에서 목적지까지의 전달 이루어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전달 방법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;직접 전달&lt;/li&gt;
&lt;li&gt;간접 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;직접 전달&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최종 목적지가 전달자와 같은 네트워크에 연결되어 있는 호스트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패킷의 발신지와 목적지가 같은 네트워크에 위치&lt;/li&gt;
&lt;li&gt;최종 라우터와 목적지 호스트 사이에 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;직접 전달여부 확인 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목적지 주소에서 netid 추출한 후 현 네트워크 주소와 비교&lt;/li&gt;
&lt;li&gt;같은 경우 송신자는 목적지 IP 주소를 이용해 목적지 물리 주소를 찾아서(ARP 이용) 데이터 링크층으로 보내어 패킷 직접 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;간접 전달&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최종 목적지가 발신지와 같은 네트워크에 속해있지 않은 호스트&lt;/li&gt;
&lt;li&gt;여러 라우터를 경유해서 전달 (최종 목적지와 같은 네트워크에 연결된 라우터에 도달할 때까지)&lt;/li&gt;
&lt;li&gt;목적지 IP주소와 라우팅 테이블 이용해 다음 라우터의 IP 주소 찾기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;포워딩&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포워딩이란&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패킷을 목적지로 가는 경로상에 놓는 것
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패킷을 다음 홉(최종 목적지 또는 중간 연결 장치)으로 전달하는 것을 의미함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비연결형 vs 연결형 프로토콜에서의 포워딩
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비연결형 프로토콜: 목적지 주소 기반&lt;/li&gt;
&lt;li&gt;연결형 프로토콜: 레이블 기반&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목적지 주소 기반 포워딩
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;next-hop method&lt;/li&gt;
&lt;li&gt;network-specific method&lt;/li&gt;
&lt;li&gt;host-specific method&lt;/li&gt;
&lt;li&gt;default method&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;레이블 기반 포워딩&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;next-hop method&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블을 가장 작게 만드는 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 홉 주소만 저장 (전체 경로 정보 대신)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;network-specific method&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 네트워크에 연결된 모든 호스트 별 엔트리 대신 네트워크 주소 지정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우팅 테이블 작게 만드는 효과 제공&lt;/li&gt;
&lt;li&gt;검색 과정 간단해짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;host-specific method&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블에 목적지 주소 저장&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;network-specific method의 반대&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자가 네트워크 제어 시 효과적&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개별 호스트를 별도로 관리해야 하는 경우 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;default method&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명시되지 않은 목적지 처리 방법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;next hop 지정이 가능한 목적지 외의 나머지 목적지를 처리하는 경우 default로 명시하고 next hop 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서브넷팅 없는 클래스 기반 주소 지정에서 포워딩 모듈&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 기반 주소체계에서 인터넷의 라우터들은 서브넷팅에 관여하지 X&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서브넷팅은 조직 내에서 일어남&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블에서 관리되는 테이블 정보&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스 A, B, C별로 하나씩 전체적으로 3개의 테이블 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우터가 멀티캐스팅 지원 시 D 클래스 처리를 위한 테이블 한 개 추가됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각 테이블에 필요한 정보
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 주소: 목적지 호스트가 어디에 위치하고 있는지 알려줌&lt;/li&gt;
&lt;li&gt;다음 홉 주소: 간접 전달의 경우 패킷이 어느 라우터에 전달되어야 하는지 알려줌&lt;/li&gt;
&lt;li&gt;인터페이스 번호: 패킷이 나가는 출력 포트를 정의함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패킷 포워딩 과정&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클래스 찾기 (by 목적지 주소)&lt;/li&gt;
&lt;li&gt;네트워크 주소 찾기 (by 클래스, 목적지 주소)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매칭되는 네트워크 주소가 라우팅 테이블에 없을 경우 디폴트 라우터로 포워딩&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다음 홉 주소 추출 (by 클래스, 네트워크 주소)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;간접 연결일 경우에는 다음 홉 주소가 따로 있지만, 직접 연결일 경우에는 목적지 주소가 다음 홉 주소가 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다음 홉 주소와 인터페이스 번호를 ARP에 보냄&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex) 라우팅 테이블 작성하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 B&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 55.9302%; height: 54px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 15.5495%; height: 20px;&quot;&gt;네트워크 주소&lt;/td&gt;
&lt;td style=&quot;width: 17.9389%; height: 20px;&quot;&gt;다음 홉 주소&lt;/td&gt;
&lt;td style=&quot;width: 22.4419%; height: 20px;&quot;&gt;인터페이스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 15.5495%; height: 17px;&quot;&gt;145.80.0.0&lt;/td&gt;
&lt;td style=&quot;width: 17.9389%; height: 17px;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;width: 22.4419%; height: 17px;&quot;&gt;m1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 15.5495%; height: 17px;&quot;&gt;170.14.0.0&lt;/td&gt;
&lt;td style=&quot;width: 17.9389%; height: 17px;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;width: 22.4419%; height: 17px;&quot;&gt;m2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디폴트 라우터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;default: 110.30.31.18, m0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터 R1이 목적지 주소 192.16.7.14를 가진 패킷을 받은 경우 패킷이 포워딩 되는 과정을 보이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답(풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스는 C (192로 시작)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 주소는 192.16.7.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일치하는 주소를 찾았다면 다음 홉 주소와 인터페이스 번호를 ARP에 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(여기서는 다음 홉 주소: 111.15.17.32, 인터페이스 번호: m0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt; (위의 예제와 같은 네트워크 구조도)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터 R1이 목적지 주소 167.24.160.5를 가진 패킷을 받은 경우 패킷이 포워딩 되는 과정을 보이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답(풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스는 B (167로 시작)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 주소는 167.24.0.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일치하는 주소가 라우팅 테이블에 없으므로 패킷은 디폴트 라우터로 포워딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다읍 홉 주소: 111.30.31.18, 인터페이스 번호: m0&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서브넷팅이 있는 경우 클래스 기반 주소 지정에서 포워딩 모듈&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷팅은 조직 내에서 수행&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서브넷팅을 처리하는 라우터는 조직 사이트와 외부와의 경계에 존재&lt;/li&gt;
&lt;li&gt;가변 길이의 서브넷팅을 사용하면 여러 개의 테이블이 필요
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고정 길이 서브넷팅을 수행하면 하나의 테이블만 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패킷 포워딩 과정&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클래스 찾기 (by 목적지 주소)&lt;/li&gt;
&lt;li&gt;서브넷 주소 찾기 (by 마스크)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일치하는 주소가 테이블에 없을 경우, 디폴트 라우터 주소를 사용해 패킷을 라우터에 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다음 홉 주소와 인터페이스 번호를 ARP에 보내기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때, 서브넷팅의 경우 라우터와 직접 연결되어 있어 목적지 주소가 다음 홉 주소가 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex) 라우팅 테이블 작성&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 58.2558%; height: 102px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.6279%; height: 17px;&quot;&gt;네트워크 주소&lt;/td&gt;
&lt;td style=&quot;width: 20.3488%; height: 17px;&quot;&gt;다음 홉 주소&lt;/td&gt;
&lt;td style=&quot;width: 16.1628%; height: 17px;&quot;&gt;인터페이스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 21.6279%;&quot;&gt;145.14.0.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 20.3488%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 16.1628%;&quot;&gt;m0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 21.6279%;&quot;&gt;145.14.64.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 20.3488%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 16.1628%;&quot;&gt;m1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 21.6279%;&quot;&gt;145.14.128.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 20.3488%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 16.1628%;&quot;&gt;m2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 21.6279%;&quot;&gt;145.14.192.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 20.3488%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 16.1628%;&quot;&gt;m3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 21.6279%;&quot;&gt;0.0.0.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 20.3488%;&quot;&gt;default router&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 16.1628%;&quot;&gt;m4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터가 목적지 주소 145.14.32.78를 가진 패킷을 처리하는 과정 보이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답(풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷 마스크: 255.255.192.0 (18개의 1과 14개의 0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 주소는 145.14.0.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패킷은 다음 홉 주소 145.14.32.78와 출력 인터페이스 m0 두 값을 ARP에 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;145.14.0.0 내의 호스트가 주소 7.22.67.91인 호스트로 보내는 패킷을 수신했는데 패킷이 어떻게 전달되는지 보이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답(풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림을 보았을 때 마스크는 /18&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 주소는 7.22.64.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블에서 일치하는 주소가 없으므로 디폴트 라우터로 포워딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디폴트 라우터 주소를 사용해 패킷을 라우터에 전달 (다음 홉 주소가 디폴트 라우터를 향하는 주소인데 그림에 나와있진 않고 인터페이스 번호는 m4)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;클래스 없는 주소체계에서 포워딩&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 없는 주소체계에서 전체 주소 공간은 한 개의 개체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 클래스가 있는 주소체계에서는 클래스 별로 테이블을 나누기 때문에 네트워크 id의 길이를 명시적으로 알 수 있지만, 클래스가 없는 주소체계에서는 한 개의 개체로 보기 때문에 테이블도 한 개로 나타냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블은 네트워크 주소(블록의 첫 번째 주소)에 기반하여 탐색&lt;/li&gt;
&lt;li&gt;패킷의 목적지 주소는 네트워크 주소에 대한 힌트를 주지 X
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블에 추가적으로 마스크(/n) 정보가 필요&lt;/li&gt;
&lt;li&gt;결과적으로 적어도 테이블은 4개의 열이 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패킷 포워딩 방법&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;마스크 길이가 긴 것부터 목적지 주소에 적용해 네트워크 주소 구하기&lt;/li&gt;
&lt;li&gt;부합되는 주소 있는지 테이블에서 체크 (아예 없으면 디폴트 마스크로)&lt;/li&gt;
&lt;li&gt;다음 홉 주소(직접 연결일 경우 목적지 주소가 될 수도 O), 인터페이스 번호를 ARP에 보냄&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex) 라우팅 테이블 작성&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 76.6279%; height: 106px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 13.4884%;&quot;&gt;마스크&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 23.1395%;&quot;&gt;네트워크 주소&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 21.1628%;&quot;&gt;다음 홉 주소&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 18.6047%;&quot;&gt;인터페이스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 13.4884%;&quot;&gt;/26&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 23.1395%;&quot;&gt;180.70.65.192&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 21.1628%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 18.6047%;&quot;&gt;m2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 13.4884%;&quot;&gt;/25&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 23.1395%;&quot;&gt;180.70.65.128&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 21.1628%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 18.6047%;&quot;&gt;m0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 13.4884%;&quot;&gt;/24&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 23.1395%;&quot;&gt;201.4.22.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 21.1628%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 18.6047%;&quot;&gt;m3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 13.4884%;&quot;&gt;/22&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 23.1395%;&quot;&gt;201.4.16.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 21.1628%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 18.6047%;&quot;&gt;m1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 13.4884%;&quot;&gt;default&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 23.1395%;&quot;&gt;default&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 21.1628%;&quot;&gt;180.70.65.200&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 18.6047%;&quot;&gt;m2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R1에 목적지 주소 180.70.65.140를 가진 패킷이 도착한 경우, 해당 패킷의 포워딩 과정 보이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답(풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지 주소에 /26 적용 &amp;rarr; 네트워크 주소는 180.70.65.128 (일치하는 네트워크 주소 X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지 주소에 /25 적용 &amp;rarr; 네트워크 주소는 180.70.65.128 (일치하는 네트워크 주소 O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 홉 주소인 180.70.65.140와 인터페이스 m0을 ARP에 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터 R1에 목적지 주소 201.4.22.35를 가진 패킷이 도착한 경우 포워딩 처리 과정 보이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답(풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지 주소에 /26 적용 &amp;rarr; 네트워크 주소는 201.4.22.0 (일치하는 네트워크 주소 X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지 주소에 /25 적용 &amp;rarr; 네트워크 주소는 201.4.22.0 (일치하는 네트워크 주소 X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지 주소에 /24 적용 &amp;rarr; 네트워크 주소는 201.4.22.0 (일치하는 네트워크 주소 O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 홉 주소인 201.4.22.35와 인터페이스 m3을 ARP에 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R1에 목적지 주소 18.24.32.78를 가진 패킷이 도착한 경우 포워딩 처리 과정 보이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답(풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지 주소에 /26, /25, /24, /22를 모두 적용해도 일치하는 네트워크 주소를 찾을 수 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(디폴트 라우터를 통해 외부 인터넷으로 보내야 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;180.70.65.200와 인터페이스 m2를 ARP에 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블을 기반으로 네트워크 구조도 그리기&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 66.3953%; height: 112px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.3256%;&quot;&gt;마스크&lt;/td&gt;
&lt;td style=&quot;width: 19.3024%;&quot;&gt;네트워크 주소&lt;/td&gt;
&lt;td style=&quot;width: 18.6046%;&quot;&gt;다음 홉 주소&lt;/td&gt;
&lt;td style=&quot;width: 16.1627%;&quot;&gt;인터페이스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 12.3256%;&quot;&gt;/26&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 19.3024%;&quot;&gt;140.6.12.64&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 18.6046%;&quot;&gt;180.14.2.5&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 16.1627%;&quot;&gt;m2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 12.3256%;&quot;&gt;/24&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 19.3024%;&quot;&gt;130.4.8.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 18.6046%;&quot;&gt;190.17.6.2&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 16.1627%;&quot;&gt;m1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 12.3256%;&quot;&gt;/16&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 19.3024%;&quot;&gt;110.70.0.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 18.6046%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 16.1627%;&quot;&gt;m0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 12.3256%;&quot;&gt;/16&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 19.3024%;&quot;&gt;180.14.0.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 18.6046%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 16.1627%;&quot;&gt;m2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 12.3256%;&quot;&gt;/16&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 19.3024%;&quot;&gt;190.17.0.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 18.6046%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 16.1627%;&quot;&gt;m1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 12.3256%;&quot;&gt;default&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 19.3024%;&quot;&gt;default&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 18.6046%;&quot;&gt;110.70.4.6&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 16.1627%;&quot;&gt;m0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 홉 주소가 없는 경우, 라우터에 직접 연결됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 홉 주소가 있다는 것은 간접 연결이라는 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스 번호가 같은 것끼리 묶어서 생각하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; /16 110.70.0.0의 경우 이 뒤에 디폴트 라우터가 올 것임 (디폴트 인터페이스가 m0으로 동일하므로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; /16 180.14.0.0의 경우 이 뒤에 라우터가 오는데 이 라우터는 같은 인터페이스 m2인 /26 140.6.12.64와 연결될 것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; /16 190.17.0.0의 경우 이 뒤에 오는 라우터는 같은 인터페이스 m1인 /24 130.4.8.0과 연결될 것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 힌트를 기반으로 그리기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주소 집단화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 인터페이스를 사용하는 주소 중 집단으로 처리할 수 있는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 크기가 증가하고 탐색 시간이 증가하는 것을 완화해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 집단으로 처리할 때의 마스크는 네트워크 주소의 길이를 의미하는 것은 아님&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; /24 140.24.7.0의 경우 네트워크 주소가 24비트라는 것을 의미 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가장 긴 마스크 부합&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유사한 네트워크 주소를 가지나 같은 라우팅 경로를 가지지 않는 경우를 위한 대응 방법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마스크 길이가 긴 것부터 부합 적용&lt;/li&gt;
&lt;li&gt;&amp;ldquo;긴 마스크 = 높은 일치도&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;묶어서 처리할 수 없는 것(이면서 마스크 길이가 가장 긴 것)을 테이블의 맨 위에 작성하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;묶어서 처리할 수 있는 것들은 공통된 부분까지만 쓰고 그 부분까지의 n을 마스크로 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 71.9767%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.8372%;&quot;&gt;마스크&lt;/td&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;네트워크 주소&lt;/td&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;다음 홉 주소&lt;/td&gt;
&lt;td style=&quot;width: 16.279%;&quot;&gt;인터페이스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.8372%;&quot;&gt;/26&lt;/td&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;140.24.7.192&lt;/td&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;width: 16.279%;&quot;&gt;m1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.8372%;&quot;&gt;/24&lt;/td&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;140.24.7.0&lt;/td&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;width: 16.279%;&quot;&gt;m0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.8372%;&quot;&gt;/?&lt;/td&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;?&lt;/td&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;?&lt;/td&gt;
&lt;td style=&quot;width: 16.279%;&quot;&gt;m1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.8372%;&quot;&gt;/0&lt;/td&gt;
&lt;td style=&quot;width: 22.3255%;&quot;&gt;0.0.0.0&lt;/td&gt;
&lt;td style=&quot;width: 19.4186%;&quot;&gt;default router&lt;/td&gt;
&lt;td style=&quot;width: 16.279%;&quot;&gt;m2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 길이를 읽어 개별적으로 관리해야 하는 네트워크를 우선하여 처리&lt;/p&gt;
&lt;table style=&quot;letter-spacing: 0px; border-collapse: collapse; width: 74.4176%; height: 85px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 11.9767%;&quot;&gt;마스크&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 23.2558%;&quot;&gt;네트워크 주소&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 21.2319%;&quot;&gt;다음 홉 주소&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 17.8378%;&quot;&gt;인터페이스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 11.9767%;&quot;&gt;/26&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 23.2558%;&quot;&gt;140.24.7.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 21.2319%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 17.8378%;&quot;&gt;m0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 11.9767%;&quot;&gt;/26&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 23.2558%;&quot;&gt;140.24.7.64&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 21.2319%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 17.8378%;&quot;&gt;m1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 11.9767%;&quot;&gt;/26&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 23.2558%;&quot;&gt;140.24.7.128&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 21.2319%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 17.8378%;&quot;&gt;m2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; width: 11.9767%;&quot;&gt;/0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 23.2558%;&quot;&gt;0.0.0.0&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 21.2319%;&quot;&gt;default router&lt;/td&gt;
&lt;td style=&quot;height: 17px; width: 17.8378%;&quot;&gt;m3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>공부 기록/네트워크 보안</category>
      <author>도도히히</author>
      <guid isPermaLink="true">https://thisisme0101.tistory.com/17</guid>
      <comments>https://thisisme0101.tistory.com/17#entry17comment</comments>
      <pubDate>Mon, 10 Nov 2025 22:07:14 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크 보안] IP 주소</title>
      <link>https://thisisme0101.tistory.com/16</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주소 공간&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터넷에 연결된 각 장치 식별자: IP 주소&lt;/li&gt;
&lt;li&gt;IPv4 주소: 32비트 길이&lt;/li&gt;
&lt;li&gt;주소 공간: 2^32 또는 약 43억&lt;/li&gt;
&lt;li&gt;인터넷에서 유일한 식별자&lt;/li&gt;
&lt;li&gt;인터넷상에 두 개의 장치가 같은 주소를 가질 수 X&lt;/li&gt;
&lt;li&gt;2진 표기법, 16진 표기법, 점-10진 표기법&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;표기법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2진 표기법 &amp;rarr; 점-10진 표기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 10000001 00001011 00001011 11101111 &amp;rarr; 129.11.11.239&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점-10진 표기법 &amp;rarr; 2진 표기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 111.56.45.78 &amp;rarr; 01101111 00111000 00101101 01001110&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2진 표기법 &amp;rarr; 16진 표기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 10000001 00001011 00001011 11101111 &amp;rarr; 0x(또는 0X)810B0BEF (또는 맨끝에 아래첨자 16 붙이기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주소의 범위&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음 주소와 마지막 주소가 주어지면, 범위 내 주소 개수를 찾는 것이 필요&lt;/li&gt;
&lt;li&gt;처음 주소, 마지막 주소, 범위 내 주소 개수(해당되는 주소에 몇 개의 식별자가 있는지)를 구할 수 있어야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범위 내의 주소의 개수는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 주소: 146.102.29.0, 마지막 주소: 146.102.32.255&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 주소에서 시작 주소를 빼고 결과에 1을 더하면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0.0.3.255, 3 * 256 + 255 * 1 + 1 = 1024&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클래스 기반 주소 지정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5개(A, B, C, D, E)의 클래스로 구분&lt;/li&gt;
&lt;li&gt;A가 전체의 50%, B가 전체의 25%, C가 전체의 12.5%, D와 E가 각각 전체의 6.25% 차지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 &lt;b&gt;구분 방법&lt;/b&gt;: &lt;b&gt;무엇으로 시작하는지&lt;/b&gt;에 따라 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 구분 2진 표현 10진 표현&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 49.1858%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.8317%;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 8.70438%;&quot;&gt;0&amp;hellip;&amp;hellip;.&lt;/td&gt;
&lt;td style=&quot;width: 20.7112%;&quot;&gt;0-127&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.8317%;&quot;&gt;B&lt;/td&gt;
&lt;td style=&quot;width: 8.70438%;&quot;&gt;10&amp;hellip;&amp;hellip;&lt;/td&gt;
&lt;td style=&quot;width: 20.7112%;&quot;&gt;128-191&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.8317%;&quot;&gt;C&lt;/td&gt;
&lt;td style=&quot;width: 8.70438%;&quot;&gt;110&amp;hellip;..&lt;/td&gt;
&lt;td style=&quot;width: 20.7112%;&quot;&gt;192-223&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.8317%;&quot;&gt;D&lt;/td&gt;
&lt;td style=&quot;width: 8.70438%;&quot;&gt;1110&amp;hellip;.&lt;/td&gt;
&lt;td style=&quot;width: 20.7112%;&quot;&gt;224-239&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.8317%;&quot;&gt;E&lt;/td&gt;
&lt;td style=&quot;width: 8.70438%;&quot;&gt;1111&amp;hellip;.&lt;/td&gt;
&lt;td style=&quot;width: 20.7112%;&quot;&gt;240-255&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소의 클래스 나타내기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 10100111 11011011 10001011 01101111 의 클래스는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10으로 시작하므로 클래스 B 주소에 해당됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 227.12.14.87 의 클래스는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;227로 시작하므로 클래스 D 주소에 해당됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스에 따라 netid와 hostid 길이가 다름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 A의 블록&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netid 길이: 1바이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 왼쪽 비트 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7비트로 나타내는 블록의 수: 2^7=128&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록에 속한 주소 수: 2^24개 (=3바이트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2^24개의 호스트를 네트워크 내에서 표현할 수 O&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 A 주소는 거의 소진됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 B의 블록&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netid 길이: 2바이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 두 비트 10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14비트로 나타내는 블록의 수: 2^14 = 16,384&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 블록에 속한 주소 수: 2^16 개 (=2바이트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2^16개의 호스트를 네트워크 내에서 표현할 수 O&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 B 주소도 거의 소진됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 C의 블록&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netid 길이: 3바이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 세 비트 110&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21비트로 나타내는 블록의 수: 2^21&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 블록에 속한 주소 수: 2^8 = 256개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C 클래스 블록이 충분할 만큼 작은 기관이 많지 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 D에 있는 단일 블록&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 블록만 있으며 멀티캐스팅을 위해 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷상에 호스트들의 그룹 지정하는 데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 E에 있는 단일 블록&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 블록만 있으며 향후 사용을 위해 예약 (예비용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 내의 모든 주소는 한 블록에 속함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 주소는 netid와 hostid를 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netid: 네트워크 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hostid: 네트워크에 연결된 특정 호스트 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netid의 길이를 n이라고 할 때, hostid의 길이는 32-n&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 주소의 수 N=2^(32-n)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추출 가능한 정보의 종류&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주소의 수&lt;/li&gt;
&lt;li&gt;첫 번째 주소 (네트워크를 식별하는 주소로 활용)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왼쪽 n비트 유지, 오른쪽 32-n 비트 전부 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;마지막 주소 (네트워크 내에서만 브로드캐스팅할 특수 목적으로 활용)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왼쪽 n비트 유지, 오른쪽 32-n 비트 전부 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;180.8.17.9가 속한 블록의 첫 번째 주소와 마지막 주소는?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;답(풀이)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;180으로 시작하므로 클래스 B에 해당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 B의 netid 길이는 16이므로 n=16&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록의 주소의 수는 2^16 = 65,536&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 주소: 왼쪽 16비트는 유지하고 오른쪽 16비트는 전부 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 주소: 왼쪽 16비트는 유지하고 오른쪽 16비트는 전부 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 첫 번째 주소: 180.8.0.0, 마지막 주소: 180.8.255.255&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록의 첫 번째 주소는 네트워크 주소(네트워크의 식별자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지(가 속한 네트워크)로 패킷을 전송하는 데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;네트워크 마스크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지 주소를 이용하여 네트워크 주소를 찾아내는 데 사용, &lt;b&gt;디폴트 마스크&lt;/b&gt;라고도 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 A: 255.0.0.0, 클래스 B: 255.255.0.0, 클래스 C:255.255.255.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지 주소와 디폴트 마스크를 비트 AND 연산 수행하여 나온 결과가 네트워크 주소임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터가 목적지 주소 201.24.67.32 패킷을 받았을 때 라우터가 패킷의 네트워크 주소를 찾는 방법 보이기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;답(풀이)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소의 클래스는 C에 해당함(201로 시작) &amp;rarr; 디폴트 마스크: 255.255.255.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비트 AND 연산 결과: 201.24.67.0 (네트워크 주소)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서브넷팅&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블록을 작은 블록으로 나누는 개념으로 네트워크가 몇 개의 작은 서브네트워크(서브넷)로 나뉨&lt;/li&gt;
&lt;li&gt;각 서브넷은 자신의 서브넷 주소를 가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷 필요한 이유: 보안 및 관리 효율을 높이기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷팅에 의한 ID 정보의 변화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netid 길이는 증가, hostid의 길이는 감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subnetid의 길이 = netid의 길이 + log2_s (s는 2의 거듭제곱인 서브넷의 개수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷으로 나누는 만큼 subnetid의 길이는 netid보다 길어질 수밖에 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷 마스크와 네트워크 마스크는 다름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 클래스 B의 주소에서 서브넷팅 전후 차이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷팅 전: 약 2^16개의 호스트를 가짐, netid 길이는 16&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷팅 후: 4개의 서브넷으로 나누어질 때 각 서브넷은 2^14개의 호스트를 가짐, subnetid 길이는 18&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/16과 /18로 나타냄 (각각 netid 길이와 subnetid 길이)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subnetid의 길이가 18일 경우 서브넷 마스크 (18개의 1과 14개의 0): 255.255.192.0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 B의 네트워크 마스크 255.255.0.0과 다름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;슈퍼넷팅&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷팅의 반대 개념&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;슈퍼넷 마스크는 디폴트 마스크보다 1의 개수가 적음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서브넷 마스크는 디폴트 마스크보다 1의 개수가 많음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;여러 개의 C 클래스 결합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 하나의 클래스 C 블록을 8개의 서브블록으로 나눌 때와 8개의 클래스 C 블록을 하나의 슈퍼블록으로 묶을 때 네트워크 마스크의 변화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷 마스크: nsub = 24 + 3 = 27&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디폴트 마스크: n = 24&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슈퍼넷 마스크: nsuper = 24 - 3 = 21&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클래스 기반이 아닌 주소 지정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 클래스 기반 주소 지정 방식의 한계&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로 주소 고갈 문제를 해결하지 못함&lt;/li&gt;
&lt;li&gt;인터넷의 성장에 따라 보다 큰 주소 공간을 확보하는 것이 필요&lt;/li&gt;
&lt;li&gt;장기적인 해결책: IPv6&lt;/li&gt;
&lt;li&gt;단기적인 해결책: 클래스 없는 주소지정 (같은 주소 공간을 사용하지만 주소 분배 방법을 변경)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 기관은 가변길이 블록으로 2^1, 2^2, &amp;hellip; , 2^32 개의 주소를 갖는 블록을 지정할 수 있음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프리픽스 길이는 0에서 32까지&lt;/li&gt;
&lt;li&gt;프리픽스(prefix) = netid, 서픽스(suffix) = hostid&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;슬래시 표기법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리픽스 길이를 주소에 포함하여 표현&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블록 정보를 알기 위해서는 블록 내의 주소와 프리픽스를 알아야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 기반이 아닌 주소 지정에서 주소 정보만을 이용해 주소가 속한 블록을 알 수 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;블록 정보 추출&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록에 속하는 주소의 개수 구하는 방식은 클래스 기반 주소 지정에서의 방법과 동일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N = 2^(32-n) (n은 프리픽스의 길이)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 주소: (블록에 속하는 임의의 주소) AND (네트워크 마스크)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 주소: (블록에 속하는 임의의 주소) OR [NOT (네트워크 마스크)]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;167.199.170.82/27 가 속한 네트워크의 처음과 마지막 주소, 전체 주소의 수 구하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답 (풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/27과 같이 슬래시로 표기했다면 클래스 기반이 아닌 주소 지정 유형이라고 생각하면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 마스크: 27개의 1과 5개의 0이므로, 255.255.255.224&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크에 있는 주소의 수(블록에 속하는 주소의 개수) = 2^5 = 32&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 주소: 167.199.170.64/27&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 주소: 167.199.170.95/27&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;블록 할당&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국제 관리기구인 ICANN 담당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISP에 할당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록 할당 제약 조건(CIDR)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구 주소 n은 2의 거듭제곱&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록에 속한 주소의 수로 프리픽스 길이를 알 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;할당하는 블록에 속한 주소는 연속적이어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISP가 1000개의 주소를 갖는 블록을 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답 (풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1000은 2의 누승이 아니므로, 1024(=2^10)개의 주소가 할당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리픽스 길이 n = 32 - 10 = 22&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작 주소는 18.14.12.0이 선택됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 할당된 블록 18.14.12.0/22, 첫 번째 주소: 18.14.12.0/22, 마지막 주소: 18.14.15.255/22&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 기반 주소 지정 방법과의 관계&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 프리픽스 길이&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 16.6275%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 4.04858%;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 4.04858%;&quot;&gt;/8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 4.04858%;&quot;&gt;B&lt;/td&gt;
&lt;td style=&quot;width: 4.04858%;&quot;&gt;/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 4.04858%;&quot;&gt;C&lt;/td&gt;
&lt;td style=&quot;width: 4.04858%;&quot;&gt;/24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 4.04858%;&quot;&gt;D&lt;/td&gt;
&lt;td style=&quot;width: 4.04858%;&quot;&gt;/4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 4.04858%;&quot;&gt;E&lt;/td&gt;
&lt;td style=&quot;width: 4.04858%;&quot;&gt;/4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 73.0.0.0의 클래스 A 블록을 할당받은 기관은 클래스 없는 주소 지정에서 73.0.0.0/8 블록을 할당받은 것과 같음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서브넷팅&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3단계의 서브넷팅&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 블록을 할당 받은 기관은 블록을 여러 개의 서브 블록으로 나눈 후 각 서브 블록을 서브넷에 할당&lt;/li&gt;
&lt;li&gt;서브넷은 여러 개의 서브-서브넷으로 나누어질 수 있음&lt;/li&gt;
&lt;li&gt;서브-서브넷은 다시 서브-서브-서브넷으로 나누어질 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파라미터 정의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기관이 할당 받은 주소 개수 N, 각 서브넷에게 할당된 주소 개수 Nsub&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리픽스 길이 n, 각 서브넷의 프리픽스 길이 nsub&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷의 총 개수는 s&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 서브넷에 속하는 주소의 개수(Nsub)는 2의 거듭제곱이어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;s = N/Nsub&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nsub = n + log2_(N/Nsub) (N/Nsub 가 2의 거듭제곱이어야 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 서브넷에 속하는 시작 주소는 해당 서브넷에 속하는 주소의 개수로 나누어질 수 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록 130.34.12.64/26을 할당 받은 경우 호스트 개수가 같은 4개의 서브넷 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답 (풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 주소의 개수: 2^(32-26) = 2^6 = 64&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 주소: 130.34.12.64/26&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 주소: 130.34.12.127/26&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브넷 설계: 각 서브넷은 16개의 주소를 가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리픽스 길이: n + log2(N/Ni) = 26 + log2(64/16) = 26 + 2 = 28&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(서브넷 구분을 위한 비트가 netid에 포함되어 subnetid가 그만큼 길어짐)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CIDR 구조의 한 가지 장점: 주소 결합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ICANN은 ISP에게 다양한 크기의 주소 블록 할당&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ISP는 할당된 블록을 여러 개의 서브-블록으로 나누어 각 서브-블록을 고객들에게 할당할 수 O&lt;/li&gt;
&lt;li&gt;여러 개의 작은 블록을 하나의 블록으로 결합하여 ISP에게 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ISP가 190.100.0.0/16 (65,536개 주소)로 시작하는 주소 블록을 할당 받았다. ISP는 이 주소를 다음과 같이 세 그룹의 고객에게 분배하고자 한다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 그룹은 64개의 고객, 각각은 대략 256개의 주소 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 그룹은 128개의 고객, 각각 대략 128개의 주소 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째 그룹은 128개의 고객, 각각 대략 64개의 주소 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브 블록을 설계하고, 할당을 한 후에 이용 가능한 주소가 얼마나 남았는지 알아보기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답(풀이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 그룹에 주소의 서브블록 할당하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹 1: 64 * 256 = 16,384 n1 = 16 + log2(65536/16384) = 18&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹 2: 128 * 128 = 16,384 n2 = 16 + log2(65536/16384) = 18&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹 3: 128 * 64 = 8,192 n3 = 16 + log2(65536/8192) = 19&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이용 가능한 주소의 수: 65536 - (16384 + 16384 +8192) = 24576&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 그룹의 서브넷 구하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹 1: n = 18, 서브넷 n1 = 18 + log2(16384/256) = 24&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹 2: n = 18, 서브넷 n2 = 18 + log2(16384/128) = 25&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹 3: n = 19, 서브넷 n3 = 19 + log2(8192/64) = 26&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;특수 주소&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 기반 주소 지정에서 일부 주소는 특수 목적 위해 예약 (클래스 기반이 아닌 주소 지정에서도 동일하게 특수 주소 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특수 블록&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모두가 0인 주소&lt;/li&gt;
&lt;li&gt;모두가 1인 주소&lt;/li&gt;
&lt;li&gt;루프백 주소&lt;/li&gt;
&lt;li&gt;멀티캐스트 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록 내의 특수 주소&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 주소 (첫 번째 주소)&lt;/li&gt;
&lt;li&gt;직접 브로드캐스트 주소 (마지막 주소)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모두가 0인 주소 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신의 IPv4 주소를 모르는 호스트가 부트스트랩 시 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적 IP 관리를 제공하는 동적 호스트 구성 프로토콜(DHCP)에서 IP 할당 받기 위해 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(즉, 동적으로 IP를 할당받기 위함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요할 때마다 동적으로 할당받아 자원 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;0.0.0.0&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제한된 브로드캐스트 주소 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;255.255.255.255&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두가 1인 주소 (같은 네트워크 내에서만 브로드캐스팅)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크에 있는 모든 호스트에게 메시지 전달 시 사용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;무분별한 데이터의 외부 유출을 막기 위해 라우터는 차단 (내부에서 쓰는 데이터이므로 외부로 내보내면 안 됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;루프백 주소의 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;127.0.0.0/8 블록은 루프백 주소로 사용됨&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터에 설치된 소프트웨어를 시험하기 위해 사용&lt;/li&gt;
&lt;li&gt;하나의 PC에서 여러 디바이스가 있는 것처럼 실험할 때 (테스트 용도)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부로 내보내지 않고 내부에서만 처리를 끝내는 목적으로 씀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사설 주소&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사설 용도를 위해 할당 (네트워크마다 내부적으로 할당해서 쓸 수 있는 형태의 주소 체계)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역 네트워크에서 인식되지 않음 (내부에서만 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크가 분리되어 있거나 NAT(network address translation) 사용하여 사설 네트워크를 인터넷에 연결하는데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 모자란 주소체계로 인해 생기는 자원 고갈 문제 해결 용도로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 사설망 주소 (참고만 하기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록 주소의 수 블록 주소의 수&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 77.2093%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0698%;&quot;&gt;10.0.0.0/8&lt;/td&gt;
&lt;td style=&quot;width: 16.6279%;&quot;&gt;16,777,216&lt;/td&gt;
&lt;td style=&quot;width: 23.8372%;&quot;&gt;192.168.0.0/16&lt;/td&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;65,536&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 19.0698%;&quot;&gt;172.16.0.0/12&lt;/td&gt;
&lt;td style=&quot;width: 16.6279%;&quot;&gt;1,047,584&lt;/td&gt;
&lt;td style=&quot;width: 23.8372%;&quot;&gt;169.254.0.0/16&lt;/td&gt;
&lt;td style=&quot;width: 17.6744%;&quot;&gt;65,536&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멀티캐스트 주소&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;224.0.0.0/4 블록&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 개별 주소가 멀티캐스트 그룹을 지정함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티캐스트 통신을 위해 예약된 블록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 사용자는 일반 목적의 주소와 멀티캐스트 주소를 동시에 가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 멀티캐스트 그룹에 속하는 멀티 유저들이 동일한 멀티캐스트 주소를 가짐 (여러 멀티캐스트 주소를 가질 수도 O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;블록에 속하는 특수 주소&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록 내의 일부 주소를 특수 주소로 사용하는 것은 권고사항(호스트에 할당 불가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 주소&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블록에 속하는 첫 번째 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 브로드캐스트 주소&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;suffix가 모두 1로 설정된 블록의 마지막 주소&lt;/li&gt;
&lt;li&gt;라우터가 특정 네트워크에 있는 모든 호스트에 패킷 전송 시 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;IPv6 주소&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IPv4의 문제점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주소의 고갈&lt;/li&gt;
&lt;li&gt;기술상의 한계&lt;/li&gt;
&lt;li&gt;계층적 주소 할당 부재&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크의 규모가 너무 커짐, 네트워크 활용 반경 넓어짐, 여러 문제 중 보안이 가장 큰 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IPv6 주소 체계&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소 길이: 16바이트(128비트)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;64비트의 네트워크 주소 부문과 64비트의 인터페이스 주소 부문으로 정의&lt;/li&gt;
&lt;li&gt;CIDR 기반 표기법과 유사하게 임의 비트 길이의 프리픽스 사용 가능 &amp;rarr; 네트워크 부문과 인터페이스 부문 길이가 고정된 것은 아님&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IPv6 주소 표기법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점 10진 표기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 221.14.65.11.105.45.170.34.12.234.18.0.14.0.115.255&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜론 16진 표기법: 32개의 16진수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) FDEC:BA98:7654:3210:ADBF:BBFF:2922:FFFF&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제로 압축: 0이 연속으로 오는 개수가 더 많은 쪽을 압축 (:: 로 나타내기) (생략형)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) FDEC:0:0:0:0:BBFF:0:FFFF &amp;rarr; FDEC::BBFF:0:FFFF&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혼합 표기법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;콜론 16진 표기법과 점 10진 표기법을 혼합하여 표기&lt;/li&gt;
&lt;li&gt;FDEC:14AB:2311:BBFE:AAAA:BBBB:130.24.24.18&lt;/li&gt;
&lt;li&gt;가장 왼쪽이 모두 0인 주소의 압축 표현&lt;/li&gt;
&lt;li&gt;::130.24.24.18&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CIDR 표기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FDEC::BBFF:0:FFFF/60&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IPv6 주소 공간 할당&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 주소 공간을 8등분으로 나눠 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 1/8만 사용자 주소 공간으로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IPv6 주소 공간: 2^128, (IPv4 주소의 2^96배)&lt;/p&gt;</description>
      <category>공부 기록/네트워크 보안</category>
      <author>도도히히</author>
      <guid isPermaLink="true">https://thisisme0101.tistory.com/16</guid>
      <comments>https://thisisme0101.tistory.com/16#entry16comment</comments>
      <pubDate>Mon, 10 Nov 2025 16:23:52 +0900</pubDate>
    </item>
    <item>
      <title>SQL 기본 문법 (1)</title>
      <link>https://thisisme0101.tistory.com/19</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. SQL 개요&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SQL (Structured Query Language)&lt;/b&gt;: 데이터베이스에서 사용되는 구조화된 질의 언어&lt;/li&gt;
&lt;li&gt;&lt;b&gt;표준&lt;/b&gt;: ANSI/ISO SQL 표준(예: ANSI-92, ANSI-99)이 있으며, 대부분의 DBMS(데이터베이스 관리 시스템)가 이를 따름&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DBMS별 SQL&lt;/b&gt;: 각 회사는 표준을 준수하며 고유의 기능을 추가한 SQL을 사용함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MySQL&lt;/b&gt;: SQL&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Oracle&lt;/b&gt;: PL/SQL&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SQL Server&lt;/b&gt;: T-SQL (Transact SQL)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. SELECT 문의 기본&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;SELECT ... FROM&lt;/b&gt;: 테이블에서 데이터를 검색하는 기본 구문
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SELECT *: 모든 열을 선택&lt;/li&gt;
&lt;li&gt;SELECT 열1, 열2, ...: 특정 열만 쉼표(,)로 구분하여 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;USE [데이터베이스이름]&lt;/b&gt;: 작업할 데이터베이스를 지정하거나 변경. Workbench에서는 스키마 이름을 더블클릭하여 지정할 수도 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기타 기본 명령어&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SHOW DATABASES; : 서버의 모든 데이터베이스 목록 확인&lt;/li&gt;
&lt;li&gt;SHOW TABLES; : 현재 데이터베이스의 테이블 목록 확인&lt;/li&gt;
&lt;li&gt;DESCRIBE [테이블이름]; (또는 DESC) : 테이블의 구조(열 정보)를 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. WHERE 절 (데이터 필터링)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT 문에서 WHERE 절을 추가하여 특정 조건을 만족하는 행만 조회할 수 있음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;조건 연산자&lt;/b&gt;: AND , OR 를 사용해 여러 조건을 조합&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BETWEEN ... AND ...&lt;/b&gt;: 특정 범위 내의 값 조회 (예: height BETWEEN 180 AND 182).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IN (...)&lt;/b&gt;: 이산적인(discrete) 값 목록 중 하나와 일치하는 데이터를 조회 (예: addr IN ('경남', '충남', '경북')).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LIKE&lt;/b&gt;: 문자열 패턴 검색
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;%: 0개 이상의 모든 문자를 의미함 (예: '김%').&lt;/li&gt;
&lt;li&gt;_: 1개의 단일 문자를 의미함 (예: '_경규').&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 서브쿼리 (Subquery)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT 문 내부에 또 다른 SELECT 문(서브쿼리)을 사용하여, 그 결과를 상위 쿼리의 조건으로 활용할 수 있음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서브쿼리의 결과가 2개 이상의 행을 반환할 때 비교 연산자를 그냥 사용하면 오류가 발생함&lt;/li&gt;
&lt;li&gt;이때 ANY, ALL, SOME 연산자를 사용해야 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;gt;= ANY: 서브쿼리 결과 중 &quot;최솟값&quot;보다 크거나 같으면 참&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;gt;= ALL: 서브쿼리 결과 중 &quot;최댓값&quot;보다 크거나 같으면 참&amp;nbsp;&lt;/li&gt;
&lt;li&gt;= ANY는 IN과 동일한 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 결과 정렬 및 제한&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ORDER BY&lt;/b&gt;: 결과를 특정 열 기준으로 정렬
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASC: 오름차순 (기본값)&lt;/li&gt;
&lt;li&gt;DESC: 내림차순&lt;/li&gt;
&lt;li&gt;여러 열을 기준으로 정렬할 수 있음 (예: ORDER BY height DESC, userName ASC).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DISTINCT&lt;/b&gt;: SELECT 키워드 뒤에 사용하여 중복된 값을 제거하고 고유한 값만 표시&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LIMIT&lt;/b&gt;: 출력되는 행의 개수를 제한
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LIMIT 5: 상위 5개만 출력&lt;/li&gt;
&lt;li&gt;LIMIT 0, 5 (또는 LIMIT 5 OFFSET 0): 0번 인덱스부터 5개를 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. GROUP BY 및 HAVING 절&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;GROUP BY&lt;/b&gt;: 특정 열의 값이 같은 행들을 하나의 그룹으로 묶음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;집계 함수 (Aggregate Functions)&lt;/b&gt;: GROUP BY와 함께 사용되어 그룹별 통계를 냄
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SUM(): 합계&lt;/li&gt;
&lt;li&gt;AVG(): 평균&lt;/li&gt;
&lt;li&gt;MAX(): 최댓값&lt;/li&gt;
&lt;li&gt;MIN(): 최솟값&lt;/li&gt;
&lt;li&gt;COUNT(): 행의 개수. COUNT(*)는 전체 행 수, COUNT(열이름)은 해당 열이 NULL이 아닌 행의 수를 셈&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HAVING&lt;/b&gt;: GROUP BY로 그룹화된 결과에 대해 조건을 적용하여 필터링 (WHERE는 그룹화 전 개별 행에, HAVING은 그룹화 후 그룹에 적용)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: GROUP BY userID HAVING SUM(price * amount) &amp;gt; 1000 (총구매액이 1000을 초과하는 사용자 그룹만)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부 기록/MySQL</category>
      <category>mysql</category>
      <author>도도히히</author>
      <guid isPermaLink="true">https://thisisme0101.tistory.com/19</guid>
      <comments>https://thisisme0101.tistory.com/19#entry19comment</comments>
      <pubDate>Sun, 9 Nov 2025 23:32:42 +0900</pubDate>
    </item>
    <item>
      <title>컴퓨터 시스템과 운영체제 (3)</title>
      <link>https://thisisme0101.tistory.com/14</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 커널과 시스템 호출&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;응용프로그램의 자원 접근 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘날 운영체제: &lt;b&gt;다중 프로그래밍 운영체제&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다수의 응용프로그램이 한 컴퓨터에서 &lt;b&gt;동시&lt;/b&gt;에 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응용프로그램이 &lt;b&gt;직접 컴퓨터 자원에 접근&lt;/b&gt;하면 &lt;b&gt;충돌과 훼손&lt;/b&gt; 발생
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 응용프로그램이 적재된 메모리 훼손 가능&lt;/li&gt;
&lt;li&gt;다른 응용프로그램이 만든 파일 삭제 및 훼손 가능&lt;/li&gt;
&lt;li&gt;응용프로그램이 커널이 적재된 영역 훼손 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 방안&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응용프로그램의 &lt;b&gt;자원 접근 불허&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원에 대한 모든 접근 &lt;b&gt;권한을 커널에만 부여&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구체적인 해결 방법&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;메모리 공간&lt;/b&gt;을 &lt;b&gt;User space&lt;/b&gt;와 &lt;b&gt;Kernel space&lt;/b&gt;로 분리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응용프로그램은 User space에 적재, 커널은 Kernel space에 적재&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CPU의 실행 모드&lt;/b&gt;를 &lt;b&gt;User mode&lt;/b&gt;와 &lt;b&gt;Kernel mode&lt;/b&gt;로 분리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응용프로그램은 User mode에서만 실행, 커널은 Kernel mode에서만 실행&lt;/li&gt;
&lt;li&gt;User space에서 Kernel space의 코드를 직접 접근하지 못하게 하기 위해&lt;/li&gt;
&lt;li&gt;User mode에서 커널 코드를 접근하면 응용프로그램 강제 종료(하드웨어에 대한 접근 차단 및 커널 보호)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;응용프로그램이 커널 기능을 이용하고자 할 때, 시스템 호출을 이용해서만 커널 코드 이용&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;User space와 Kernel space&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제는 컴퓨터 메모리를 두 공간으로 분리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;User space&lt;/b&gt;: 응용프로그램들이 나누어 사용하는 공간
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응용프로그램들이 적재&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Kernel space&lt;/b&gt;: 커널만 사용할 수 있는 공간
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디바이스 드라이버 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;분리 이유&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널 코드와 데이터를 악의적인 응용프로그램이나 코딩 실수로부터 지키기 위함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU는 User mode와 Kernel mode 중 한 모드로 실행&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU에 의해 구현되고 운영체제가 활용하는 기능&lt;/li&gt;
&lt;li&gt;모드 레지스터 (CPU 내부에서 모드 상태를 나타냄)&lt;/li&gt;
&lt;li&gt;운영체제는 CPU 모드 레지스터를 이용해 커널 영역 지킴&lt;/li&gt;
&lt;li&gt;&lt;b&gt;User mode&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU의 모드 비트: 1&lt;/li&gt;
&lt;li&gt;User space에 있는 코드나 데이터에 액세스&lt;/li&gt;
&lt;li&gt;Kernel space의 접근 불허 (응용프로그램으로부터 커널 영역 보호)&lt;/li&gt;
&lt;li&gt;Privileged instruction 실행 불허 (입출력 장치, 타이머, 인터럽트 처리, 시스템 중단 등 특별한 목적으로 설계된 CPU 기계 명령)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Kernel mode&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU의 모드 비트: 0&lt;/li&gt;
&lt;li&gt;모든 메모리 공간에 접근할 수 있고 하드웨어 접근 및 제어 가능&lt;/li&gt;
&lt;li&gt;Privileged Instruction 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;User mode &amp;rarr; Kernel mode&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2가지 경우&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 호출&lt;/li&gt;
&lt;li&gt;인터럽트 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시스템 호출&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;특별한 CPU 기계 명령&lt;/b&gt;에 의해 진행&lt;/li&gt;
&lt;li&gt;기계 명령이 CPU의 모드 비트를 Kernel mode로 전환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터럽트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU가 인터럽트를 수신하면 Kernel mode로 자동 전환(인터럽트 서비스 루틴이 Kernel space에 있음)&lt;/li&gt;
&lt;li&gt;인터럽트 서비스 루틴 실행&lt;/li&gt;
&lt;li&gt;루틴이 끝나면 CPU는 User mode로 전환&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Privileged instruction&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kernel mode에서 실행할 특별한 목적으로 설계된 CPU 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종류&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I/O 명령
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드웨어 제어 및 장치로부터의 입출력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Halt 명령
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU의 작동을 중지시키는 명령 (현재 처리할 작업이 없을 때)&lt;/li&gt;
&lt;li&gt;CPU를 유휴 상태로 만들기 (전력 소모 줄이기)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인터럽트 플래그를 켜고 끄는 명령
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 내에 있는 인터럽트 플래그 비트를 제어하여 인터럽트를 허용하거나 무시하도록 지시&lt;/li&gt;
&lt;li&gt;인텔) cli(clear interrupt flag)/sti(set interrupt flag) 명령
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cli: 인터럽트 비활성화&lt;/li&gt;
&lt;li&gt;sti: 인터럽트 활성화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;타이머 설정 명령
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 타이머 설정&lt;/li&gt;
&lt;li&gt;일정한 간격으로 인터럽트 발생 &amp;rarr; 운영체제가 프로세스 스케줄링 등을 제어할 수 있도록 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컨텍스트 스위칭 명령
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU가 하나의 프로세스에서 다른 프로세스로 작업을 전환할 때 사용&lt;/li&gt;
&lt;li&gt;여러 프로세스가 CPU 공유하면서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메모리 지우기 명령
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 초기화&lt;/li&gt;
&lt;li&gt;사용하지 않는 메모리 영역 줄이기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;장치 상태 테이블 수정 등의 명령
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템의 다양한 하드웨어 장치 상태를 기록하고 관리하는 테이블 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커널은 프로세스인가?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널: 부팅 시에 Kernel space에 적재된 함수들과 데이터 집합
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일된 바이너리 형태&lt;/li&gt;
&lt;li&gt;하드디스크 특정 영역에 저장&lt;/li&gt;
&lt;li&gt;부팅 시 Kernel space의 메모리에 적재&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;커널 코드는 함수들의 집합
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kernel mode에서 실행되는 함수들과 데이터들의 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커널은 프로세스가 아님&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;독립적으로 실행 X
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응용프로그램이 시스템 호출을 통해 커널에 기능을 요청할 때 실행&lt;/li&gt;
&lt;li&gt;인터럽트가 발생하여 인터럽트 서비스 루틴이 실행될 때 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 커널은 스택, 힙을 가지는 주체가 아님 (프로세스나 스레드는 스택, 힙을 가지고 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 모드에서 작업을 처리할 때만 각 프로세스의 커널 공간의 커널 스택을 사용함&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 호출 vs 시스템 호출 비용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;함수 호출&lt;/b&gt;: 라이브러리 활용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;User space에 적재된 함수가 다른 함수나 라이브러리 함수 호출&lt;/li&gt;
&lt;li&gt;CPU 실행 모드: User mode&lt;/li&gt;
&lt;li&gt;실행 과정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;User space의 스택에 리턴 주소와 매개변수 전달&lt;/li&gt;
&lt;li&gt;호출된 함수의 지역변수 생성&lt;/li&gt;
&lt;li&gt;끝나면 함수를 호출한 곳으로 복귀&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시스템 호출&lt;/b&gt;: 커널 기능 활용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 호출 라이브러리에 작성된 시스템 호출 함수를 통해 간접적으로 커널 기능 요청&lt;/li&gt;
&lt;li&gt;CPU 실행 모드: User mode &amp;rarr; Kernel mode로 전환&lt;/li&gt;
&lt;li&gt;실행 과정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 호출을 일으키는 특별한 기계 명령 (CPU마다 다름) 실행&lt;/li&gt;
&lt;li&gt;커널 함수마다 매겨진 고유 번호 전달(시스템 호출 번호)&lt;/li&gt;
&lt;li&gt;User mode &amp;rarr; Kernel mode&lt;/li&gt;
&lt;li&gt;커널의 시스템 호출 핸들러 실행 (커널 함수의 고유 번호를 분석해 해당 커널 함수 호출)&lt;/li&gt;
&lt;li&gt;리턴할 때 User mode로 전환 (사용자 프로그램으로 복귀)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;printf()가 직접 디스플레이에 출력할까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;printf() 함수는 표준 라이브러리 함수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디스플레이에 접근하는 것은 커널만 가능&lt;/li&gt;
&lt;li&gt;printf() 함수는 디스플레이에 직접 출력 &lt;b&gt;불가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;표준 라이브러리 함수는 특정 CPU/OS에 종속적이지 X&lt;/li&gt;
&lt;li&gt;printf()는 C 표준 라이브러리의 &lt;b&gt;버퍼&lt;/b&gt;에 출력&lt;/li&gt;
&lt;li&gt;&lt;b&gt;write()&lt;/b&gt; 호출: &lt;b&gt;버퍼가 차거나&lt;/b&gt; (full buffering), &lt;b&gt;개행문자를 만나면&lt;/b&gt; 실행 (line buffering)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;full buffering: 데이터가 가득 찼을 때 한꺼번에 출력&lt;/li&gt;
&lt;li&gt;line buffering: 실시간으로 데이터 출력할 때 유용, 비교적 더 많은 시스템 호출 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;write() 함수는 &amp;ldquo;시스템 호출 CPU 명령&amp;rdquo; 실행&lt;/li&gt;
&lt;li&gt;커널에 작성된 함수가 디스플레이에 해당 내용 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;printf()가 시스템 호출을 직접 일으키지 X, write() 함수를 호출하여 시스템 호출 발생하도록 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;but, 매번 write 함수를 호출하지 X &amp;rarr; 데이터를 더 효율적으로 처리하기 위해 출력 버퍼를 활용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력 버퍼&lt;/b&gt;: 출력할 데이터를 임시로 모아두는 공간(유저 공간에 있음) &amp;rarr; 시스템 호출 최소화&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Full &amp;amp; line buffering 실험&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 라인 버퍼링이 적용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과는?&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

int main() {
	printf(&quot;123&quot;);
	write(1, &quot;45&quot;, 2);
	printf(&quot;67\\n&quot;);
	write(1, &quot;8&quot;, 1);
	printf(&quot;9&quot;);
	write(1, &quot;10&quot;, 1);
	printf(&quot;\\n&quot;);
	
	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4512367&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;819&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;write(1, &amp;ldquo;45&amp;rdquo;, 2);&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2: 2바이트를 쓴다는 의미, 45를 씀&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;write(1, &amp;ldquo;10&amp;rdquo;, 1);&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1: 1바이트를 쓴다는 의미, 10 중에서 앞의 1만 씀&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;fread() vs read()의 호출 비용 비교&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fread()&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 포인터가 가리키는 파일로부터 size 단위의 데이터를 count 개수만큼 읽어서 buffer 라는 공간에 읽어들이라는 프로토타입&lt;/li&gt;
&lt;li&gt;반환값: 성공적으로 읽어들인 원소의 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;read()&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;size_t read(int fd, void *buf, size_t nbytes);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 디스크립터(fd)로부터 n바이트를 읽어서(nbytes, buf보다 크면 안됨) buf가 가리키는 공간에 저장하라는 프로토타입&lt;/li&gt;
&lt;li&gt;반환값: 성공적으로 읽어들인 데이터 크기 (항상 리턴값이 n바이트인 것은 아님)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;fread() vs. read()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시스템 호출&lt;/b&gt;은 함수 호출에 비해 &lt;b&gt;많은 시간 비용&lt;/b&gt; (시스템 호출을 많이 할수록 실행 속도 저하)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 파일에서 1000바이트를 읽는 2가지 유형의 코드의 실행 비교 결과? (아래 ex에 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;표준 라이브러리 함수 fread(buf, size, count, fp)의 동작 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fread() 처음 호출: 라이브러리 내 버퍼(입력버퍼)가 비어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; read() 호출하여 라이브러리 내 버퍼 채움 (시스템 호출)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n = read(fd, buf, size); &amp;rarr; 보통 I/O block size : 4KB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응용프로그램이 요청한 size만큼 응용프로그램의 buf로 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버퍼가 비거나 부족하면 다시 read() 호출&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;char buf[100];&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for (i=1; i&amp;le;10; i++)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fread(buf, 1, 100, fp);&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1번째 반복에서는 read()를 호출해 시스템 호출을 1번 실행함(sys_read()가 실행됨, 하드디스크로부터 데이터를 읽어들여와 표준 라이브러리 내에 있는 입력 버퍼에 데이터 채워넣음)&lt;/li&gt;
&lt;li&gt;2번째 ~ 10번째 반복에서는 입력 버퍼에 저장된 데이터를 가지고 fread()로 읽어오기 때문에 시스템 호출을 하지 않아도 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시스템 호출 함수 read(fd, buf, size)의 동작 과정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 호출을 이용하여 커널 코드 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 코드에서 디스크 읽기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브러리를 거치지 않고 바로 buf로 읽어들임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(입력 버퍼X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;char buf[100];&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for (i=1; i&amp;le;10; i++)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;read(fd, buf, 100);&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 버퍼가 없어 반복마다 시스템 호출을 해야 하므로 성능이 저하됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시스템 호출에 따른 비용 정리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 호출에 따른 비용은 매우 큼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 호출은 &lt;b&gt;필연적&lt;/b&gt;이지만, 시스템 &lt;b&gt;호출 횟수를 줄여야&lt;/b&gt; 응용프로그램의 실행 시간이 짧아지고 더 많은 프로그램을 실행시킬 수 있는 &lt;b&gt;시간을 확보&lt;/b&gt;하여 시스템의 &lt;b&gt;처리율이 향상&lt;/b&gt;됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 운영체제와 인터럽트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Interrupt(인터럽트)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 장치나 저장 장치들이 &lt;b&gt;비동기적 사건&lt;/b&gt;을 CPU에게 알리는 행위&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비동기적: 예정되지 않거나 발생시간을 예측할 수 없는 이벤트&lt;/li&gt;
&lt;li&gt;ex) 키보드 입력, 네트워크로부터 데이터 도착 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하드웨어 인터럽트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장치들&lt;/b&gt;이 어떤 &lt;b&gt;상황 발생&lt;/b&gt;을 CPU에게 알리는 &lt;b&gt;하드웨어 신호&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;CPU는 인터럽트를 수신하면 &lt;b&gt;인터럽트 서비스 루틴&lt;/b&gt; 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 하드디스크에서 데이터를 읽는 동안 CPU는 다른 작업을 수행하고 있다가 하드디스크가 작업을 완료했을 때 인터럽트를 통해 CPU에게 알림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소프트웨어 인터럽트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CPU 명령&lt;/b&gt;으로 발생시키는 인터럽트 (소프트웨어적으로 CPU 신호를 보내 특정 작업 요청)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시스템 호출&lt;/b&gt;을 일으키는 int 0x80 명령 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터에서 인터럽트 활용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마우스 조작 (마우스 움직이거나 클릭)&lt;/li&gt;
&lt;li&gt;키보드 입력&lt;/li&gt;
&lt;li&gt;네트워크로부터 데이터 도착&lt;/li&gt;
&lt;li&gt;하드디스크의 쓰기 종료&lt;/li&gt;
&lt;li&gt;시스템 클럭으로부터 일정한 시간 간격으로 알림&lt;/li&gt;
&lt;li&gt;컴퓨터의 리셋 버튼 누르기&lt;/li&gt;
&lt;li&gt;USB 메모리의 부착 혹은 해제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터럽트 서비스 루틴&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 하드웨어 인터럽트&lt;/b&gt;가 발생했을 때 CPU가 그에 &lt;b&gt;대응하는 코드를 실행&lt;/b&gt;할 수 있도록 하는 중요한 매커니즘&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;인터럽트 핸들러&lt;/b&gt; 라고도 불림&lt;/li&gt;
&lt;li&gt;&lt;b&gt;디바이스 드라이버&lt;/b&gt;나 &lt;b&gt;커널 코드&lt;/b&gt;에 포함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;커널의 일부&lt;/b&gt;로 작동&lt;/li&gt;
&lt;li&gt;각 하드웨어 장치에 대한 &lt;b&gt;하드웨어 드라이버&lt;/b&gt;에 의해서 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;임베디드 컴퓨터&lt;/b&gt;의 경우 &lt;b&gt;ROM&lt;/b&gt;에 위치
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템이 부팅 시부터 인터럽트를 처리할 수 있도록 하기 위함&lt;/li&gt;
&lt;li&gt;임베디드 시스템에서 하드웨어와 소프트웨어가 밀접하게 결합 &amp;rarr; 인터럽트 서비스 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각 드라이버가 커널과 연결됨, 드라이버를 통해 장치와 소통&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다중프로그래밍 리뷰&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 프로세스 &lt;b&gt;동시&lt;/b&gt;에 실행&lt;/li&gt;
&lt;li&gt;한 프로세스가 &lt;b&gt;입출력 시행&lt;/b&gt;하면 다른 프로세스로 &lt;b&gt;교체&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인터럽트&lt;/b&gt;: 입출력이 완료될 때 장치로부터 &lt;b&gt;입출력 완료 통보&lt;/b&gt;를 받는 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터럽트가 없다면 CPU는 &lt;b&gt;입출력 완료를 계속 검사&lt;/b&gt;하는 **폴링(polling)**을 실행해야 하므로 매우 비효율적&lt;/li&gt;
&lt;li&gt;인터럽트가 없다면, 다중프로그래밍 운영체제의 구현은 사실상 거의 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터럽트의 효과&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입출력 장치와 CPU가 &lt;b&gt;동시에 각자의 작업&lt;/b&gt; 실행
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입출력 장치는 지시받은 입출력 진행하고 CPU는 다른 프로그램 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컴퓨터 시스템이 &lt;b&gt;효율적&lt;/b&gt;으로 작동
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 활용률 높아지고 시스템 처리율 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부 기록/운영체제</category>
      <author>도도히히</author>
      <guid isPermaLink="true">https://thisisme0101.tistory.com/14</guid>
      <comments>https://thisisme0101.tistory.com/14#entry14comment</comments>
      <pubDate>Sun, 9 Nov 2025 20:16:22 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크 보안] 네트워크층 개요</title>
      <link>https://thisisme0101.tistory.com/15</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;네트워크 계층의 설계 목적&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 링크를 통해 전달하는 과정에서 발생하는 문제 해결&lt;/li&gt;
&lt;li&gt;호스트간 전달과 라우터를 통한 패킷 라우팅(경로 지정)으로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터넷은 수백만의 컴퓨터를 연결하는 블랙박스 네트워크&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 컴퓨터의 응용층에서 다른 컴퓨터의 응용층까지 메시지 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 블랙박스: 내부에서 동작하는 방식은 모르겠지만 안에서 어떤 일이 일어나서 기대했던 결과가 나오는 모델 (사용자 입장에서 내부 동작 방식 알 필요 X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인터넷의 구성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연결 장치를 통하여 연결된 수많은 네트워크(또는 링크)로 구성&lt;/li&gt;
&lt;li&gt;인터넷은 LAN과 WAN들의 조합인 네트워크들이 서로 연결된 네트워크&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라우터의 역할&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;교환기로서 동작&lt;/li&gt;
&lt;li&gt;패킷이 한 포트에 도착하면 다른 포트를 통하여 다음 목적지로 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;교환&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;네트워크 계층의 핵심 동작은 교환&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메시지를 발신지에서 목적지로 전달하는 과정에서 많은 결정이 이루어짐&lt;/li&gt;
&lt;li&gt;메시지가 연결 장치에 도착하면 패킷을 송신하는 출력 포트를 결정&lt;/li&gt;
&lt;li&gt;연결 장치는 한 포트를 다른 포트에 연결하는 교환기 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;교환 방식의 종류&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회선 교환&lt;/li&gt;
&lt;li&gt;패킷 교환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;회선 교환&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메시지 전달 전에 발신지와 목적지 사이에 물리 회선이 생성&lt;/li&gt;
&lt;li&gt;회선 생성 후 메시지 전달&lt;/li&gt;
&lt;li&gt;네트워크 계층에서는 구현되지 않고 대부분 물리층에서 사용됨&lt;/li&gt;
&lt;li&gt;회선 교환 방식에서는 전체 메시지가 패킷으로 분할되지 않고 전체 전달&lt;/li&gt;
&lt;li&gt;ex) 초기 전화 시스템&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패킷 교환&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현존 인터넷의 네트워크 계층은 패킷 교환망으로 구성&lt;/li&gt;
&lt;li&gt;상위 계층 메시지가 관리 가능한 크기의 패킷으로 분할되고, 패킷 단위로 네트워크를 통해 전달&lt;/li&gt;
&lt;li&gt;목적지에서 같은 메시지에 속하는 모든 패킷이 도착하면 상위 계층으로 전달&lt;/li&gt;
&lt;li&gt;패킷 교환망의 연결장치는 각 패킷을 &amp;ldquo;최종 목적지까지 어떻게 보낼 것인지&amp;rdquo; 결정 (패킷만 생각함)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;패킷 교환망&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;네트워크층은 패킷교환망으로 설계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;발신지에서 메시지는 데이터그램 단위로 분할&lt;/li&gt;
&lt;li&gt;각 데이터그램이 발신지에서 목적지로 전달&lt;/li&gt;
&lt;li&gt;수신된 데이터그램은 목적지에서 원래의 메시지로 재조립&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제공되는 서비스&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비연결형 서비스&lt;/li&gt;
&lt;li&gt;연결형 서비스&lt;/li&gt;
&lt;li&gt;네트워크층의 패킷 교환망은 비연결형으로 설계되었으나 최근 연결형 서비스로 전환되고 있는 추세임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 하나의 고정된 경로로 보낸다면 연결형, 고정된 경로가 아니라면 비연결형&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비연결형 패킷 교환망&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단순한 구조로 설계&lt;/b&gt;하기 위해 &lt;b&gt;비연결형&lt;/b&gt;으로 설계&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 패킷을 상호 독립적으로 처리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동일 메시지 내의 패킷들은 목적지까지 같은 경로로 전송되지 않을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;발신지에서 목적지까지 패킷 전달만을 책임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;네트워크내의 교환기&lt;/b&gt;를 &lt;b&gt;라우터&lt;/b&gt;라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf. 누가 보냈는지, 어디로 보낼건지만 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 상태를 모니터링하고 그에 따라 라우팅 테이블을 바꿈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상황을 보면서 어디로 전송하는게 빠른지 판단&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순하게 데이터를 전달하기엔 좋지만, 순서가 다르게 전달되는 점이 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우터는 &lt;b&gt;발신지 주소&lt;/b&gt;와 &lt;b&gt;목적지 주소&lt;/b&gt;를 기반으로 &lt;b&gt;패킷을 처리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목적지 주소를 기반으로 패킷 전달&lt;/li&gt;
&lt;li&gt;처리 못 한 패킷이 폐기되는 경우 발신지 주소를 사용하여 오류 메시지 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블: 어디로 보낼지 결정할 때 씀, 상황에 따라 업데이트될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SA(Source address)|DA(Destination address)|Data 순서로 저장되어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목적지 주소를 보고 라우팅 테이블을 참조해서 보냄&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;연결형 서비스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서비스 제공&lt;/b&gt;을 위해 &lt;b&gt;가상 회선&lt;/b&gt;이 생성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연결설정(setup), 데이터 전송, 연결해제(teardown)의 절차에 따라 회선 생성 및 소멸&lt;/li&gt;
&lt;li&gt;데이터그램 송신 전에 경로를 지정하는 가상 회선 생성&lt;/li&gt;
&lt;li&gt;연결 생성 후 경로를 따라 데이터그램 전달
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패킷에는 가상 회선 식별자(흐름 레이블: flow label)가 사용됨&lt;/li&gt;
&lt;li&gt;각 패킷은 전송 경로인 가상 회선을 따라 전달
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우터에 설정된 레이블을 기반으로 포워딩&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연결설정 단계&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가상 회선을 위한 엔트리 생성 (어디에서 어디로 보낼지 지정)&lt;/li&gt;
&lt;li&gt;송신자와 수신자 사이의 두 패킷 교환이 요구됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청 패킷 &amp;rarr; 발신지와 목적지 주소 전달&lt;/li&gt;
&lt;li&gt;확인응답 패킷 &amp;rarr; 테이블 내의 엔트리 완성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 전송 과정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엔트리를 기반으로 순서대로 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;연결 해제&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;발신지는 패킷을 모두 보낸 후 연결 해제 패킷 송신&lt;/li&gt;
&lt;li&gt;목적지는 확인응답 패킷으로 응답&lt;/li&gt;
&lt;li&gt;모든 라우터는 해당 엔트리 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;레이블 값&lt;/b&gt;을 기반으로 &lt;b&gt;포워딩 결정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 데이터를 보내지만 데이터 앞에 붙은 레이블이 달라짐 (Incoming &amp;rarr; Outgoing)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라우팅 테이블을 참조해서 어떤 포트와 레이블로 보내야 하는지 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청 패킷을 보내면서 incoming 패킷에 대한 레이블 값들을 결정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인응답 과정을 통해 엔트리를 채우는 과정이 마무리됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정해진 경로로 인해 순서가 안정적이고, 안정적으로 데이터를 보내는 것이 가능함&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;네트워크층 서비스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크층 서비스를 위한 논리 주소 체계&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 계층은 end-to-end 통신을 제공하므로 디바이스는 네트워크층 주소 또는 논리 주소라는 인터넷 공통의 식별자가 필요함&lt;/li&gt;
&lt;li&gt;식별자 시스템은 전체 시스템에 동일하게 적용 가능해야 함&lt;/li&gt;
&lt;li&gt;IP address 라는 유일한 주소 공간이 식별자 시스템으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;발신지에서 제공되는 서비스&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패킷화&lt;/li&gt;
&lt;li&gt;: 상위층으로부터 온 데이터를 데이터그램으로 캡슐화&lt;/li&gt;
&lt;li&gt;다음 홉의 논리 주소 찾기&lt;/li&gt;
&lt;li&gt;: 라우팅 테이블 참조&lt;/li&gt;
&lt;li&gt;다음 홉의 물리 주소(MAC) 찾기&lt;/li&gt;
&lt;li&gt;: ARP(주소 변환 프로토콜) 이용&lt;/li&gt;
&lt;li&gt;필요한 경우 데이터그램 단편화&lt;/li&gt;
&lt;li&gt;: 데이터그램이 MTU(한번에 전송 가능한 데이터그램 사이즈)보다 클 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각 라우터에서 제공되는 서비스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전달 받은 데이터를 &lt;b&gt;포워딩&lt;/b&gt; 하는 기능 수행&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력을 위한 인터페이스와 출력을 위한 인터페이스를 별도로 관리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요에 따라 단편화를 수행한 후 출력 인터페이스의 데이터 링크층에 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;라우터는 상위 계층에 관여하지 X&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발신지 컴퓨터에서 제공되는 서비스와 동일한 &lt;b&gt;서비스 항목&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다음 홉의 논리 주소 찾기&lt;/li&gt;
&lt;li&gt;다음 홉의 물리 주소(MAC) 찾기&lt;/li&gt;
&lt;li&gt;단편화&lt;/li&gt;
&lt;li&gt;데이터그램의 유효성 검증 과정이 추가됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유효성 검사: 데이터그램 헤더가 훼손되지 않았고 데이터그램이 올바른 라우터에 전달되었음을 확인하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목적지 컴퓨터에서 제공되는 서비스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 목적지에 전달&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포워딩 기능은 더 이상 필요하지 X&lt;/li&gt;
&lt;li&gt;단편들의 유효성 검사 후 데이터 재조립 수행&lt;/li&gt;
&lt;li&gt;재조립된 데이터는 상위층에 전달
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;재조립 타이머 설정, 재조립 완료 전에 타이머가 만료되면 재전송 오류 메시지 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;네트워크층 문제점들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오류 제어&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 계층은 오류 제어를 제공하지 X
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오류 제어: 훼손, 손실, 중복 데이터그램 탐지 및 수정 메커니즘&lt;/li&gt;
&lt;li&gt;간단하고 빠른 동작을 수행해야 하는 네트워크 계층의 요구사항에 따른 설계&lt;/li&gt;
&lt;li&gt;ICMP라는 프로토콜을 통한 오류 제어는 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터 링크 계층에서 오류 검사를 수행하여도 별도의 오류 제어 필요
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우터에서 발생하는 오류는 데이터 링크 계층의 오류 검사로 탐지하지 못함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;흐름 제어&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수신자의 수신 능력을 초과하지 않도록 발신지에서 데이터 전송 양 조절&lt;/li&gt;
&lt;li&gt;수신자가 송신자에게 상태를 알릴 수 있는 피드백 메커니즘 필요
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 계층은 직접 흐름 제어를 제공하지 X&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;혼잡 제어&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;발신지 컴퓨터에서 송신된 데이터그램 수가 라우터 용량을 초과할 경우 혼잡 상태를 감지하고 관리하는 기능&lt;/li&gt;
&lt;li&gt;서비스 품질 관리&lt;/li&gt;
&lt;li&gt;멀티미디어(오디오, 비디오, 실시간 통신) 통신 제공&lt;/li&gt;
&lt;li&gt;연결방식(비연결형/연결형)마다 다른 전략을 사용할 수 있음&lt;/li&gt;
&lt;li&gt;혼잡 제어 또한 네트워크 층에서 제공하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라우팅&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라우팅 테이블 생성 및 관리 문제&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>공부 기록/네트워크 보안</category>
      <author>도도히히</author>
      <guid isPermaLink="true">https://thisisme0101.tistory.com/15</guid>
      <comments>https://thisisme0101.tistory.com/15#entry15comment</comments>
      <pubDate>Sun, 9 Nov 2025 17:51:41 +0900</pubDate>
    </item>
  </channel>
</rss>