<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>data_buddha.log</title>
        <link>https://velog.io/</link>
        <description>来日方长 : 앞길이 구만리 같다; 앞길이 희망차다. 장래의 기회가 많다.</description>
        <lastBuildDate>Sun, 24 Nov 2024 06:03:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. data_buddha.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/data_buddha" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[네트워크] 응용 계층 - HTTP 응용]]></title>
            <link>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9D%91%EC%9A%A9-%EA%B3%84%EC%B8%B5-HTTP-%EC%9D%91%EC%9A%A9</link>
            <guid>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9D%91%EC%9A%A9-%EA%B3%84%EC%B8%B5-HTTP-%EC%9D%91%EC%9A%A9</guid>
            <pubDate>Sun, 24 Nov 2024 06:03:09 GMT</pubDate>
            <description><![CDATA[<h1 id="쿠키">쿠키</h1>
<ul>
<li>HTTP의 stateless한 특성을 보완하기 위한 수단</li>
<li>서버에서 생성되어 클라이언트 측에 저장되는 &lt;이름, 값&gt; 형태의 데이터<ul>
<li>이외에도 만료기간 같은 추가적인 속성값도 가질 수 있음</li>
</ul>
</li>
<li>클라이언트는 서버로부터 받은 쿠키를 주로 브라우저에 저장<ul>
<li>추후 같은 서버에 요청을 보낼 때 요청 메시지에 쿠키를 포함하여 전송</li>
</ul>
</li>
<li>서버가 클라이언트에게 쿠키를 전송할 때는 응답 메시지의 &quot;Set-Cookie 헤더&quot;가 활용</li>
<li>클라이언트가 서버에게 쿠키를 송신할 때에는 &quot;Cookie 헤더&quot;가 활용</li>
<li>어떤 서버로부터 쿠키를 전달받으면 해당 서버에게 보내는 요청 메시지에는 자동으로 전달받은 쿠키가 포함<h2 id="쿠키의-속성">쿠키의 속성</h2>
</li>
<li>domain과 path 속성을 통해 쿠키를 전송할 도메인과 경로를 제한할 수 있음</li>
<li>Expires와 Max-age 속성으로 쿠키의 유효기간을 명시하여 유효기간이 지나면 해당 쿠키는 삭제되어 전달 x</li>
<li>Secure 속성은 HTTPS를 통해서만 쿠키를 송수신하도록 하는 속성</li>
<li>HttpOnly 속성은 자바스크립트를 통한 쿠키의 접근을 제한하고, 오직 HTTP 송수신을 통해서만 쿠키에 접근하도록 함<h2 id="웹-스토리지-로컬-스토리지와-세션-스토리지">웹 스토리지: 로컬 스토리지와 세션 스토리지</h2>
</li>
<li>웹 스토리지: 브라우저 내의 저장 공간, 일반적으로 쿠키보다 더 큰 데이터를 저장할 수 있음</li>
<li>쿠키는 서버로 자동 전송되지만, 웹 스토리지의 정보는 서버로 자동 전송되지 않음</li>
<li>로컬 스토리지는 별도로 삭제하지 않는 한 영구적으로 저장 가능</li>
<li>세션 스토리지는 세션이 유지되는 동안(브라우저가 열려있는 동안) 유지되는 정보<h1 id="캐시">캐시</h1>
</li>
<li>캐시 메모리는 &quot;메모리에 접근하는 시간을 줄이기 위해 자주 참조되는 내용을 저장하는 장치&quot;<ul>
<li>HTTP에서도 이와 유사한 개념인 HTTP 캐시가 있음</li>
</ul>
</li>
<li>HTTP의 캐시는 &quot;응답받은 자원의 사본을 임시 저장하여 불필요한 대역폭 낭비와 응답 지연을 방지하는 기술&quot;</li>
<li>응답 메시지에 캐시의 유효기간을 설정할 수 있음</li>
<li>클라이언트가 응답받은 자원을 임시 저장하여(캐시하여) 이용하다가 유효기간이 만료되면 다시 서버에 자원을 요청해야 함</li>
<li>캐시에 유효기간이 존재하는 이유는 &quot;클라이언트가 캐시를 참조하는 사이 서버의 원본 데이터가 변경되어 원본 데이터와 캐시된 사본 데이터 간의 일관성이 깨질 수 있기 때문&quot;<ul>
<li>캐시된 사본 데이터와 원본 데이터가 얼마나 유사한지의 정도는 &quot;캐시 신선도&quot;라고 표현</li>
</ul>
</li>
<li>캐시된 데이터의 유효 기간이 만료되었더라도, 서버의 원본 데이터가 변경되지 않았다면 서버로부터 같은 자원을 응답받을 필요가 없음<ul>
<li>따라서 클라이언트는 캐시의 유효 기간이 만료되었을 때, 서버에게 &quot;원본 자원이 변경된 적이 있는지&quot; 질의</li>
<li>클라이언트가 서버에게 원본 데이터의 변경 여부를 물을 때에는 &quot;날짜&quot;를 기반으로 묻거나, &quot;엔티티 태그&quot;를 기반으로 물을 수 있음</li>
</ul>
</li>
<li>날짜를 기반으로 물을 때에는 &quot;If-Modified_Since 헤더&quot;를 통해서<ul>
<li>서버의 응답으로는</li>
</ul>
<ol>
<li>서버가 요청받는 자원이 변경된 경우 : 상태 코드 200과 함께 새로운 자원을 반환</li>
<li>서버가 요청받는 자원이 변경되지 않은 경우 : 304(Not Modified) 상태 코드와 함께 Last-Modified 헤더로 마지막 변경 시점을 알림</li>
<li>서버가 요청받는 자원이 없는 경우 : 404 상태 코드 전송</li>
</ol>
</li>
<li>엔티티 태그 기반<ul>
<li>Etag라고 부르는 &quot;엔티티 태그&quot;</li>
<li>&quot;자원의 버전&quot;을 식별하기 위한 정보</li>
<li>자원이 변경될 때마다 자원의 버전을 식별하는 Etag값이 변경되고, 반대로 자원이 변경되지 않으면 Etag 값도 변경되지 않음</li>
<li>대표적인 요청 헤더 &quot;If-None-Match 헤더&quot;를 통해서 이루어짐</li>
<li>서버의 응답은 위의 3가지 경우와 같음<h1 id="콘텐츠-협상">콘텐츠 협상</h1>
</li>
</ul>
</li>
<li><strong>실은 HTTP 메시지를 통해 주고받는 것이 &quot;자원&quot;이 아니라, &quot;자원의 표현&quot;</strong><ul>
<li><strong>&quot;표현&quot;이란 송수신 가능한 자원의 형태를 의미</strong></li>
</ul>
</li>
<li>같은 자원에 대해 할 수 있는 여러 표현 중(ex&gt; xml, json, jpg, txt...) 클라이언트가 가장 적합한 자원의 표현을 제공하는 기술을 &quot;콘텐츠 협상&quot;이라고 함</li>
<li>클라이언트가 선호하는 자원의 표현을 &quot;콘텐츠 협상 헤더&quot;를 통해 서버에게 전송하면, 서버는 클라이언트가 요청한 자원의 표현을 응답<ul>
<li>Accept: 선호하는 미디어 타입을 나타내는 헤더</li>
<li>Accept-Language: 선호하는 언어를 나타내는 헤더</li>
<li>Accept-Encoding: 선호하는 인코딩 방식을 나타내는 헤더<h1 id="보안-ssltls와-https">보안: SSL/TLS와 HTTPS</h1>
</li>
</ul>
</li>
<li>HTTPS는 HTTP에 SSL 혹은 TLS라는 프로토콜의 동작이 추가된 프로토콜</li>
<li>SSL Secure Socket Layer과 TLS Transport Layer Security는 모두 인증과 암호화를 수행하는 프로토콜로, TLS는 SSL을 계승한 프로토콜</li>
<li>TLS 1.3기반 HTTPS 메시지는 크게 아래와 같은 단계를 거쳐 전송<ol>
<li>TCP 쓰리 웨이 핸드셰이크</li>
<li>TLS 핸드 셰이크</li>
<li>메시지 송수신</li>
</ol>
</li>
<li>2번의 과정을 거쳐 서로에 대한 인증과 메시지 암호화가 이루어지므로, 2번을 거쳐 3번에서 주고받는 메시지는 암호화된 메시지</li>
<li>TLS 핸드 셰이크의 핵심 내용은 크게 2가지<ol>
<li>TLS 핸드 셰이크를 통해 암호화 통신을 위한 키를 생성/교환이 가능</li>
<li>인증서 송수신과 검증이 이루어질 수 있음<h2 id="암호화-통신을-위한-키-생성교환">암호화 통신을 위한 키 생성/교환</h2>
</li>
</ol>
</li>
<li>TLS에서 활용되는 암호화 알고리즘을 통해 평문을 암호화하거나 복호화하려면 &quot;키&quot;라는 정보가 필요</li>
<li>&quot;키&quot;는 암호화 통신을 수행하는 두 호스트만 알고 있어야 하는 정보로,</li>
<li>TLS 핸드셰이크 과정에서 &quot;ClientHello 메시지&quot;, &quot;ServerHello 메시지&quot;를 주고 받으며 생성/교환</li>
<li>ClientHello 메시지에는 &quot;사용 가능한 암호화 알고리즘과 해시 함수&quot;를 서버에 알리기 위한 정보가 포함<ul>
<li>이 정보를 &quot;암호 스위트&quot;</li>
</ul>
</li>
<li>ServerHello 메시지는 제시된 암호 스위트들을 선택하는 메시지<ul>
<li>선택된 TLS의 버전, 암호 스위트 등의 정보, 등이 포함</li>
</ul>
</li>
<li>ClientHello와 ServerHello메시지를 주고 받으면 암호화된 통신을 위해 협의되어야 할 정보들이 결정되고, 결정된 정보를 토대로 &quot;키&quot;를 만들어 암호화/복호화 할 수 있도록 함<h2 id="인증서-송수신과-검증">인증서 송수신과 검증</h2>
</li>
<li>인증서는 &quot;당신이 통신을 주고받는 상대방은 틀림없이 당신이 의도한 대상이 맞다&quot;라는 사실을 입증하기 위한 정보</li>
<li>인증서를 발급하고 검증하는 제 3의 &quot;인증기관(CA)&quot; 공인 기관</li>
<li>TLS에서 인증서 관련한 메시지로는 &quot;Certificate&quot;와 &quot;CertificateVerify&quot; 메시지<ul>
<li>Certificate 메시지에는 인증서 내용들이 포함</li>
<li>CertificateVerify 메시지에는 인증서의 내용이 올바른지 검증하기 위한 내용들이 포함</li>
</ul>
</li>
<li>암호화에 사용할 키, 인증서 확인한 후 TLS 핸드셰이크의 마지막을 의미하는 Finished 메시지를 주고받고, TLS 핸드셰이크를 통해 얻어낸 키를 기반으로 암호화된 데이터를 주고 받음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크] 응용 계층 - HTTP의 기초]]></title>
            <link>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9D%91%EC%9A%A9-%EA%B3%84%EC%B8%B5-HTTP%EC%9D%98-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%9D%91%EC%9A%A9-%EA%B3%84%EC%B8%B5-HTTP%EC%9D%98-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Wed, 20 Nov 2024 04:13:05 GMT</pubDate>
            <description><![CDATA[<h1 id="dns와-uriurl">DNS와 URI/URL</h1>
<h2 id="도메인-네임과-dns">도메인 네임과 DNS</h2>
<ul>
<li>호스트의 IP 주소는 언제든지 바뀔 수 있음 -&gt; &quot;도메인 네임&quot; 사용의 이유</li>
<li>도메인 네임과 그에 대응하는 IP 주소는 &quot;네임 서버&quot;에서 관리<ul>
<li>네임서버 == DNS 서버</li>
</ul>
</li>
<li>호스트는 네임 서버에 &quot;특정한 도메인 네임을 가진 호스트의 IP 주소&quot;를 질의함으로써 패킷을 주고받고자 하는 호스트의 IP 주소를 얻어낼 수 있음<ul>
<li>이러한 과정을 &quot;도메인 네임을 풀이(resolve)한다.&quot;, &quot;리졸빙한다&quot;라고 표현<h3 id="도메인-네임의-계층적-구조">도메인 네임의 계층적 구조</h3>
</li>
<li>점 (.)을 기준으로 계층적으로 분류됨</li>
<li>최상단 (제일 오른쪽)에 &quot;루트 도메인&quot;이 있고,</li>
<li>그 다음 단계에는 &quot;최상위 도메인(TLD, Top Level Domain)이 있음<ul>
<li>최상위 도메인 예시: com, net..</li>
</ul>
</li>
<li>최상위 도메인은 이름과 달리 &quot;최상위&quot;가 아님<ul>
<li>도메인 네임의 마지막 부분인 &quot;점으로 표현되는 루트 도메인&quot;도 도메인 네임의 일부이기 때문</li>
<li>일반적으로 루트 도메인은 생략하기 때문에 &quot;최상위 도메인&quot;을 도메인 네임의 마지막 부분으로 간주해 &quot;최상위 도메인&quot;이라고 표현한 것</li>
</ul>
</li>
<li>최상위 도메인의 하부 도메인 : 2단계 도메인(세컨드 레벨 도메인)</li>
<li>2단계 도메인의 하부 도메인 : 3단계 도메인( ex. www)<h3 id="네임-서버의-계층적-구조">네임 서버의 계층적 구조</h3>
</li>
</ul>
</li>
<li>네임 서버는 여러 개 존재, 전 세계 여러 곳에 위치. 즉, 네임서버는 분산되어 관리</li>
<li>계층적으로 분산되어 있는 도메인 네임에 대한 관리 체계를 &quot;도메인 네임 시스템(DNS)&quot;라고 불름<h3 id="리졸빙-과정">리졸빙 과정</h3>
</li>
<li>로컬 네임 서버에게 도메인 네임을 질의<ul>
<li>로컬 네임 서버 : 클라이언트와 맞닿아 있는 네임 서버, 클라이언트가 리졸빙할 시에 가장 먼저 찾게 되는 네임 서버</li>
</ul>
</li>
<li>로컬 네임 서버가 IP 주소를 모른다면, 알아낼 때까지 루트 도메인을 관장하는 서버(루트 네임 서버)에게 질의하고, 최상위 도메인을 관장하는 서버(TLD 네임 서버).. 등에 걸쳐 질의하게 됨</li>
<li>즉, 도메인 네임은 계층적 구조이며, 도메인 네임의 각 구조를 관리하는 서버 또한 계층적 구조로 관리되며, 클라이언트와 맞닿아 있는 &quot;로컬 네임 서버&quot;가 도메인 네임과 대응되는 IP 주소를 알아낼 때까지 &quot;계층적인 도메인 네임 서버들&quot;에게 질의를 반복</li>
<li><strong>DNS 캐시</strong> : 네임 서버들이 기존에 응답받은 결과를 임시로 저장했다가, 추후 같은 질의에 활용<h2 id="자원과-uriurl">자원과 URI/URL</h2>
</li>
<li>자원을 식별하기 위한 정보 : 자원 식별자 URI</li>
<li>위치를 식별하기 위한 정보 : 위치 식별자 URL</li>
<li>네트워크에서 자원이란? 네트워크 상의 메시지를 주고받는 대상<h3 id="uri">URI</h3>
</li>
<li>웹 상에서의 자원을 식별하기 위한 정보를 의미</li>
<li>&quot;이름&quot;을 기반으로 하기도 하고, &quot;위치&quot;를 기반으로 하기도 함<ul>
<li>이름 기반 자원 식별 : URN</li>
<li>위치로 자원을 식별 : URL</li>
</ul>
</li>
<li>즉, URI를 위치로 식별하는 것이 URL<h3 id="url의-구조">URL의 구조</h3>
</li>
<li>schme<ul>
<li>일반적으로 사용할 프로토콜이 명시</li>
</ul>
</li>
<li>authority<ul>
<li>호스트를 특정할 수 있는 IP 주소나 도메인 네임</li>
<li>포트 번호도 명시 가능</li>
</ul>
</li>
<li>path<ul>
<li>자원이 위치하고 있는 경로가 명시</li>
<li>슬래시(/)를 기준으로 계층적으로 표현</li>
<li>최상위 경로 역시 슬래시로 표현</li>
</ul>
</li>
<li>query<ul>
<li>URL에 대한 매개변수 역할</li>
<li>쿼리 문자열 or 쿼리 파라미터 등으로 불림</li>
<li>자원을 식별하기 위한 추가적인 정보</li>
<li>물음표(?)로 시작되는 &lt;키=값&gt; 형태의 데이터</li>
<li>엠퍼샌드(&amp;)를 사용하여 여러 쿼리 연결 가능</li>
</ul>
</li>
<li>fragment<ul>
<li>자원의 일부분, 자원의 한 조각을 가리키기 위한 정보</li>
<li>일반적으로 HTML 파일과 같은 자원에서의 특정 부분을 가리키는 데 사용<h1 id="http의-특징과-메시지-구조">HTTP의 특징과 메시지 구조</h1>
</li>
</ul>
</li>
<li>HTTP의 목적은 &quot;애플리케이션의 다양한 자원을 네트워크를 통해 송수신하는 것&quot;<h2 id="http의-특징">HTTP의 특징</h2>
</li>
</ul>
<ol>
<li>요청 응답 기반 프로토콜</li>
</ol>
<ul>
<li>HTTP 요청과 HTTP 응답을 주고받는 구조로 작동</li>
</ul>
<ol start="2">
<li>미디어 독립적 프로토콜</li>
</ol>
<ul>
<li>HTTP는 주고받을 자원의 특성과 무관하게 자원을 주고받는 수단(인터페이스)의 역할만 수행</li>
<li>HTTP 메시지로 주고받는 자원의 종류를 &quot;미디어 타입(MIME 타입)&quot;이라고 부름<ul>
<li>미디어 타입은 슬래시를 기준으로 하는 &quot;타입/서브타입&quot;의 형식으로 구성</li>
</ul>
</li>
</ul>
<ol start="3">
<li>stateless 프로토콜</li>
</ol>
<ul>
<li>HTTP는 상태를 유지하지 않는 stateless 프로토콜</li>
<li>즉, 서버는 HTTP 요청을 보낸 클라이언트 관련 상태를 기억하지 않음<ul>
<li>모든 HTTP 요청은 기본적으로 독립적인 요청으로 간주</li>
</ul>
</li>
<li>왜 상태를 유지하지 않을까?<ul>
<li>HTTP 서버는 많은 클라이언트와 상호작용</li>
<li>모든 클라이언트의 상태 정보를 유지하는 것은 큰 부담</li>
<li>또한, 서버는 여러 대로 구성될 수 있는데, 그렇다면 여러 대의 서버가 모두 클라이언트의 상태 정보를 공유해야 함</li>
</ul>
</li>
</ul>
<ol start="4">
<li>지속 연결 프로토콜</li>
</ol>
<ul>
<li>초기 HTTP 버전(HTTP 1.0 이하)에서는 쓰리 웨이 핸드셰이크를 통해 TCP 연결을 수립한 후, 요청에 대한 응답을 받으면 연결을 종료하는 방식으로 동작<ul>
<li>추가적인 요청-응답 을 위해선 매번 새롭게 연결을 수립하고 종료했어야 했음</li>
</ul>
</li>
<li>하지만, 최근 사용하고 있는(HTTP 1.1 이상)에서는 &quot;지속 연결&quot;이라는 기술을 제공<ul>
<li>다른 표현으로는 &quot;킵 얼라이브 keep-alive&quot;라고 부름</li>
<li>이는 하나의 TCP 연결 상에서 여러 개의 요청-응답을 주고받을 수 있는 기술을 의미<h3 id="http-11">HTTP 1.1</h3>
</li>
</ul>
</li>
<li>킵 얼라이브 기능 공식적으로 지원</li>
<li>메시지를 평문(Plain text)으로 주고받는다는 특징<h3 id="http-20">HTTP 2.0</h3>
</li>
<li>바이너리 데이터 기반 송수신 : 평문대신 바이너리 데이터를 기반으로 메시지 송수신</li>
<li>헤더 압축 : 헤더 압축 가능, 네트워크 이용 효율 향상</li>
<li>서버 푸시 : 클라이언트가 요청하지 않았더라도 미래에 필요할 것으로 예상되는 자원을 미리 전송하는 기능</li>
<li>HTTP 멀티플렉싱 기법<ul>
<li>요청-응답 메시지를 병렬적으로 주고받는 기술</li>
<li>요청과 응답을 주고받는 단위는 하나의 스트림에서 이루어지고, 이러한 스트림 여러 개를 독립적으로 활용하는 기술</li>
</ul>
</li>
<li>HTTP 2.0은 위와 같은 기능(특히 HTTP 멀티 플렉싱 기법)을 통해 HOL 블로킹이라는 HTTP 1.1의 고질적인 문제를 완화한 버전으로도 알려짐<ul>
<li>HOL 블로킹이란?<ul>
<li>같은 큐에 대기하며 순차적으로 처리되는 여러 패킷이 있을 때, 첫 번째 패킷의 처리 지연으로 인해 나머지 패킷들의 처리도 모두 지연되는 상황<h3 id="http-30">HTTP 3.0</h3>
</li>
</ul>
</li>
</ul>
</li>
<li>UDP를 기반으로 동작</li>
<li>이전까지의 HTTP 버전들은 모두 TCP를 기반으로 동작</li>
<li>HTTP 3.0부턴 UDP를 기반으로 구현된 QUIC이라는 프로토콜로 동작</li>
<li>TCP에 비해 송수신 속도가 빠름<h2 id="http의-메시지-구조">HTTP의 메시지 구조</h2>
</li>
<li>시작 라인과 필드 라인, 메시지 본문으로 이루어져 있음<ul>
<li>필드 라인 : 0개 이상 가능</li>
<li>메시지 본문 : 생략 가능<h3 id="시작라인">시작라인</h3>
</li>
</ul>
</li>
<li>&quot;시작 라인&quot;으로 HTTP 메시지가 요청인지 응답인지 구분 가능<ul>
<li>요청일 경우, 시작 라인 -&gt; &quot;요청 라인&quot;이 되고</li>
<li>응답일 경우, 시작 라인 -&gt; &quot;상태 라인&quot;이 됨</li>
</ul>
</li>
<li>요청 라인<ul>
<li>메서드, 요청 대상, HTTP 버전으로 구성</li>
</ul>
</li>
<li>상태 라인<ul>
<li>HTTP 버전, 상태 코드, 이유 구문(생략 가능)으로 구성<h3 id="필드-라인">필드 라인</h3>
</li>
</ul>
</li>
<li>HTTP 헤더가 명시</li>
<li>HTTP 헤더는 HTTP 메시지 전송과 관련한 부가 정보이자 제어 정보</li>
</ul>
<h1 id="http-메서드와-상태-코드">HTTP 메서드와 상태 코드</h1>
<ul>
<li>요청 라인에서는 메서드, 상태 라인에서는 상태 코드가 핵심<h2 id="http-메서드">HTTP 메서드</h2>
</li>
<li>HEAD<ul>
<li>응답 메시지에 메시지 본문이 포함되지 않는다는 점을 제외하면 GET 메서드와 동일</li>
</ul>
</li>
<li>POST <ul>
<li>서버로 하여금 특정 작업을 처리하도록 요청하는 메서드</li>
<li>많은 경우에 &quot;클라이언트가 서버에 새로운 자원을 생성하고자 할 때&quot; 사용됨</li>
<li>POST 요청의 응답 메시지에선 &quot;Location 헤더&quot;를 통해 생성된 자원의 위치를 응답하고, 메시지 본문으로 생성된 자원을 응답</li>
</ul>
</li>
<li>PUT, PATCH<ul>
<li>PUT : 덮어쓰기, 요청 메시지 본문으로 완전히 대체</li>
<li>PATCH : 부분적 수정, 요청 메시지 본문에 해당하는 부분만 수정<h2 id="http-상태-코드">HTTP 상태 코드</h2>
</li>
</ul>
</li>
<li>요청의 결과를 나타내는 3자리 정수</li>
<li>200번대<ul>
<li>200 : 요청 성공</li>
<li>201 : 요청 성공, 새로운 자원 생성</li>
<li>202 : 요청을 잘 받았으나, 아직 요청한 작업을 끝내지 않았음</li>
</ul>
</li>
<li>300번대<ul>
<li>리다이렉션 관련 코드</li>
<li>리다이렉션이란? 클라이언트가 요청한 자원이 다른 곳에 있을 때 다른 곳으로 요청을 이동시키는 것을 의미</li>
<li>클라이언트가 요청한 자원이 다른 URL에 있을 경우, 서버는 리다이렉션 관련 상태 코드와 함께 응답 메시지의 Location 헤더를 통해 요청한 자원이 위치한 URL을 안내해줌</li>
<li>이를 수신한 클라이언트는 Location 헤더에 명시된 URL로 재요청을 보내 새로운 URL에 대한 응답을 받게 됨</li>
<li>영구적 리다이렉션? 자원이 완전히 새로운 곳으로 이동하여 경로가 영구적으로 재지정되는 것을 의미</li>
<li>일시적 리다이렉션? 자원의 위치가 임의로 변경되었거나 임시로 사용할 URL이 필요한 경우에 주로 사용</li>
<li>308은 301을 보완하기 위한 상태 코드<ul>
<li>301의 경우 클라이언트가 Location 헤더로 재요청을 보낼 때, 처음 요청과 다른 메서드로 요청할 수 가능성이 있지만,</li>
<li>308의 경우 Location 헤더에 담긴 URL로 요청을 보낼 때, 처음 요청과 같은 메서드로 요청</li>
</ul>
</li>
</ul>
</li>
<li>400번대<ul>
<li>401 : 인증을 요구하는 상태 코드</li>
<li>403 : 권한(인가)를 요구하는 상태 코드</li>
<li>인증이란 &quot;자신이 누구인지를 증명하는 작업&quot;</li>
<li>권한이란 &quot;인증된 주체에게 허용된 작업&quot;을 의미</li>
</ul>
</li>
<li>500번대<ul>
<li>서버에게 잘못이 있음을 나타내는 코드 상태</li>
<li>502 : 중간 서버의 통신 오류<h1 id="http-주요-헤더">HTTP 주요 헤더</h1>
<h2 id="요청-메시지에서-주로-활용되는-http-헤더">요청 메시지에서 주로 활용되는 HTTP 헤더</h2>
</li>
</ul>
</li>
<li>HOST<ul>
<li>요청을 보낼 호스트가 명시되는 헤더, 도메인 네임이나 IP 주소로 표현</li>
</ul>
</li>
<li>User-Agent<ul>
<li>HTTP 요청을 시작하는 클라이언트 측의 프로그램을 의미</li>
<li>해당 헤더를 통해 HTTP 요청 메시지를 보낸 클라이언트의 접속 수단(웹 인지 모바일인지..)을 유추할 수 있다는 사실을 기억하자</li>
</ul>
</li>
<li>Referer<ul>
<li>클라이언트가 요청을 보낼 때 머무르던 URL이 명시, 이를 통해 클라이언트의 유입 경로를 알 수 있음<h2 id="응답-메시지에서-주로-활용되는-http-헤더">응답 메시지에서 주로 활용되는 HTTP 헤더</h2>
</li>
</ul>
</li>
<li>Server<ul>
<li>응답을 보내는 서버 호스트와 관련된 정보가 명시</li>
</ul>
</li>
<li>Allow<ul>
<li>처리 가능한 HTTP 메서드의 목록을 알리기 위해 사용</li>
<li>405번 상태 코드와 짝궁 (수신한 요청 메시지의 메서드를 지원하지 않는다는 의미의 코드)</li>
</ul>
</li>
<li>Location<ul>
<li>클라이언트에게 자원의 위치를 알려주기 위해 사용<h2 id="요청과-응답-메시지-모두에서-활용되는-http-헤더">요청과 응답 메시지 모두에서 활용되는 HTTP 헤더</h2>
</li>
</ul>
</li>
<li>Content-type, Content-Language, Content-Encoding<ul>
<li>메시지 본문이 어떻게 &quot;표현&quot;되었는지와 관련된 헤더라서 &quot;표현 헤더&quot;라고도 불림</li>
</ul>
</li>
<li>Connection<ul>
<li>HTTP 메시지를 송신하는 호스트가 어떠한 방식의 연결을 원하는지 명시하는 헤더</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB] RDBMS의 기본]]></title>
            <link>https://velog.io/@data_buddha/DB-RDBMS%EC%9D%98-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@data_buddha/DB-RDBMS%EC%9D%98-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Tue, 12 Nov 2024 07:30:00 GMT</pubDate>
            <description><![CDATA[<h1 id="테이블의-구성--필드와-레코드">테이블의 구성 : 필드와 레코드</h1>
<ul>
<li>테이블 내의 특정 레코드를 식별할 수 있는 필드의 집합은 &quot;키&quot;라고 함<ul>
<li>레코드의 식별뿐만 아니라 테이블 간의 참조에도 사용</li>
</ul>
</li>
</ul>
<h2 id="키">키</h2>
<ul>
<li>테이블의 레코드를 식별할 수 있는 하나 이상의 필드를 &quot;키&quot;라고 함</li>
<li>테이블의 접근 속도를 높이기 위해서도 사용됨</li>
<li>후보키<ul>
<li>테이블의 한 레코드를 식별하기 위한 필드의 최소 집합</li>
<li>특정 레코드를 유일하게 식별한다는 점에서 &quot;유일성을 갖추었다&quot;라고 표현</li>
<li>불필요한 필드가 키에 포함되어 있지 않고, 최소한의 정보로 레코드를 식별한다는 점에서 &quot;최소성을 갖추었다&quot;라고 표현</li>
<li>즉, 후보 키는 &quot;유일성&quot;과 &quot;최소성&quot;을 모두 만족하는 키</li>
<li>기본 키들이 될 수 있는 후보</li>
</ul>
</li>
<li>복합 키<ul>
<li>두 필드 이상으로 구성된 후보 키를 복합 키</li>
</ul>
</li>
<li>슈펴 키<ul>
<li>레코드를 식별하기 위한 필드로 &quot;최소 집합&quot;이 아닌 그저 &quot;필드의 집합&quot;은 슈퍼 키라고 함</li>
<li>유일성은 만족하지만, 최소성은 만족하지 않음</li>
<li>따라서, 불필요한 필드가 포함될 수 있음</li>
</ul>
</li>
<li>기본 키<ul>
<li>중복된 값 x</li>
<li>반드시 값이 존재해야 함</li>
<li>유일성과 최소성을 만족</li>
</ul>
</li>
<li>대체 키<ul>
<li>기본 키가 아닌 후보 키</li>
</ul>
</li>
<li>외래 키<ul>
<li>다른 테이블의 기본 키를 참조하는 필드</li>
<li>테이블 간의 참조 관계를 형성할 때 사용하는 키<h1 id="테이블의-관계">테이블의 관계</h1>
<h2 id="일대일-대응-관계">일대일 대응 관계</h2>
</li>
</ul>
</li>
<li>하나의 레코드가 다른 테이블의 레코드 하나에만 대응되는 경우<h2 id="일대다-대응-관계">일대다 대응 관계</h2>
</li>
<li>하나의 레코드가 다른 테이블의 여러 레코드와 대응될 수 있는 경우<h2 id="다대다-대응-관계">다대다 대응 관계</h2>
</li>
<li>한 테이블의 여러 레코드가 다른 테이블의 여러 레코드와 대응되는 경우</li>
<li>다대다 대응 관계는 일반적으로 중간 테이블을 수반<ul>
<li>중간 테이블을 통한 다대다 대응 관계는 중간 테이블에 대한 일대다 대응이 두 번 이뤄진 것과 같음<h1 id="무결성-제약-조건">무결성 제약 조건</h1>
</li>
</ul>
</li>
<li>무결성 : 일관되며 유효한 데이터의 상태<ul>
<li>즉, 무결성 제약 조건이란 DB에 저장된 데이터의 일관성과 유효성을 유지하기 위해 마땅히 지켜야 하는 조건</li>
</ul>
</li>
</ul>
<ol>
<li>도메인 제약 조건<ul>
<li>테이블이 가질 수 있는 필드 타입과 범위에 대한 규칙</li>
<li>각각의 필드 타입은 원자 값을 가져야함</li>
<li>지정된 필드 타입을 준수해야 함</li>
</ul>
</li>
</ol>
<ul>
<li>원자 값?<ul>
<li>더 이상 쪼갤 수 없는 단일한 값을 의미</li>
<li>테이블의 각 필드 데이터는 더 이상 쪼갤 수 없는 단일한 값이어야 함</li>
</ul>
</li>
</ul>
<ol start="2">
<li><p>키 제약 조건</p>
<ul>
<li>레코드를 고유하게 식별할 수 있는 키로 지정된 필드에 중복된 값이 존재해서는 안된다는 제약 조건</li>
</ul>
</li>
<li><p>엔티티 무결성 제약 조건</p>
<ul>
<li>기본 키로 지정한 필드는 고유한 값이어야 하며, NULL이 되어서는 안된다는 규칙</li>
<li>기본 키와 관련된 제약조건이므로 &quot;기본 키 제약 조건&quot;이라고도 불림</li>
<li>즉, 기본 키가 갖추어야 할 조건을 나타냄</li>
</ul>
</li>
<li><p>참조 무결성 제약 조건</p>
<ul>
<li>외래 키를 통해 다른 테이블을 참조할 때 데이터의 일관성을 지키기 위한 제약 조건</li>
<li>외래 키는 참조하는 테이블의 기본 키와 같은 값을 갖거나 NULL 값을 가져야 한다는 규칙</li>
<li>외래 키와 관련된 제약 조건이므로 &quot;외래 키 제약 조건&quot;이라고도 불림</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB] DB의 큰 그림]]></title>
            <link>https://velog.io/@data_buddha/DB-DB%EC%9D%98-%ED%81%B0-%EA%B7%B8%EB%A6%BC</link>
            <guid>https://velog.io/@data_buddha/DB-DB%EC%9D%98-%ED%81%B0-%EA%B7%B8%EB%A6%BC</guid>
            <pubDate>Tue, 12 Nov 2024 07:10:51 GMT</pubDate>
            <description><![CDATA[<h1 id="db와-dbms">DB와 DBMS</h1>
<ul>
<li>DB : 원하는 기능을 동작시키기 위해 마땅히 저장해야 하는 정보의 집합</li>
<li>DBMS : DB 관리 시스템</li>
</ul>
<h2 id="서버로서의-dbms">서버로서의 DBMS</h2>
<ul>
<li>DBMS는 사용자와 직접 상호작용하기보다는 사용자(개발자)가 만든 프로그램과 상호작용</li>
<li>응용 프로그램들 입장에서 DBMS는 마치 서버와 같음</li>
<li>쿼리 : 사용자와 응용 프로그램이 DBMS의 언어를 통해 DB를 다룰 수 있게함</li>
<li>대표적인 DB 언어 : SQL <ul>
<li>데이터베이스에 질의하기 위한 구조화된 언어</li>
</ul>
</li>
<li>SQL은 크게 4가지 종류<ul>
<li>DDL : 데이터 정의</li>
<li>DML : 데이터 조작</li>
<li>DCL : 데이터 제어</li>
<li>TCL : 트랜잭션 제어<h1 id="파일-대신-db를-이용하는-이유">파일 대신 DB를 이용하는 이유</h1>
</li>
</ul>
</li>
</ul>
<ol>
<li>데이터 일관성 및 무결성 제공이 어려움</li>
<li>불필요한 중복 저장이 많아짐</li>
<li>데이터 변경 시, 연관 데이터 변경이 어려움</li>
<li>정교한 검색이 어려움</li>
<li>백업 및 복구가 어려움<h1 id="db의-저장-단위와-트랜잭션">DB의 저장 단위와 트랜잭션</h1>
<h2 id="db의-저장-단위">DB의 저장 단위</h2>
</li>
</ol>
<ul>
<li>DB에는 다양한 속성을 가진 독립적 객체들이 저장될 수 있음</li>
<li>&quot;독립적으로 존재할 수 있는 객체&quot;를 &quot;엔티티&quot;라고 함<ul>
<li>어떠한 특성을 가진 대상이라고 보면 됨</li>
</ul>
</li>
<li>&quot;속성&quot;은 엔티티의 특성을 의미</li>
<li>같은 &quot;속성&quot;을 공유하는 개별 엔티티는 같은 &quot;엔티티 집합&quot;에 속한다고 할 수 있음</li>
<li>그렇다면 DBMS에서는 엔티티와 엔티티 집합을 어떻게 각각 표현하고 저장할까?<ul>
<li>RDBMS는 엔티티 집합을 이차원 테이블 형태의 표로 표현하고, 이를 &quot;릴레이션&quot;이라고 부름</li>
<li>NoSQL DBMS의 MongoDB에서는 엔티티 집합을 &quot;컬렉션&quot;이라고 부름</li>
</ul>
</li>
<li>각각의 엔티티를 &quot;레코드&quot;라고 부름 (테이블의 행)</li>
<li>엔티티의 속성은 &quot;필드&quot;라고 함 (테이블의 열)</li>
<li>MongoDB에선 개별 레코드를 JSON 형태의 &quot;도큐먼트&quot;라는 단위로 표현<ul>
<li>필드를 JSON 키의 형태로 표현<h2 id="스키마">스키마</h2>
</li>
</ul>
</li>
<li>RDBMS와 NoSQL의 가장 주요한 구분점 : 스키마</li>
<li>스키마는 DB에 저장되는 레코드의 구조와 제약조건을 정의한 것<ul>
<li>레코드가 지켜야할 틀이자 청사진</li>
</ul>
</li>
<li>RDBMS에서는 명확한 스키마가 정의되며, 레코드들은 이 스키마로 정해진 테이블의 구조, 필드의 데이터 타입 및 제약 조건을 따라야 함</li>
<li>NoSQL은 스키마-리스 DB로도 불림<h2 id="트랜잭션과-acid">트랜잭션과 ACID</h2>
</li>
<li>트랜잭션 : DB와의 논리적 상호작용 단위를 의미<ul>
<li>DB가 처리하는 작업의 단위를 나타내므로 &quot;초당 트랜잭션&quot;이라는 지표로 DB의 작업 성능을 나타내기도 함</li>
</ul>
</li>
<li>여러 작업을 내포하는 트랜잭션이 동시다발적으로 실행될 때는 안전한 트랜잭션을 보장하기 위해 지켜야 하는 성질이 있음<ul>
<li>이를 ACID라고 함</li>
</ul>
</li>
</ul>
<ol>
<li><p>원자성 A</p>
<ul>
<li>트랜잭션이 하나의 단위로 처리되는 것을 원자성이라고 함</li>
<li>ALL OR NOTHING</li>
<li>주어진 작업을 모두 성공하거나 모두 실패할 뿐, 일부 성공이나 일부 실패는 허용하지 않음</li>
<li>커밋과 롤백<ul>
<li>원자성을 트랜잭션이 반드시 커밋되거나 롤백되는 성질이라고 표현</li>
<li>커밋 : 트랜잭션을 성공적으로 수행하여 트랜잭션을 종료하는 것을 의미</li>
<li>롤백 : 이전 트랜잭션을 취소하는 작업을 의미, DB를 롤백하면 트랜잭션이 이루어지기 전으로 되돌릴 수 있음</li>
</ul>
</li>
</ul>
</li>
<li><p>일관성 C</p>
<ul>
<li>트랜잭션 전후로 DB가 일관된 상태를 유지하는 성질을 &quot;일관성&quot;</li>
<li>&quot;일관된 상태&quot;란 DB가 지켜야하는 일련의 규칙들을 지키는 상태</li>
</ul>
</li>
<li><p>격리성 I</p>
<ul>
<li>동시에 수행되는 여러 트랜잭션이 서로 간섭하지 않도록 보장하는 것</li>
<li>한 트랜잭션이 어떤 데이터에 접근하여 조작 중일 때는 다른 트랜잭션이 접근할 수 없음</li>
</ul>
</li>
<li><p>지속성 D</p>
<ul>
<li>트랜잭션이 성공적으로 완료된 후에 그 결과가 영구적으로 반영되는 성질</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크] 전송 계층 - TCP와 UDP]]></title>
            <link>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%A0%84%EC%86%A1-%EA%B3%84%EC%B8%B5-TCP%EC%99%80-UDP</link>
            <guid>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%A0%84%EC%86%A1-%EA%B3%84%EC%B8%B5-TCP%EC%99%80-UDP</guid>
            <pubDate>Tue, 12 Nov 2024 05:55:46 GMT</pubDate>
            <description><![CDATA[<h1 id="tcp와-udp의-목적과-특징">TCP와 UDP의 목적과 특징</h1>
<h2 id="포트를-통한-프로세스-식별">포트를 통한 프로세스 식별</h2>
<ul>
<li>패킷의 최종 송수신 대상은 호스트가 아니라, 호스트가 실행하는 프로세스</li>
<li>호스트가 실행하는 프로세스 식별 : <strong>포트 PORT 번호</strong>를 통해 식별</li>
<li>네트워크 패킷을 주고 받는 프로세스에는 포트 번호가 할당됨</li>
<li>IP주소와 포트 번호의 조합으로 &quot;특정 호스트가 실행하는 특정 프로세스&quot;를 식별</li>
<li>포트를 통한 프로세스 식별은 전송 계층의 주된 목적</li>
<li>전송 계층의 핵심 프로토콜인 TCP와 UDP는 모두 포트를 통해 프로세스를 식별할 수 있음<ul>
<li>TCP와 UDP 헤더에는 송신지 포트와 수신지 포트를 포함하고 있음</li>
</ul>
</li>
<li>포트 번호의 종류<ul>
<li>잘 알려진 포트 0 ~ 1023<ul>
<li>범용적으로 사용되는 프로토콜이 주로 사용하는 포트 번호 목록</li>
<li>HTTP 80, HTTPS 443</li>
</ul>
</li>
<li>틍록된 포트 1024 ~ 49151<ul>
<li>덜 범용적이지만, 흔하게 사용되는 애플리케이션 프로토콜 할당</li>
<li>MYSQL 3306, REDIS 6379</li>
</ul>
</li>
<li>사설 포트 49152 ~ 65535<ul>
<li>클라이언트로서 동작하는 프로그램의 경우, 사설 포트 번호가 할당</li>
<li>대표적인 예시 웹 브라우저</li>
</ul>
</li>
</ul>
</li>
<li>NAT와 NAPT<ul>
<li>네트워크 내부에서 사설 IP 주소를 사용하는 호스트가 네트워크 외부에 있는 호스트와 패킷을 주고받기 위해서는 공인 IP 주소와 사설 IP 주소 간 변환이 필요</li>
<li>이 때, 사용되는 기술이 NAT (Network Address Translation)</li>
<li>사설 IP 주소와 공인 IP 주소를 1대1 대응시키지 않고, 다수의 사설 IP 주소를 적은 수의 공인 IP 주소로 변환</li>
<li>어떻게? &quot;포트&quot;를 이용하여!</li>
<li>이처럼 IP 주소 변환 과정에서 IP 주소의 쌍과 더불어 포트 번호도 함께 고려하는 포트 기반의 NAT를 NAPT라고 함</li>
<li>NAPT는 사설 IP와 공인 IP 주소를 N:1로 관리할 수 있다는 점에서, 공인 IP 주소의 부족 문제를 개선하는 기술로 간주<h2 id="비신뢰성과-비연결형-보장">(비)신뢰성과 (비)연결형 보장</h2>
</li>
</ul>
</li>
<li>TCP는 신뢰할 수 있는 프로토콜이자 연결형 프로토콜이고, </li>
<li>UDP는 신뢰할 수 없는 프로토콜이자 비연결형 프로토콜</li>
<li>신뢰할 수 있는 연결형 송수신에는 시간과 연산이 소요되기에 일반적으로 TCP가 UDP에 비해 송수신 속도가 느림<h3 id="udp-헤더의-필드들">UDP 헤더의 필드들</h3>
</li>
<li>송신지, 수신지 포트 : 송수신 프로세스가 할당된 포트 번호</li>
<li>길이 : 헤더를 포함한 UDP의 바이트 크기</li>
<li>체크섬 : 송수신 과정에서의 데이터그램 훼손 여부를 알 수 있는 정보<h3 id="tcp-헤더의-필드">TCP 헤더의 필드</h3>
</li>
<li>순서 번호, 확인 응답 번호, 제어 비트</li>
<li>순서 번호 필드<ul>
<li>TCP 패킷의 올바른 송수신 순서를 보장하기 위해 매겨진 번호</li>
<li>이를 통해 현재 주고받는 TCP세그먼트(TCP 패킷)가 송수신하고자 하는 데이터의 몇 번째에 해당하는지 알 수 있음</li>
</ul>
</li>
<li>확인 응답 번호 필드<ul>
<li>상대 호스트가 보낸 세그먼트(패킷)에 대한 응답으로, 다음으로 수신하길 기대하는 순서 번호</li>
<li>올바르게 수신한 순서 번호에 1이 더해진 값</li>
<li>이 때, 상대 호스트에게 &quot;이 세그먼트는 확인 응답 번호를 포함하고 있음&quot;을 알리기 위해 ACK 플래그를 1로 설정해야 함</li>
</ul>
</li>
<li>제어 비트<ul>
<li>&quot;ACK 플래그&quot;는 제어 비트에서 &quot;승인&quot;을 나타내는 비트</li>
<li>확인 응답 번호 값을 보내기 위해선 제어 비트의 &quot;ACK 플래그&quot;가 1로 설정되어 있어야 함</li>
<li>&quot;제어 비트&quot;는 현재 세그먼트에 대한 부가정보를 나타내는 정보</li>
<li>ACK : 세그먼트의 승인을 나타내기 위한 비트</li>
<li>SYN : 연결을 수립하기 위한 비트</li>
<li>FIN : 연결을 종료하기 위한 비트</li>
</ul>
</li>
</ul>
<h1 id="tcp의-연결부터-종료까지">TCP의 연결부터 종료까지</h1>
<ul>
<li>TCP는 UDP와 달리 송수신 이전에 연결을 수립하고, 송수신 이후에는 연결을 종료<h2 id="tcp의-연결-수립">TCP의 연결 수립</h2>
</li>
<li>TCP의 연결 수립은 &quot;쓰리 웨이 핸드셰이크&quot;를 통해 이루어짐</li>
<li>호스트 A가  호스트 B에게 연결 요청을 보내는 과정</li>
</ul>
<ol>
<li>[송수신방향 A-&gt;B] SYN 세그먼트 전송<ul>
<li>호스트 A는 SYN 비트가 1로 설정된 세그먼트를 호스트 B에게 전송</li>
<li>이 때, 세그먼트의 순서 번호에는 호스트 A의 순서 번호가 포함</li>
</ul>
</li>
<li>[송수신방향 B-&gt;A] SYN + ACK 세그먼트 전송<ul>
<li>1에 대한 응답</li>
<li>호스트 B는 ACK비트와 SYN비트가 1로 설정된 세그먼트를 호스트 A에게 전송</li>
<li>세그먼트의 순서 번호에는 호스트 B의 순서 번호와</li>
<li>1에서 보낸 세그먼트에 대한 확인 응답 번호가 포함</li>
</ul>
</li>
<li>[송수신방향 A-&gt;B] ACK 세그먼트 전송<ul>
<li>세그먼트의 순서 번호에는 호스트 A의 순서 번호와</li>
<li>2에서 보낸 세그먼트에 대한 확인 응답 번호가 포함</li>
</ul>
</li>
</ol>
<ul>
<li><p>SYN  비트는 연결을 수립하기 위한 비트</p>
<ul>
<li>TCP 연결 수립 과정에서 SYN 비트가 설정된 패킷을 처음으로 보내는 호스트가 곧 처음으로 연결 요청을 보내는 호스트</li>
</ul>
</li>
<li><p>호스트 A처럼 처음 연결을 시작하는 과정은 &quot;액티브 오픈&quot;이라고 함</p>
</li>
<li><p>호스트 B처럼 연결 요청을 수신한 뒤 그에 대한 연결을 수립하는 과정은 &quot;패시브 오픈&quot;이라고 함</p>
</li>
</ul>
<h2 id="tcp의-오류-흐름-혼잡-제어">TCP의 오류, 흐름, 혼잡 제어</h2>
<ul>
<li>TCP는 신뢰성을 보장하기 위해 3가지 기능을 제공</li>
</ul>
<h3 id="1-재전송을-통한-오류-제어">1. 재전송을 통한 오류 제어</h3>
<ul>
<li>송수신 과정에서 잘못 전송된 세그먼트가 있을 경우, 이를 재전송하여 오류를 제어</li>
<li>&quot;언제 잘못 전송된 세그먼트가 있음을 인지할까?&quot;</li>
</ul>
<ol>
<li>중복된 ACK 세그먼트를 수신하는 상황<ul>
<li>순서 번호 혹은 확인 응답 번호가 중복되는 상황</li>
</ul>
</li>
<li>타임아웃이 발생한 상황<ul>
<li>TCP 세그먼트를 송신하는 호스트는 모두 &quot;재전송 타이머&quot;라는 값을 유지</li>
<li>호스트는 세그먼트 전송할 때마다 이 재전송 타이머를 실행</li>
<li>이 타이머가 끝난 상황을 &quot;타임아웃&quot; 상황</li>
</ul>
</li>
</ol>
<h3 id="2-흐름-제어">2. 흐름 제어</h3>
<ul>
<li>수신 호스트가 한 번에 받아 처리할 수 있을 만큼만 전송하는 것을 의미<ul>
<li>즉, 송신 호스트가 수신 호스트의 처리 속도를 고려하며 송수신 속도를 균일하게 맞추는 기능</li>
</ul>
</li>
<li>송신 호스트는 수신 호스트가 한 번에 처리할 수 있는 양을 어떻게 알까?<ul>
<li>TCP 헤더의 &quot;윈도우 필드&quot;</li>
<li>수신 호스트가 한 번에 처리할 수 있는 &quot;수신 윈도우&quot;크기가 명시됨</li>
<li>수신 호스트는 윈도우 필드를 통해 송신 호스트에게 한 번에 처리 가능한 양을 알려주고, 송신 호스트는 이에 맞게 세그먼트를 전송</li>
</ul>
</li>
</ul>
<h3 id="3-혼잡-제어">3. 혼잡 제어</h3>
<ul>
<li>혼잡이란 많은 트래픽으로 인해 패킷의 처리 속도가 느려지거나, 유실될 수 있는 상황을 의미</li>
<li>송신 호스트가 얼마나 네트워크가 혼잡한지를 판단할 수 있어야 함. 그래야 혼잡의 정도에 따라 세그먼트 전송량을 조절할 것임</li>
<li>&quot;어떻게 송신 호스트는 네트워크의 혼잡도를 판단할까?&quot;<ul>
<li>중복된 ACK 세그먼트가 도착했을 때</li>
<li>타임아웃 상황이 발생했을 때</li>
</ul>
</li>
<li>위 2가지 상황이 발생하면 송신 호스트는 &quot;혼잡없이 전송할 수 있는 정도의 양&quot;만큼만 송신<ul>
<li>&quot;혼잡없이 전송할 수 있는 정도의 양&quot;의 값을 &quot;혼잡 윈도우&quot;라고 함</li>
</ul>
</li>
<li>혼잡 윈도우의 경우, 송신 윈도우에서 자체적으로 계산해야 함<ul>
<li>혼잡 윈도우의 크기를 연산하는 방법, 혼잡 제어를 수행하는 일련의 과정을 &quot;혼잡 제어 알고리즘&quot;이라고 함</li>
<li>기본적인 혼잡 제어 알고리즘은 &quot;AIMD&quot;</li>
<li>패킷을 보내고 그에 대한 응답이 수신되기까지의 시간을 &quot;RTT&quot;라고 함</li>
<li>AIMD는 RTT마다 혼잡 윈도우의 크기를 조정<h2 id="tcp의-종료">TCP의 종료</h2>
</li>
</ul>
</li>
<li>송수신 호스트가 각자 한 번씩 FIN과 ACK를 주고받으며 이루어짐</li>
<li>호스트 A가 호스트 B에게 처음 연결 종료 요청을 보낸다고 가정</li>
</ul>
<ol>
<li>[송수신방향 A-&gt;B] FIN 세그먼트</li>
<li>[송수신방향 B-&gt;A] ACK 세그먼트<ul>
<li>1에 대한 응답</li>
</ul>
</li>
<li>[송수신방향 B-&gt;A] FIN 세그먼트<ul>
<li>이번엔 호스트 B가 호스트 A에게 FIN 세그먼트 전송</li>
</ul>
</li>
<li>[송수신방향 A-&gt;B] ACK 세그먼트<ul>
<li>3에 대한 응답</li>
</ul>
</li>
</ol>
<ul>
<li>호스트 A처럼 먼저 연결을 종료하려는 호스트에 의해 수행되는 동작을 &quot;액티브 클로즈&quot;</li>
<li>반대로 연결 요청을 받아들이는 호스트에 의해 수행되는 동작을 &quot;패시브 클로즈&quot;</li>
<li>TCP의 연결 종료 과정은 4개의 단계를 거친다는 점에서 &quot;포 웨이 핸드셰이크&quot;라고 함<h1 id="tcp의-상태-관리">TCP의 상태 관리</h1>
</li>
<li>TCP의 또 다른 중요한 특징은 상태를 유지한다는 점<ul>
<li>상태를 유지하고 관리하는 프로토콜이라는 점에서 &quot;스테이트풀 프로토콜&quot;이라고 부름</li>
<li>여기서 상태란? &quot;현재 어떤 통신 과정에 있는지를 나타내는 정보&quot;</li>
<li>이를 통해 TCP의 송수신 현황을 판단할 수 있고, 디버깅의 힌트로도 활용 가능</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크] 네트워크 계층 - IP]]></title>
            <link>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B3%84%EC%B8%B5-IP</link>
            <guid>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B3%84%EC%B8%B5-IP</guid>
            <pubDate>Sat, 02 Nov 2024 04:02:02 GMT</pubDate>
            <description><![CDATA[<h1 id="네트워크-계층">네트워크 계층</h1>
<ul>
<li><p>물리 계층, 데이터 링크 계층 이후의 네트워크 계층</p>
</li>
<li><p>LAN을 넘어서 다른 네트워크와 통신을 주고 받기 위한 기술</p>
</li>
<li><p>네트워크 계층의 핵심 프로토콜 IP</p>
<h1 id="ip의-목적과-특징">IP의 목적과 특징</h1>
</li>
<li><p>IP의 목적</p>
<ul>
<li>주소 지정</li>
<li>단편화</li>
</ul>
</li>
<li><p>IP의 특징</p>
<ul>
<li>신뢰할 수 없는 통신</li>
<li>비연결형 통신<h2 id="ip의-목적-주소지정-단편화">IP의 목적: 주소지정, 단편화</h2>
<h3 id="주소지정">주소지정</h3>
</li>
</ul>
</li>
<li><p>주소 지정은 IP 주소를 통해 이루어짐</p>
</li>
<li><p>IP 패킷 헤더에 있는 관련 필드: 송신지, 수신지 IP 주소</p>
</li>
<li><p>IP 패킷을 전달하는 네트워크 장비: 라우터</p>
<ul>
<li>네트워크 계층의 핵심 장비</li>
<li>전달받은 패킷을 목적지까지 전달하는 역할</li>
<li>라우팅: 전달할 최적의 경로를 결정하고 해당 경로로 패킷을 보내는 과정<h3 id="단편화">단편화</h3>
</li>
</ul>
</li>
<li><p>MTU : 최대 전송 단위</p>
</li>
<li><p>전송하고자 하는 IP 패킷의 단위가 MTU를 초과할 경우, MTU 이하의 여러 패킷으로 쪼개어 전송</p>
</li>
<li><p>쪼개진 패킷은 수신지에서 재조합</p>
</li>
<li><p>IP 패킷 헤더에 있는 관련 필드: 식별자, 플래그, 단편화 오프셋</p>
<ul>
<li>식별자: 특정 패킷이 어떤 데이터에서 쪼개진 패킷인지 식별하기 위해 사용되는 필드, 같은 패킷에서 쪼개진 패킷은 같은 식별자를 가지고 있음</li>
<li>플래그: 3비트로 구성, 첫 번째 비트는 0으로 고정, DF(Don&#39;t Fragment), MF(More Fragment)로 단편화의 상태 여부를 표시</li>
<li>단편화 오프셋: 특정 패킷이 초기 데이터에서 얼마나 떨어져 있는지를 명시한 필드, 목적지에서 재조합하기 위해 올바른 순서를 나타냄</li>
</ul>
</li>
<li><p>오늘날에는 단편화가 발생하지 않음</p>
<ul>
<li>단편화는 네트워크에 악영향을 끼칠 수 있음</li>
<li>패킷을 주고 받는 경로에 있는 모든 호스트들의 처리 가능한 MTU 크기를 고려</li>
<li>이를 &quot;경로 MTU&quot;라고 함</li>
<li>경로 MTU만큼 IP 패킷을 송수신하여 단편화를 회피<h2 id="ip의-특징-신뢰할-수-없는-비연결형-통신">IP의 특징: 신뢰할 수 없는, 비연결형 통신</h2>
</li>
</ul>
</li>
<li><p>신뢰할 수 없는 프로토콜: 패킷이 수신지까지 제대로 전송되었다고 보장하지 않는 프로토콜</p>
<ul>
<li>패킷이 유실되거나 순서가 맞지 않더라도 이에 대한 조치 x</li>
</ul>
</li>
<li><p>비연결형 프로토콜: 패킷을 주고받기 전에 사전 연결 과정을 거치지 않음</p>
<ul>
<li>상대 호스트의 수신 가능 여부는 따지지 않고, 수신지를 향해 그저 패킷을 전송할 뿐</li>
</ul>
</li>
</ul>
<h1 id="ip주소의-구조">IP주소의 구조</h1>
<ul>
<li>IP주소는 &quot;네트워크 주소&quot;와 &quot;호스트 주소&quot;로 이루어짐</li>
<li>중요한 점은 하나의 IP주소에서 네트워크 주소와 호스트 주소를 표현하는 &quot;크기&quot;가 &quot;유동적&quot;일 수 있다는 점</li>
</ul>
<h2 id="클래스풀-주소-체계">클래스풀 주소 체계</h2>
<ul>
<li>크기가 유동적일 수 있다면 어느정도의 크기가 적당할까? 이를 위해 생겨난 개념 &quot;클래스풀 주소 체계&quot;</li>
<li>클래스 : 네트워크 주소의 크기에 따라 유형별로 IP주소를 분류하는 기준</li>
<li>이 클래스를 바탕으로 IP주소를 관리하는 주소 체계를 &quot;클래스풀 주소 체계&quot;라고 함</li>
<li>호스트의 주소가 전부 0인 주소와 전부 1인 주소는 특정 호스트를 지칭할 수 없음<ul>
<li>호스트 주소가 전부 0 : 해당 네트워크 자체를 의미하는 주소</li>
<li>호스트 주소가 전부 1 : 브로드캐스트를 위한 주소</li>
</ul>
</li>
<li>특수한 목적을 위해 예약된 IP주소도 있음<ul>
<li>대표적인 예시로 &quot;루프백 주소&quot; : 자기 자신을 가르키는 주소</li>
<li>일반적인 루프백 주소는 &quot;127.0.0.1&quot;으로 &quot;로컬 호스트&quot;라고도 불림</li>
<li>루프백 주소로 전송된 패킷은 자기 자신에게 돌아오기 때문에 자기 자신을 마치 다른 호스트처럼 간주하여 패킷을 전송할 수 있음<h2 id="클래스리스-주소-체계와-서브넷-마스크">클래스리스 주소 체계와 서브넷 마스크</h2>
</li>
</ul>
</li>
<li>클래스풀 주소 체계의 단점 : IP주소가 낭비될 수 있음<ul>
<li>더 유동적으로 네트워크 영역을 나눌 수단이 필요 -&gt; &quot;클래스리스 주소 체계&quot;의 등장</li>
</ul>
</li>
<li>클래스리스 주소 체계에서, 네트워크와 호스트를 구분하는 수단으로 &quot;서브넷 마스크&quot; 사용</li>
<li>&quot;서브넷 마스크&quot;와 &quot;IP주소&quot;를 &quot;비트AND연산&quot;하여 &quot;네트워크 주소&quot;를 생성<h1 id="공인-ip주소와-사설-ip주소">공인 IP주소와 사설 IP주소</h1>
</li>
<li>고유한 IP주소는 공인 IP주소<ul>
<li>공인 IP주소는 ISP나 IP주소 할당 기관을 통해 할당</li>
</ul>
</li>
<li>고유하지 않은 IP주소는 사설 IP주소<ul>
<li>라우터(공유기)를 통해 할당</li>
<li>해당 호스트가 속한 네트워크에서만 고유함</li>
<li>다른 네트워크의 사설 IP주소와 중복될 수 있음<h1 id="ip주소의-할당">IP주소의 할당</h1>
<h2 id="정적할당">정적할당</h2>
</li>
</ul>
</li>
<li>수작업으로 IP주소 할당</li>
<li>게이트웨이 : 서로 다른 네트워크를 연결하는 하드웨어적/소프트웨어적 수단을 의미<ul>
<li>기본 게이트웨이 : 호스트가 속한 네트워크의 외부로 나가기 위한 첫 기본 경로를 의미</li>
</ul>
</li>
<li>DNS : 호스트가 도메인 네임을 토대로IP 주소를 알아내기 위해 질의하는 것</li>
<li>도메인 네임 : 숫자열로 이루어진 IP주소를 외우긴 어려우므로, 기억할 수 있는 문자열로 대응된 것<h2 id="동적할당">동적할당</h2>
</li>
<li>프로토콜을 통해 자동으로 IP주소를 부여하는 방식 -&gt; 동적 IP주소 생성<ul>
<li>DHCP 프로토콜을 사용</li>
</ul>
</li>
<li>IP 주소를 동적으로 할당받고자 하는 호스트는 DHCP서버와 메시지를 주고 받으며 동적 IP주소를 할당</li>
<li>DHCP서버는 호스트에 할당 가능한 IP주소 목록을 관리하다가, IP주소 할당 요청을 받았을 때, IP주소를 할당해 주는 호스트<ul>
<li>동적 IP주소에는 사용 가능 기간이 정해져 있음</li>
<li>동적 IP주소는 할당받을 때마다 다른 주소를 받을 수 있음<h1 id="ip-전송-특징의-보완-icmp">IP 전송 특징의 보완: ICMP</h1>
</li>
</ul>
</li>
<li>IP가 비신뢰성, 비연결성이라고 해서 반드시 나쁠까? NO</li>
<li>IP가 이러한 특징을 지니는 이유는 성능과 관련있음<ul>
<li>신뢰성 높은 송수신을 위해선, 패킷에 대한 오류 제어(패킷의 순서, 패킷의 유실 보장)를 수행해야 함</li>
<li>연결형 송수신을 위해선, 호스트 간 연결을 수립하고, 연결을 관리해야 함</li>
<li>오류 제어와 연결수립 및 관리는 빠른 성능과는 배치됨</li>
</ul>
</li>
<li>그럼에도 불구하고 IP의 특징을 보완하기 위한 방법에는 크게 2가지가 존재<ol>
<li>신뢰할 수 있는 연결형 통신을 위한 상위 계층의 프로토콜을 이용하는 것 : 대표적으로 TCP</li>
<li>네트워크 계층의 &quot;ICMP 프로토콜&quot;을 이용하는 것</li>
</ol>
</li>
<li>ICMP 프로토콜<ul>
<li>IP 패킷의 전송 과정에 대한 피드백 메시지(ICMP 메시지)를 얻기 위해 사용하는 프로토콜</li>
<li>ICMP메시지로 IP 전송의 결과를 볼 수 있음</li>
<li>ICMP가 IP의 신뢰성을 완전히 보장하지 않음! 완전히 보장하기 전송 계층의 프로토콜이 필요</li>
</ul>
</li>
<li>IP 헤더에는 패킷의 수명을 의미하는 TTL필드가 존재<ul>
<li>패킷이 하나의 라우터를 거칠 때마다 TTL이 1씩 감소</li>
<li>TTL이 0이되면 해당 패킷은 폐기 -&gt; 패킷을 송신한 호스트에게 ICMP 메시지 전송</li>
<li>패킷이 호스트 또는 라우터에게 한 번 전달되는 것은 &quot;홉&quot;이라고 함</li>
<li>TTL 필드의 존재 이유는 무의미한 패킷이 네트워크 상에 지속적으로 남아있는 것을 방지하기 위함<h1 id="ip주소와-mac-주소의-대응-arp">IP주소와 MAC 주소의 대응: ARP</h1>
</li>
</ul>
</li>
<li>MAC 주소 : 택배 배송의 송신인과 수신인</li>
<li>IP 주소 : 택배 배송의 송신지와 발신지</li>
<li>패킷 송수신 과정에서 IP주소가 우선적으로 활용</li>
<li>상대 호스트의 IP 주소는 알고, MAC 주소는 모르는 상황이 있을 수 있음<ul>
<li>이 때 사용되는 것이 &quot;ARP 프로토콜&quot;</li>
</ul>
</li>
<li>ARP 프로토콜 : 동일 네트워크에 있는 송수신 대상의 IP주소를 통해 MAC 주소를 알아내는 것</li>
<li>ARP 동작 과정<ul>
<li>ARP 요청은 &quot;브로드캐스트 메시지&quot; : 네트워크 내에 있는 모든 호스트에게 보내는 메시지</li>
<li>ARP 요청에는 알고 싶은 MAC주소와 대응되는 IP주소가 포함되어 있음</li>
<li>전달받은 메시지를 받은 호스트들은 ARP 요청에 포함된 IP주소를 확인해 관련이 없으면 무시하고, 자신의 IP주소일 경우에는 ARP 응답 메시지에 MAC주소를 포함시켜 전송</li>
</ul>
</li>
<li>ARP 테이블에 &lt;IP주소,MAC주소&gt; 쌍을 보관해놓음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Javascript와 Python의 filter 함수]]></title>
            <link>https://velog.io/@data_buddha/Javascript%EC%99%80-Python%EC%9D%98-filter-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@data_buddha/Javascript%EC%99%80-Python%EC%9D%98-filter-%ED%95%A8%EC%88%98</guid>
            <pubDate>Sun, 15 Sep 2024 04:19:39 GMT</pubDate>
            <description><![CDATA[<p>Javascript 공부를 하면서 filter 함수를 사용해 to-do-list를 구현했다.</p>
<p>Python에서 사용했던 filter 함수와 왜 다른 형태일까?</p>
<h1 id="js에서-사용하는-filter-함수">JS에서 사용하는 filter 함수</h1>
<pre><code class="language-js">arr.filter(function)</code></pre>
<ul>
<li>JS에선 filter가 배열의 메서드로 구현. 즉, 배열 객체에 직접 붙어서 동작</li>
<li>map, reduce와 같은 함수도 배열 메서드로 존재</li>
<li>객체(배열)의 상태를 기반으로 메서드를 호출</li>
</ul>
<h1 id="python에서-사용하는-filter-함수">Python에서 사용하는 filter 함수</h1>
<pre><code class="language-python">filter(function, arr)</code></pre>
<ul>
<li>Python에서는 filter가 배열에 의존하지 않고 &quot;내장 함수&quot;로 제공. 즉, Python은 <strong>함수형 프로그래밍</strong> 개념에 더 가까움</li>
<li>map, reduce등을 모두 내장 함수로 처리</li>
<li>리스트뿐만 아니라, 튜플, 집합 등 다양한 반복 가능한(iterable) 객체에 적용 가능</li>
</ul>
<h1 id="설계-철학-차이">설계 철학 차이</h1>
<ul>
<li>JS의 filter : 배열 메서드와 같은 특정 데이터 구조에 대한 함수를 제공하는 객체 지향적 설계. 배열이 중심이 되어 해당 객체의 메서드를 호출</li>
<li>Python의 filter : 함수형 프로그래밍 개념에 기반하여 다양한 iterable을 처리할 수 있도록 내장 함수를 제공. 함수가 대상 데이터를 처리하는 방식</li>
</ul>
<p>정리하자면, JS와 Python의 설계 방식에 대한 차이로 인해 다른 형태를 가진다. </p>
<h2 id="python은-함수형-프로그래밍-언어">Python은 함수형 프로그래밍 언어?</h2>
<ul>
<li>Nope. 함수형 프로그래밍 개념을 일부 차용했지만, 이를 기본으로 설계하지 않음</li>
<li>함수형, 객체지향, 절차적 프로그래밍 모두 지원하는 멀티 패러다임 언어</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크] 네트워크 계층]]></title>
            <link>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B3%84%EC%B8%B5</link>
            <guid>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B3%84%EC%B8%B5</guid>
            <pubDate>Mon, 19 Aug 2024 04:00:08 GMT</pubDate>
            <description><![CDATA[<h2 id="lan을-넘어서는-네트워크-계층">LAN을 넘어서는 네트워크 계층</h2>
<ul>
<li>네트워크 계층에서는 IP 주소를 이용해 송수신지 대상을 지정하고, 다른 네트워크에 이르는 경로를 결정하는 라우팅을 통해 다른 네트워크와 통신<h3 id="데이터-링크-계층의-한계">데이터 링크 계층의 한계</h3>
</li>
<li>물리 계층과 데이터 링크 계층만으로는 LAN을 넘어서 통신하기 어려움<ul>
<li>첫 번째 이유, 물리 계층과 데이터 링크 계층만으로는 <strong>다른 네트워크까지의 도달 경로를 파악하기 어렵다.</strong><ul>
<li>LAN간에 패킷을 주고 받을 때, 패킷이 이동할 최적의 경로를 &quot;라우팅&quot;이라고 함</li>
<li>물리 계층과 데이터 링크 계층의 장비로는 라우팅을 수행하기 어렵지만, 네트워크 계층의 &quot;라우터 router&quot;로는 가능</li>
</ul>
</li>
<li>두 번째 이유, MAC 주소만으로는 모든 네트워크에 속한 호스트의 위치를 특정하기 어렵다.<ul>
<li>택배의 수신인 역할을 하는 &quot;MAC 주소&quot;라면, 수신지 역할을 하는 정보는 네트워크 계층의 &quot;IP 주소&quot;</li>
<li>택배 배송 과정에서 &#39;수신인&#39;과 &#39;수신지&#39;를 모두 활용하고, &#39;수신지&#39;를 우선으로 고려하는 것처럼</li>
<li>네트워크에서도 &#39;MAC 주소&#39;와 &#39;IP 주소&#39;를 함께 사용하고, &#39;IP 주소&#39;를 우선시 함</li>
</ul>
</li>
<li>MAC 주소를 물리주소라고 부르는 것처럼 IP 주소는 &quot;논리 주소&quot;라고 함</li>
<li>MAC 주소는 NIC마다 할당되는 고정된 주소이지만, IP 주소는 호스트에 직접 할당이 가능</li>
<li><strong>&quot;DHCP Dynamic Host Configuration Protocol&quot;</strong>이라는 특정 프로토콜을 통해 자동으로 IP 주소를 할당 받거나, 사용자가 직접 할당할 수 있고, 한 호스트가 복수의 IP 주소를 가질 수도 있음</li>
</ul>
</li>
<li><strong>정리하자면, 물리 계층과 데이터 링크 계층만으로는 네트워크 간의 통신이 어렵고, 이를 &quot;네트워크 계층&quot;에서 해결 가능. 어떻게? &#39;IP 주소&#39;를 이용해 송수신지를 특정하고 해당 수신지까지의 최적의 경로를 설정하는 &#39;라우팅&#39;이 이루어지기 때문</strong><h3 id="인터넷-프로토콜">인터넷 프로토콜</h3>
</li>
<li>네트워크 계층의 핵심적인 프로토콜 <strong>&quot;인터넷 프로토콜 IP:Internet Protocol&quot;</strong></li>
<li>IP에는 IPv4, IPv6 두 가지 버전이 있음<h4 id="ip-주소-형태">IP 주소 형태</h4>
</li>
<li>192.168.0.1 (IPv4)</li>
<li>점으로 구분된 8비트를 &quot;옥텟 octet&quot;이라고 함</li>
<li>총 4바이트(32비트)로 주소를 표현할 수 있음<h4 id="ip의-기능">IP의 기능</h4>
</li>
<li>IP의 기능에는 &quot;IP 주소 지정&quot; 기능과 &quot;IP 단편화&quot; 기능이 있음</li>
<li>&quot;IP 주소 지정&quot;<ul>
<li>IP 주소를 바탕으로 송수신 대상을 지정하는 것을 의미</li>
</ul>
</li>
<li>&quot;IP 단편화&quot;<ul>
<li>전송하고자 하는 패킷의 크기가 &quot;MTU&quot;라는 최대 전송 단위보다 클 경우, 패킷을 나누는 것을 의미</li>
<li>&quot;MTU&quot;란 한 번에 전송 가능한 IP 패킷의 최대 크기를 의미</li>
<li>패킷이 쪼개진 후에는 수신지에 도착하면 다시 재조합됨<h4 id="ipv4">IPv4</h4>
<img src="https://velog.velcdn.com/images/data_buddha/post/88692e9c-91d8-4480-bcec-19c22059dd06/image.png" alt="">
출처) <a href="https://www.guru99.com/ko/ip-header.html">https://www.guru99.com/ko/ip-header.html</a></li>
</ul>
</li>
<li>식별자, 플래그, 단편화 오프셋 필드는 &quot;IP 단편화&quot;에 관여</li>
<li>송신지 IP 주소, 수신지 IP 주소는 &quot;IP 주소 지정&quot;에 관여</li>
<li>식별자 Identification<ul>
<li>패킷에 할당된 번호</li>
<li>패킷이 잘개 쪼개져서 수신지에 도착했을 때, 어떤 메시지에서 쪼개졌는지 인식하기 위해 사용</li>
</ul>
</li>
<li>플래그 Flag<ul>
<li>DF라는 이름의 비트는 Don`t Fragment의 약어로, IP 단편화를 수행하지 말라는 표시</li>
<li>MF라는 이름의 비트는 More Frangment의 약어로, 단편화된 패킷이 더 남아있는지 나타냄</li>
</ul>
</li>
<li>단편화 오프셋 Fragment Offset<ul>
<li>패킷이 단편화되기 전에 패킷의 초기 데이터에서 몇 번째로 떨어진 패킷인지 나타냄</li>
<li>즉 쪼개진 패킷을 순서대로 재조합하기 위한 필드</li>
</ul>
</li>
<li>TTL Time To Live<ul>
<li>패킷의 수명을 나타냄, 0이면 폐기</li>
</ul>
</li>
<li>프로토콜 Protocol<ul>
<li>상위 계층의 프로토콜이 무엇인지를 나타내는 필드</li>
</ul>
</li>
<li>송신지 IP 주소와 수신지 IP 주소<ul>
<li>이름 그대로 송수신지의 IPv4 주소를 나타냄<h4 id="ipv6">IPv6</h4>
<img src="https://velog.velcdn.com/images/data_buddha/post/c3e02069-6647-4e43-83ee-53c89650c308/image.png" alt="">
출처) <a href="https://velog.io/@hsshin0602/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-IPv6">https://velog.io/@hsshin0602/%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-IPv6</a></li>
</ul>
</li>
<li>IPv4의 주소의 총량은 쉽게 고갈될 수 있음. 따라서 16바이트(128비트)짜리 IPv6를 사용</li>
<li>2001:0230:abcd:ffff:0000:0000:ffff:1111</li>
<li>다음 헤더 Next Header<ul>
<li>상위 계층의 프로톨을 가리키거나 &quot;확장 헤더&quot;를 가리키는 필드<ul>
<li>&quot;확장 헤더&quot;란 IPv6에 추가적인 헤더 정보가 필요할 경우에 기본 헤더와 더불어 &quot;확장 헤더&quot;라는 추가 헤더를 가질 수 있음</li>
</ul>
</li>
</ul>
</li>
<li>홉 제한 Hop Limit<ul>
<li>&quot;홉&quot;이란 패킷이 호스트 또는 라우터에 한 번 전달되는 것을 &quot;홉&quot;이라고 함</li>
<li>전달될 때마다 1씩 감소</li>
<li>Ipv4의 TTL 필드와 유사하게 패킷의 수명을 나타내는 필드<h3 id="arp">ARP</h3>
</li>
</ul>
</li>
<li>상대 호스트의 IP 주소는 알지만, MAC 주소는 알지 못하는 상황에서 사용하는 프로토콜</li>
<li>ARP Address Resolution Protocol은 IP 주소를 통해 MAC 주소를 알아내는 프로토콜</li>
<li>여러 개의 호스트가 동일한 네트워크에 속한 상태에서 A가 B에게 패킷을 보내고 싶지만 IP 주소는 알지만, MAC 주소는 모르는 상황에서 ARP 프로토콜을 사용한다는 가정<ul>
<li><ol>
<li>APR 요청</li>
</ol>
<ul>
<li>우선 A는 네트워크 내의 모든 호스트에게 B의 IP 주소를 보내며, B의 MAC 주소를 찾는 것과 같은 브로드캐스트 메시지를 보냄</li>
<li>이 메시지는 &quot;ARP 요청&quot;이라는 ARP 패킷</li>
</ul>
</li>
<li><ol start="2">
<li>ARP 응답</li>
</ol>
<ul>
<li>네트워크 내의 모든 호스트가 ARP 요청을 수신하지만, B를 제외한 나머지 호스트는 자신의 IP 주소가 아니므로 무시</li>
<li>B는 자신의 MAC 주소를 담은 메시지를 A에게 전송, 이 유니캐스트 메시지는 &quot;ARP 응답&quot;이라는 ARP 패킷</li>
</ul>
</li>
<li><ol start="3">
<li>ARP 테이블 갱신</li>
</ol>
<ul>
<li>&quot;ARP 테이블&quot;이라는 정보를 모든 호스트가 유지</li>
<li>IP 주소와 그에 맞는 MAC 주소를 주소 바인딩한 테이블</li>
<li>ARP 테이블은 일정 시간이 지나면 삭제되고, 임의로 삭제할 수 있음</li>
</ul>
</li>
</ul>
</li>
<li>ARP는 &quot;동일한 네트워크&quot; 내에 있는 호스트의 MAC 주소를 알아내는 프로토콜인데 다른 네트워크에 있는 경우에는 어떻게 함?<ul>
<li>간략히 하자면, 네트워크를 이어주는 라우터의 MAC 주소를 ARP 프로토콜의 과정을 따라서 패킷을 전송함<h3 id="ip-단편화를-피하는-방법">IP 단편화를 피하는 방법</h3>
</li>
</ul>
</li>
<li>IP 단편화는 되도록 하지 않는게 좋음<ul>
<li>불필요한 트래픽 증가와 대역폭 낭비로 이어질 수 있고, 쪼개진 패킷들을 합치는 과정에서 발생하는 부하도 성능에 지장을 줄 수 있음</li>
</ul>
</li>
<li>IP 패킷을 주고받는 모든 호스트의 &#39;처리 가능한 MTU 크기&#39;를 고려해야 함<ul>
<li>&#39;IP 단편화&#39; 없이 주고받을 수 있는 최대 크기만큼만 전송해야 하며 이 크기를 &quot;경로 MTU&quot;라고 함</li>
<li>&quot;경로 MTU&quot;를 구하고 해당 크기만큼의 패킷을 송수신하여 &quot;IP 단편화&quot;를 피하는 기술을 &quot;경로 MTU 발견&quot;이라고 함<h2 id="ip-주소">IP 주소</h2>
<h3 id="네트워크-주소와-호스트-주소">네트워크 주소와 호스트 주소</h3>
</li>
</ul>
</li>
<li>IP 주소는 네트워크 주소와 호스트 주소로 이루어져 있음<ul>
<li>전자는 &#39;호스트가 속한 특정 네트워크&#39;를 식별하는 역할, 후자는 &#39;네트워크 내에서 특정 호스트&#39;를 식별하는 역할</li>
</ul>
</li>
<li>IP 주소에서 네트워크 주소와 호스트 주소를 구분하는 범위는 유동적일 수 있음<ul>
<li>IPv4 기준으로 네 개의 옥텟 중 1개의 옥텟이 네트워크 주소일 수도 있고, 2개의, 3개의 옥텟이 네트워크 주소일 수 있음</li>
</ul>
</li>
<li>그렇다면 어떻게 구분하는게 효율적일까?<ul>
<li>호스트 주소 공간을 크게 할당하면 호스트가 할당되지 않은 다수의 IP 주속 낭비될 수 있음</li>
<li>이런 문제를 해결하기 위해 <strong>&quot;클럐스&quot;</strong>라는 개념이 도입<h3 id="클래스풀-주소-체계">클래스풀 주소 체계</h3>
</li>
</ul>
</li>
<li><strong>&quot;클래스&quot;</strong>는 &quot;네트워크 크기&quot;에 따라 주소를 분류하는 기준</li>
<li>네트워크 크기를 가변적으로 조정해 네트워크 주소와 호스트 주소를 구획할 수 있음</li>
<li>&quot;클래스&quot;를 기반으로 IP 주소를 관리하는 주소 체계를 <strong>&quot;클래스풀 주소 체계&quot;</strong>라고 함</li>
<li>호스트의 주소 공간을 모두 사용할 수 있는것은 아님<ul>
<li>호스트 주소가 전부 0인 IP 주소는 해당 네트워크 자체를 의미하는 네트워크 주소로 사용되고</li>
<li>호스트 주소가 전부 1인 IP 주소는 브로드 캐스트를 위한 주소로 사용됨</li>
<li>따라서 호스트 주소가 전부 0인 IP 주소와 전부 1인 IP 주소는 특정 호스트를 지칭하는 IP 주소로 사용될 수 없음<h3 id="클래스리스-주소-체계">클래스리스 주소 체계</h3>
</li>
</ul>
</li>
<li>클래스풀 주소 체계에는 한계가 있음<ul>
<li>클래스별 크기가 고정되어 있기 때문에 필요 이상의 IP 주소가 생성되어 낭비될 가능성이 있음</li>
<li>게다가, 사전에 정해진 A,B,C 클래스 외에는 다른 크기의 네트워크를 구성할 수 없음</li>
</ul>
</li>
<li>따라서, 클래스풀 주소 체계보다 더 유동적이고 정교하게 네트워크를 구획할 수 있는 <strong>&quot;클래스리스 주소 체계&quot;</strong>가 등장<ul>
<li>이름처럼 클래스에 구애받지 받고 네트워크 영역을 나누어서 호스트에게 IP 주소 공간을 할당하는 방식<h4 id="서브넷-마스크">서브넷 마스크</h4>
</li>
</ul>
</li>
<li>클래스리스 주소 체계는 클래스를 이용하지 않으므로 네트워크 주소와 호스트 주소를 구분 짓는 지점은 임의의 지점이 될 수 있음</li>
<li>클래스리스 주소 체계에서는 네트워크 주소와 호스트 주소를 구분짓는 수단으로 <strong>&quot;서브넷 마스크 subnet mask&quot;</strong>를 이용</li>
<li>&quot;서브넷 마스크&quot;는 IP 주소상에서 네트워크 주소는 1, 호스트 주소는 0으로 표기한 &quot;비트열&quot;을 의미</li>
<li>&quot;서브넷 마스크&quot;를 이용해 클래스를 원하는 크기로 더 잘게 쪼개어 사용하는 것을 <strong>&quot;서브네팅 subnetting&quot;</strong>이라고 함<h4 id="서브네팅--비트-and-연산">서브네팅 : 비트 AND 연산</h4>
</li>
<li>서브넷 마스크를 이용해 네트워크 주소와 호스트 주소를 구분 짓는 방법은 단순<ul>
<li>IP 주소와 서브넷 마스크를 &quot;비트 AND 연산&quot;하면 됨</li>
</ul>
</li>
<li><strong>&quot;비트 AND 연산&quot;</strong>이란 피연산자가 모두 1인 경우에는 1, 아닌 경우에는 0이 되는 연산</li>
<li>정리하자면, 클래스리스 주소 체계는 클래스가 아닌 &quot;서브넷 마스크&quot;를 이용해 네트워크 주소와 호스트 주소를 구분하는 IP 주소 체계. 또한 &quot;서브넷 마스크&quot;와 &quot;IP 주소&quot; 간의 &quot;비트 AND 연산&quot;을 수행하여 IP 주소 내의 네트워크 주소를 알아낼 수 있음. 따라서 더 유동적이고 정교하게 네트워크를 구획할 수 있게 되었음<h4 id="서브넷-마스크-표기--cidr-표기법">서브넷 마스크 표기 : CIDR 표기법</h4>
</li>
<li>서브넷 마스크를 표기하는 방법에는 &quot;10진수로 표기(255.255...)&quot;하는 방법과 &quot;IP 주소-서브넷 마스크 상의 1의 개수&quot; 형식으로 표기하는 방법이 있음</li>
<li>두 번째 방식인 &#39;IP 주소-서브넷 마스크 상의 1의 개수&#39; 형식은 &quot;CIDR 표기법&quot;이라고 부름<ul>
<li>IP 주소와 서브넷 마스크를 함께 표현할 수 있는 간단한 표기로 많이 활용<h3 id="공인-ip-주소와-사설-ip-주소">공인 IP 주소와 사설 IP 주소</h3>
</li>
</ul>
</li>
<li>공인 IP 주소는 전 세계에서 고유한 IP 주소<h4 id="사설-ip-주소와-nat">사설 IP 주소와 NAT</h4>
</li>
<li>사설 IP 주소는 사설 네트워크에서 사용하기 위한 IP 주소</li>
<li>사설 IP 주소의 할당 주체는 일반적으로 &quot;라우터&quot;</li>
<li>&quot;사설 IP 주소&quot;는 타 사설 IP 주소와 중복될 수 있으므로 네트워크 간의 통신이 어려움</li>
<li>그렇다면 사설 IP 주소를 사용하는 호스트가 외부 네트워크와 통신하려면 어떻게 해야할까?<ul>
<li><strong>&quot;NAT Network Address Translation&quot;</strong> 기술을 활용</li>
<li>&quot;NAT&quot;는 사설 IP 주소와 공인 IP 주소의 변환하는데 사용<h3 id="정적-ip-주소와-동적-ip-주소">정적 IP 주소와 동적 IP 주소</h3>
</li>
</ul>
</li>
<li>호스트에 IP 주소를 할당하는 방법에는 &quot;정적 할당&quot;과 &quot;동적 할당&quot;이 있음<h4 id="정적-할당">정적 할당</h4>
</li>
<li>수작업으로 호스트에게 IP 주소를 부여하는 방식</li>
<li>이렇게 할당된 IP 주소를 &quot;정적 IP 주소 static IP address&quot;라고 함<h4 id="동적-할당과-dhcp">동적 할당과 DHCP</h4>
</li>
<li>정적 할당의 경우 IP 주소를 잘못 입력할 수 있고 중복된 IP 주소를 입력할 수 있음</li>
<li>이때 사용 가능한 IP 주소 할당 방식이 &quot;동적 할당&quot;, 동적 할당으로 할당된 IP 주소는 &quot;동적 IP 주소&quot;라고 함</li>
<li>IP 동적 할당에 사용되는 대표적인 프로토콜이 바로 &quot;DHCP Dynamic Host Configuration Protocol&quot;</li>
<li>DHCP를 통한 IP 주소 할당은 IP 주소를 할당받고자 하는 &quot;호스트(클라이언트)&quot;와 해당 호스트에게 IP 주소를 제공하는 &quot;DHCP 서버&quot; 간에 메시지를 주고받음으로써 이루어짐<ul>
<li>DHCP 서버는 클라이언트에게 할당 가능한 IP 주소 목록을 관리하다가 클라이언트가 요청하면 IP 주소를 할당</li>
</ul>
</li>
<li>DHCP로 할당받은 IP 주소는 사용기간이 존재함을 유의</li>
<li>IP 주소를 할당받는 과정에서 클라이언트와 DHCP 서버 간에 주고받는 메시지의 종류는 크게 4가지, 순서대로 이루어지며, 이 메시지들을 주고받는 것은 DHCP 패킷을 주고받는 것과 같음<ul>
<li><ol>
<li>DHCP Discover</li>
</ol>
<ul>
<li>DHCP Discover 메시지를 통해 DHCP 서버를 찾음</li>
<li>전송하는 시점에 클라이언트는 아직 IP 주소를 할당받지 못했으므로 0.0.0.0으로 설정</li>
</ul>
</li>
<li><ol start="2">
<li>DHCP Offer</li>
</ol>
<ul>
<li>서버가 클라이언트에게 할당해 줄 IP 주소를 제안하는 메시지</li>
</ul>
</li>
<li><ol start="3">
<li>DHCP Request</li>
</ol>
<ul>
<li>DHCP Offer 메시지에 대한 응답</li>
<li>&quot;DHCP Offer 잘 받았는데 써도 되지?&quot; 같은 의미</li>
</ul>
</li>
<li><ol start="4">
<li>DHCP ACK</li>
</ol>
<ul>
<li>서버가 클라이언트에게 써도 된다는 최종 승인을 담은 메시지<h3 id="예약-주소--0000-vs-127001">예약 주소 : 0.0.0.0 vs 127.0.0.1</h3>
</li>
</ul>
</li>
</ul>
</li>
<li>&quot;루프백 주소 loopback address&quot;는 자기 자신을 가리키는 특별한 주소<ul>
<li>가장 일반적으로 사용되는 루프백 주소는 127.0.0.1이고, &quot;로컬호스트 localhost&quot;라고도 부름</li>
</ul>
</li>
<li>&quot;0.0.0.0/8&quot;은 호스트가 IP 주소를 할당받기 전에 임시로 사용하는 경우가 많음. 호스트 입장에선 자신을 지칭할 IP 주소가 없기 때문에 사용</li>
<li>&quot;0.0.0.0/0&quot;은 또한 자주 사용되는 특수 주소로 &quot;모든 임의의 IP 주소&quot;를 의미<h2 id="라우팅">라우팅</h2>
라우터의 핵심 기능은 &#39;패킷&#39;이 이동할 최적의 경로를 설정한 뒤 해당 경로로 패킷을 이동시키는 것이다. 이를 &#39;라우팅&#39;이라고 함<h3 id="라우터">라우터</h3>
</li>
<li>&#39;라우터&#39;는 네트워크 계층의 핵심 기능을 담당</li>
<li>라우팅 도중 패킷이 호스트와 라우터 간에, 혹은 라우터와 라우터 간에 이동하는 하나의 과정을 &quot;홉 hop&quot;이라고 함</li>
<li>즉, 패킷은 &#39;여러 개의 홉을 거쳐&#39; 라우팅되는 것</li>
<li>우리가 구글 웹 페이지에 방문하는 것도 &#39;우리의 컴퓨터&#39;와 &#39;구글의 컴퓨터&#39;가 주고받는 패킷도 여러 네트워크 장비를 거치는 수많은 홉과 경로를 통해 이동함</li>
<li>그렇다면 라우터는 어떻게 라우팅을 수행할까? 라우터는 패킷을 전달할 다음 홉을 어떻게 알까?<h3 id="라우팅-테이블">라우팅 테이블</h3>
</li>
<li>라우팅의 핵심은 라우터가 저장하고 관리하는 &#39;라우팅 테이블&#39;</li>
<li>&#39;라우팅 테이블&#39;은 특정 수신지까지 도달하기 위한 정보를 명시한 테이블<ul>
<li>라우터는 &#39;라우팅 테이블&#39;을 참고하여 수신지까지의 도달 경로를 판단</li>
</ul>
</li>
<li>&#39;라우팅 테이블&#39;에 포함되는 대표적인 정보로는<ul>
<li>&#39;수신지 IP와 서브넷 마스크&#39; : 최종적으로 패킷을 전달할 대상을 의미</li>
<li>&#39;다음 홉&#39; : 최종 수신지까지 가기 위해 다음으로 거쳐야 할 호스트의 IP 주소나 인터페이스를 의미. &#39;게이트웨이&#39;라고 명시되기도 함</li>
<li>&#39;네트워크 인터페이스&#39; : 패킷을 보낼 통로</li>
<li>&#39;메트릭&#39; : 해당 경로로 이동하는 데에 드는 비용을 의미. 라우터가 라우팅 테이블에 있는 경로 중에 패킷을 보낼 경로를 선택할 때, &#39;메트릭&#39;이 낮은 경로를 선호</li>
</ul>
</li>
<li>라우팅 테이블에 없는 경로로 패킷을 전송해야 할 때가 있음. 이 경우 기본적으로 패킷을 내보낼 경로를 설정하여 해당 경로로 패킷을 보낼 수 있다. 이 기본 경로를 &quot;디폴트 라우트&quot;라고 함</li>
<li>&#39;기본 게이트웨이&#39;란, 호스트가 속한 네트워크 외부로 나아가기 위한 첫 번째 경로이고, 일반적으로 라우터 주소를 의미하는 경우가 많음</li>
<li>네트워크 내부 호스트 A가 네트워크 외부 호스트 B에게 패킷을 전달해야 한다고 가정한다면<ul>
<li>A의 라우팅 테이블에 B에 이르는 경로가 없을 경우,</li>
<li>A는 우선 패킷을 라우터(기본 게이트웨이)에 전달</li>
<li>이를 위해 A는 &#39;기본 게이트웨이&#39;를 &#39;디폴트 라우터&#39;로 삼고</li>
<li>만약 수신지 경로가 따로 등록되어 있지 않은 패킷들은 &#39;기본 게이트웨이&#39;에 전달</li>
<li>즉, A 입장에서 &quot;이 수신지 주소는 뭐지?(불분명한 수신지 주소를 가진 패킷을 발견) 일단 디폴트 라우트(기본 게이트웨이, 네트워크 외부로 나아가기 위한 첫 번째 경로, 라우터)로 보내야겠다.&quot;라는 판단을 하는 것</li>
</ul>
</li>
<li>라우팅 테이블을 구성하는 정보는 라우팅 방식에 따라, 호스트 상황에 따라 달라질 수 있음</li>
<li>정리하자면, &#39;라우팅&#39;을 해주는 네트워크 장비인 &#39;라우터&#39;는 &#39;라우팅 테이블&#39;을 통해 패킷을 수신지까지 전달할 수 있다는 점이고, &#39;라우팅 테이블&#39; 안에는 네트워크 상의 특정 수신지까지 도달하기 위한 정보들이 담겨 있다는 것<h3 id="정적-라우팅과-동적-라우팅">정적 라우팅과 동적 라우팅</h3>
</li>
<li>라우팅 테이블을 만드는 방법에 따라 &#39;정적 라우팅&#39;과 &#39;동적 라우팅&#39;으로 구분할 수 있음<h4 id="정적-라우팅">정적 라우팅</h4>
</li>
<li>&#39;정적 라우팅 static routing&#39;은 사용자가 수동으로 직접 라우팅 테이블 항목을 채워 넣은 후에 이를 토대로 라우팅되는 방식<h4 id="동적-라우팅">동적 라우팅</h4>
</li>
<li>정적 라우팅은 입력 실수가 발생할 수 있고, 예상치 못한 문제가 발생할 경우 계속 수동으로 바꿔줘야 함</li>
<li>&#39;동적 라우팅 dynamic routing&#39;은 자동으로 라우팅 테이블을 채우고, 이를 이용하여 라우팅 하는 방식을 의미</li>
<li>그렇다면 어떻게 동적으로 라우팅 테이블을 채울까?<ul>
<li>모든 라우터는 특정 수신지까지 도달하기 위해 최적의 경로를 찾아 라우팅 테이블을 채우려고 함</li>
<li><strong>이를 위해, 라우터끼리 서로 자신의 정보를 교환하는데, 이 과정에서 사용되는 프로토콜이 &#39;(동적) 라우팅 프로토콜&#39;</strong><h4 id="라우터들의-집단-네트워크-as">라우터들의 집단 네트워크 AS</h4>
</li>
</ul>
</li>
<li>동일한 라우팅 정책으로 운용되는 라우터들의 집단 네트워크를 AS(Autonomous System, 자주적인 체계)라고 함</li>
<li>한 AS 내에는 다수의 라우터가 있음</li>
<li>라우터들은 AS 내부에서만 통신할 수도 있고, AS 외부와 통신할 수 있음</li>
<li>AS 외부와 통신할 경우 AS 경계에서 AS 내외로 통신을 주고받을 수 있는 &quot;AS 경계 라우터(ASBR; Autonomous System Boundary Router)&quot;라는 특별한 라우터를 이용<h3 id="라우팅-프로토콜">라우팅 프로토콜</h3>
</li>
<li><strong>&#39;라우팅 프로토콜&#39;은 라우터끼리 자신들의 정보를 교환하며 패킷이 이동할 최적의 경로를 찾기 위한 프로토콜</strong></li>
<li>라우팅 프로토콜은 크게 AS 내부에서 수행하느냐, AS 외부에서 수행하느냐에 따라 종류를 나눔<ul>
<li><strong>AS 내부 수행 프로토콜 : IGP Interior Gateway Protocol</strong></li>
<li><strong>AS 외부 수행 프로토콜 : EGP Exterior Gateway Protocol</strong><h4 id="igp--rip와-ospf-프로토콜">IGP : RIP와 OSPF 프로토콜</h4>
</li>
</ul>
</li>
<li>대표적인 &#39;IGP&#39;로는 &#39;RIP Routing Information Protocol&#39;, &#39;OSPF Open Shortest Path First&#39;가 있음<ul>
<li>&#39;RIP 프로토콜&#39;은 &#39;거리 벡터&#39;가 사용</li>
<li>&#39;OSPF 프로토콜&#39;은 &#39;링크 상태&#39;가 사용</li>
</ul>
</li>
<li>RIP<ul>
<li>&#39;거리 벡터 라우팅 프로토콜&#39;이란, 거리를 기반으로 최적의 경로를 찾는 프로토콜</li>
<li>여기서 &#39;거리&#39;는 패킷이 경유한 라우터의 수, 즉 &#39;홉&#39;의 수를 의미</li>
<li>인접한 라우터끼리 경로 정보를 &#39;주기적&#39;으로 교환하며 라우팅 테이블을 갱신</li>
<li>&#39;홉&#39; 수가 적을수록 라우팅 테이블상의 &#39;메트릭&#39;도 작아짐</li>
</ul>
</li>
<li>OSPF<ul>
<li>&#39;링크 상태 프로토콜&#39;로 네트워크는 마치 노드와 간선(링크)으로 이루어져 있는데, 이러한 링크 정보를 비롯한 현재 네트워크 상태를 그래프의 형태로 &#39;링크 상태 데이터베이스&#39;에 저장</li>
<li>OSPF에서는 최적의 경로를 결정하기 위해 &#39;대역폭&#39;을 기반으로 메트릭을 계산</li>
<li>&#39;대역폭&#39;이 높은 링크일수록 메트릭이 낮은 경로로 인식</li>
<li><strong>OSPF에는 문제점이 있음, 네트워크 규모가 커졌을 때 네트워크 구성이 변경될 때마다 라우팅 테이블이 갱신된다면 그 자체로 부담</strong></li>
<li><strong>이를 해결하기 위해 OSPF에서는 AS를 AREA라는 단위로 나누고, 구분된 에어리어 내에서만 링크 상태를 공유</strong></li>
<li>즉 넓은 범위의 AS를 작게 쪼개어, AREA 단위로 관리하는 것</li>
<li>AREA간의 연결은 &#39;ABR Area Border Router&#39;이라는 라우터가 담당<h4 id="egp--bgp">EGP : BGP</h4>
</li>
</ul>
</li>
<li>대표적인 &#39;EGP&#39;로는 &#39;BGP Border Gateway Protocol&#39;이 있음<ul>
<li>AS 간의 통신에서 사용되는 대표적인 프로토콜로, 엄밀하게는 AS 간의 통신이 &#39;가능한&#39; 프로토콜</li>
</ul>
</li>
<li>AS 간의 통신을 위한 &#39;BGP&#39;는 &#39;eBGP externel BGP&#39;, AS 내의 통신을 위한 &#39;BGP&#39;는 &#39;iBGP internel BGP&#39;라고도 함</li>
<li>AS 간에 정보를 주고받기 위해서는 AS 내에서 eBGP를 사용하는 라우터가 하나 이상 있어야 하고, 또 다른 BGP 라우터와 연결되어야 함<ul>
<li>BGP 메시지를 주고받을 수 있도록 연결된 BGP 라우터를 &#39;피어 peer&#39;라고 정의</li>
<li>즉, 다른 AS와의 BGP 연결을 유지하기 위해서는 BGP 라우터끼리 연결되어 &#39;피어&#39;가 되어야 함</li>
<li>이렇게 피어 관계가 되도록 연결되는 과정을 &#39;피어링 peering&#39;이라고 함</li>
</ul>
</li>
<li>BGP는 RIP와 OSPF에 비해 최적의 경로를 설정하는 과정이 복잡하고, 일정하지 않은 경우가 많음<ul>
<li>why? 경로 결정 과정에서 다양한 &#39;속성&#39;과 &#39;정책&#39;이 고려되기 때문</li>
</ul>
</li>
<li>BGP의 속성이란 경로에 대한 일종의 부가 정보. 속성에 다양한 종류가 있음<ul>
<li>AS-PATH 속성<ul>
<li>메시지가 수신지에 이르는 과정에서 통과하는 AS들의 목록</li>
<li>AS-PATH 속성을 통해 볼 수 있는 BGP의 특징 2가지<ul>
<li>첫째, BGP는 AS 간 라우팅을 할 때 거치게 될 &#39;라우터&#39;의 수가 아닌 &#39;AS&#39;의 수를 고려함</li>
<li>둘째, BGP는 RIP처럼 단순히 수신지에 이르는 &#39;거리&#39;가 아닌, 메시지가 어디를 거쳐 어디로 이동하는지를 나타내는 &#39;경로&#39;를 고려함</li>
</ul>
</li>
</ul>
</li>
<li>NEXT-HOP 속성<ul>
<li>다음 홉, 다음으로 거칠 라우터의 IP 주소를 나타냄</li>
</ul>
</li>
<li>LOCAL-PREF 속성<ul>
<li>AS 외부 경로에 있어 AS 내부에서 어떤 경로를 선호할지에 대한 척도를 나타내는 속성</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크] 물리 계층과 데이터 링크 계층]]></title>
            <link>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%AC%BC%EB%A6%AC-%EA%B3%84%EC%B8%B5%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%A7%81%ED%81%AC-%EA%B3%84%EC%B8%B5</link>
            <guid>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%AC%BC%EB%A6%AC-%EA%B3%84%EC%B8%B5%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%A7%81%ED%81%AC-%EA%B3%84%EC%B8%B5</guid>
            <pubDate>Fri, 16 Aug 2024 07:44:18 GMT</pubDate>
            <description><![CDATA[<h2 id="이더넷">이더넷</h2>
<ul>
<li><strong>이더넷은 다양한 통신 매체의 규격들과 송수신되는 프레임의 형태, 프레임을 주고받는 방법 등이 정의된 네트워크 기술</strong></li>
<li>물리 계층과 데이터 링크 계층은 서로 밀접하게 연관되어 있음. 왜냐? 두 계층은 &#39;이더넷&#39;이라는 공통된 기술을 사용하기 때문</li>
</ul>
<h3 id="이더넷-표준">이더넷 표준</h3>
<ul>
<li>오늘날의 유선 LAN 환경은 대부분 이더넷을 기반<ul>
<li>물리 계층에서는 이더넷 규격 케이블을 사용</li>
<li>데이터 링크 계층에서 주고받는 프레임은 이더넷 프레임의 형식</li>
</ul>
</li>
<li>IEEE 802.3 == 이더넷 관련 표준들의 모음<ul>
<li>이더넷 표준에 따라 지원되는 네트워크 장비, 통신 매체, 전송 속도등이 달라짐</li>
</ul>
</li>
</ul>
<h3 id="통신-매체-표기-형태">통신 매체 표기 형태</h3>
<blockquote>
<p><strong>전송속도</strong>BASE-<strong>추가특성</strong></p>
</blockquote>
<ul>
<li>위와 같은 형태로 통신 매체를 표기</li>
</ul>
<h3 id="통신-매체-종류">통신 매체 종류</h3>
<ul>
<li>C : 동축 케이블</li>
<li>T : 트위스트 페어 케이블</li>
<li>S : 단파장 광섬유 케이블</li>
<li>L : 장파장 광섬유 케이블</li>
<li>ex) 10BASE-T 케이블 -&gt; 10Mbps 속도를 지원하는 트위스티드 페어 케이블</li>
</ul>
<h3 id="이더넷-프레임">이더넷 프레임</h3>
<ul>
<li><p>데이터 링크 계층의 &#39;이더넷 프레임&#39;</p>
</li>
<li><p>이더넷 네트워크에서 주고받는 프레임인 <strong>&#39;이더넷 프레임 Ethernet frame&#39;</strong> 형식은 정해져 있음</p>
</li>
<li><p>이더넷 프레임은 상위 계층으로부터 받아들인 정보에 헤더와 트레일러를 추가하는 <strong>캡슐화</strong> 과정을 통해 만들어짐</p>
</li>
<li><p>수신지 입장에서는 프레임의 헤더와 트레일러를 제거한 뒤 상위 계층으로 올려보내는 <strong>역캡슐화</strong> 과정을 거침
<img src="https://velog.velcdn.com/images/data_buddha/post/1bb83b6e-66fa-41bf-9d52-7e7562ea60ae/image.png" alt="">
출처)<a href="https://nice-engineer.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-ethernet-%ED%94%84%EB%A0%88%EC%9E%84">https://nice-engineer.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%82%B9-ethernet-%ED%94%84%EB%A0%88%EC%9E%84</a></p>
</li>
<li><p>프리앰블 Preamble</p>
<ul>
<li>이더넷 프레임의 시작을 알리는 정보</li>
<li>프리앰블을 통해 이더넷 프레임이 오고 있음을 확인</li>
<li>프리앰블은 송수신지 간의 동기화를 위해 사용되는 정보</li>
</ul>
</li>
<li><p>MAC 주소</p>
<ul>
<li>&#39;물리적 주소&#39;라고도 불리는 <strong>MAC 주소</strong>는 데이터 링크 계층의 핵심</li>
<li>MAC 주소는 일반적으로 고유하고, 일반적으로 변경되지 않는 주소로써 네트워크 인터페이스마다 부여됨</li>
<li>보통 NIC Network Interface Controller라는 장치가 네트워크 인터페이스 역할을 담당</li>
<li>MAC 주소는 불변하다, 고유하다라는 오해가 있지만, 그렇지 않다.</li>
</ul>
</li>
<li><p>타입/길이</p>
<ul>
<li>타입이란 이더넷 프레임이 어떤 정보를 캡슐화했는지를 나타내는 정보<ul>
<li>대표적으로 상위 계층에서 사용된 프로토콜의 이름이 명시</li>
</ul>
</li>
<li>길이는 말 그대로 프레임의 크기(길이)를 나타냄</li>
</ul>
</li>
<li><p>데이터</p>
<ul>
<li>상위 계층에서 전달받거나 상위 계층으로 전달해야 할 내용</li>
</ul>
</li>
<li><p>FCS</p>
<ul>
<li>수신한 이더넷 프레임에 오류가 있는지 확인하기 위한 필드</li>
<li>송수신지의 CRC 값(이더넷 프레임의 프리앰블을 제외한 나머지 필드 값들을 바탕으로 한 값)을 비교하여 오류를 검출</li>
</ul>
</li>
</ul>
<h2 id="nic와-케이블">NIC와 케이블</h2>
<p><strong>NIC Network Interface Controller</strong>는 호스트와 통신 매체를 연결하고, MAC 주소가 부여되는 네트워크 장비이다. <strong>케이블</strong>은 NIC에 연결되는 물리 계층의 유선 통신 매체이다.</p>
<h3 id="nic">NIC</h3>
<ul>
<li><p>호스트와 유무선 통신 매체를 연결하고, 통신 매체를 통해 전달되는 신호와 컴퓨터가 이해할 수 있는 정보 간에 변환이 이루어지는 장비가 바로 NIC</p>
<h3 id="nic의-역할">NIC의 역할</h3>
</li>
<li><p>NIC는 통신 매체에 흐르는 신호를 호스트가 이해하는 프레임으로 변환하거나 그 반대의 경우로 변환하는 역할</p>
</li>
<li><p>네트워크와 호스트의 연결점을 담당한다는 점에서 &quot;네트워크 인터페이스&quot;역할을 수행</p>
</li>
<li><p>MAC 주소를 통해 자기 주소는 물론, 수신되는 프레임의 수신지 주소를 인식</p>
<ul>
<li>관련없는 수신지의 MAC 주소가 명시된 프레임은 폐기하고, FCS를 토대로 잘못된 프레임도 폐기<h3 id="트위스티드-페어-케이블">트위스티드 페어 케이블</h3>
</li>
</ul>
</li>
<li><p>구리 선으로 전기 신호를 주고받는 통신 매체, LAN 케이블이라고 하면 떠오르는 케이블</p>
</li>
<li><p>구리 선이기 때문에 전자적 간섭이 생길 수 있고, 이를 &#39;노이즈&#39;라고 부름</p>
</li>
<li><p>&#39;노이즈&#39;를 해결하기 위해 브레이드 실드, 포일 실드를 사용</p>
<ul>
<li>실드에 따라 트위스티드 페어 케이블을 분류</li>
</ul>
</li>
<li><p>&#39;카테고리&#39;에 따라서도 트위스티드 페어 케이블을 분류</p>
<ul>
<li>높은 카테고리에 속한 케이블일수록 높은 성능을 보임</li>
<li>Cat3, Cat5...<h3 id="광섬유-케이블">광섬유 케이블</h3>
</li>
</ul>
</li>
<li><p>빛(광신호)을 이용해 정보를 주고받는 케이블</p>
</li>
<li><p>코어와 클래딩 간에 빛의 굴절률 차이를 만들어 빛을 코어 내부에 가둠</p>
</li>
<li><p>코어의 지름에 따라 &#39;싱글 모드 광섬유 케이블&#39;, &#39;멀티 모드 광섬유 케이블&#39;로 나눔</p>
<h2 id="허브">허브</h2>
<p>&#39;물리 계층&#39;에서 여러 대의 호스트를 연결하는 <strong>허브</strong></p>
<h3 id="주소-개념이-없는-물리-계층">주소 개념이 없는 물리 계층</h3>
</li>
<li><p><strong>&#39;물리 계층&#39;에는 주소라는 개념이 없음</strong></p>
<ul>
<li>&#39;물리 계층&#39;에서는 단지 호스트와 통신 매체 간의 연결과 통신 매체 상의 송수신이 일어날 뿐</li>
<li>그렇기에 &#39;물리 계층&#39;의 네트워크 장비에서는 송수신되는 정보에 대한 조작이나 판단을 하지 않음</li>
</ul>
</li>
<li><p>송수신지를 특정할 수 있는 주소는 &#39;데이터 링크 계층&#39;부터 존재하는 개념</p>
<ul>
<li>대표적인 <strong>MAC 주소</strong> 개념</li>
<li><strong>&#39;데이터 링크 계층&#39;의 장비나 그 이상 계층의 장비들은 송수신지를 특정할 수 있고, 주소를 바탕으로 송수신되는 정보에 대한 조작과 판단이 가능</strong><h3 id="허브---물리-계층의-네트워크-장비">허브 - &#39;물리 계층&#39;의 네트워크 장비</h3>
<img src="https://velog.velcdn.com/images/data_buddha/post/540e617d-17ca-4655-8826-87e983a9a928/image.png" alt=""></li>
</ul>
</li>
<li><p>여러 대의 호스트를 연결하는 장치</p>
<h4 id="허브의-특징">허브의 특징</h4>
</li>
<li><p>첫째, 전달받은 신호를 다른 모든 포트로 그대로 보낸다.</p>
<ul>
<li>신호를 전달받으면 어떠한 조작이나 판단없이 송신지를 제외한 모든 포트에 그저 정보를 보냄</li>
</ul>
</li>
<li><p>둘째, 반이중 모드로 통신한다.</p>
<ul>
<li><strong>반이중 모드?</strong> 마치 1차선 도로처럼 송수신을 번갈아 가면서 하는 통신 방식</li>
<li><strong>즉, 동시에 송수신이 불가능</strong></li>
<li>반대로 <strong>전이중 모드</strong>는 송수신을 동시에 양방향으로 할 수 있는 통신 방식<h4 id="콜리전-도메인">콜리전 도메인</h4>
</li>
</ul>
</li>
<li><p>허브는 반이중 모드 통신을 지원하기 때문에, 한 호스트가 허브에 송신하는 동안 다른 호스트는 송신하고 싶어도 기다려야 함</p>
</li>
<li><p>만일 동시에 허브에 신호를 송신하면 &#39;충돌&#39; 발생</p>
</li>
<li><p>허브에 호스트가 많이 연결되어 있을수록 충돌 발생 가능성 UP</p>
</li>
<li><p>충돌이 발생할 수 있는 영역을 &#39;콜리전 도메인&#39;이라고 함</p>
<ul>
<li>허브에 연결된 모든 호스트는 같은 &#39;콜리전 도메인&#39;에 속함<h3 id="csmacd">CSMA/CD</h3>
</li>
</ul>
</li>
<li><p>허브에서 충돌이 발생하는 근본적인 이유는 &#39;반이중 모드 통신&#39; 때문</p>
</li>
<li><p>이러한 충돌 문제를 해결하기 위한 프로토콜이 *<em>&#39;CSMA/CD&#39; *</em></p>
<ul>
<li>이더넷 네트워크에서 충돌을 방지하는 대표적인 프로토콜</li>
<li>(반이중) 이더넷을 대표하는 송수신 방법</li>
</ul>
</li>
<li><p>Carrier Sense Multiple Access with Collision Detection의 약자</p>
<ul>
<li>CS : Carrier Sense 캐리어 감지를 의미<ul>
<li>메시지를 보내기 전에 현재 네트워크 상에 전송 중인 것이 있는지 확인 </li>
<li>통신 매체의 사용 여뷰를 검사하는 것</li>
</ul>
</li>
<li>MA : Multiple Access 다중 접근을 의미<ul>
<li>캐리어 감지를 해도 부득이하게 동시에 네트워크를 사용할 수 있음. 이런 상황을 &#39;다중 접근&#39;이라고 함</li>
</ul>
</li>
<li>CD : Collision Detection 충돌 검출을 의미<ul>
<li>충돌이 발생하면 이를 알리고, 임의의 시간 동안 기다린 뒤에 다시 전송<h2 id="스위치">스위치</h2>
<img src="https://velog.velcdn.com/images/data_buddha/post/1d409c7e-dd6c-42e2-ade9-95d5894afd02/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<p>CSMA/CD 프로토콜로 어느정도 충돌을 완화할 수 있지만, 애초에 전달받은 신호를 수신지 호스트가 연결된 포트로만 내보내고, 전이중 모드로 통신하면 된다. 이러한 기능을 지원하는 네트워크 장비가 바로 &#39;데이터 링크 계층&#39;의 네트워크 장비 <strong>스위치</strong>이다.</p>
<h3 id="스위치---데이터-링크-계층의-네트워크-장비">스위치 - &#39;데이터 링크 계층&#39;의 네트워크 장비</h3>
<ul>
<li><p>허브와 달리 <strong>MAC 주소를 학습해 특정 MAC 주소를 가진 호스트에만 프레임을 전달할 수 있고, 전이중 모드 통신을 지원</strong></p>
</li>
<li><p>CSMA/CD 프로토콜의 대기 시간이 없어지니 성능상으로도 이점이 있음</p>
<h4 id="스위치의-특징">스위치의 특징</h4>
</li>
<li><p>특정 포트와 해당 포트와 연결된 호스트의 MAC 주소의 관계를 기억하는 <strong>&#39;MAC 주소 학습&#39;</strong> </p>
<ul>
<li>스위치의 포트와 연결된 호스트의 MAC 주소 연관관계 정보를 <strong>&#39;MAC 주소 테이블&#39;</strong>이라는 표에 담고 이를 메모리에 저장<h3 id="mac-주소-학습">MAC 주소 학습</h3>
</li>
</ul>
</li>
<li><p>플러딩, 포워딩과 필터링, 에이징이라는 스위치의 기능을 통해 MAC 주소학습이 가능</p>
</li>
<li><p>플러딩 Flooding</p>
<ul>
<li>스위치는 처음에 어떠한 정보도 가지고 있지 않음</li>
<li>스위치의 MAC 주소 학습은 프레임 내의 &#39;송신지 MAC 주소&#39; 필드를 바탕으로 이루어짐</li>
<li>처음 호스트에게서 프레임을 수신하면, &#39;송신지 MAC 주소&#39;를 바탕으로 해당 호스트와 연결된 포트를 &#39;MAC 주소 테이블&#39;에 저장</li>
<li>하지만 여전히 수신지 호스트가 어느 포트에 연결되어 있는지 확인할 수 없음</li>
<li><strong>이 상황에서 마치 허브처럼 송신지 포트를 제외한 모든 포트로 프레임을 전송</strong></li>
<li><strong>이러한 동작을 &#39;플러딩 flooding&#39;이라고 함</strong></li>
<li>관련없는 호스트는 관련없는 프레임을 받았음으로 폐기</li>
</ul>
</li>
<li><p>필터링과 포워딩</p>
<ul>
<li>전달받은 프레임을 어디로 보내고 보내지 않을지 결정하는 스위치의 기능을 &#39;필터링&#39;이라고 함</li>
<li>그리고 전송될 포트에 실제로 프레임을 보내는 것을 &#39;포워딩 forwarding&#39;이라고 함</li>
</ul>
</li>
<li><p>에이징 aging</p>
<ul>
<li>만약 MAC 주소 테이블에 등록된 특정 포트에서 일정 시간 동안 프레임을 전송받지 못했다면 해당 항목은 삭제됨</li>
<li>이를 &#39;에이징&#39;이라고 함<h3 id="vlan">VLAN</h3>
<img src="https://velog.velcdn.com/images/data_buddha/post/6a706c45-6932-432b-923f-975318c470b9/image.png" alt="">
출처) <a href="https://info.support.huawei.com/info-finder/encyclopedia/en/VLAN.html">https://info.support.huawei.com/info-finder/encyclopedia/en/VLAN.html</a></li>
</ul>
</li>
<li><p>Virtual LAN의 줄임말로, 한 대의 스위치로 가상의 VLAN을 만드는 스위치의 중요한 기능</p>
</li>
<li><p>VLAN을 구성하면 한 대의 물리적 스위치라 해도 여러 대의 스위치가 있는 것처럼 논리적인 단위로 LAN을 구획할 수 있음</p>
</li>
<li><p>서로 다른 VLAN에 속한 호스트 간에 통신이 필요하다면 &#39;네트워크 계층&#39; 이상의 장비가 필요</p>
</li>
<li><p>브로드캐스트 도메인도 달라짐</p>
</li>
<li><p>VLAN에는 &#39;포트 기반 VLAN&#39;, &#39;MAC 기반 VLAN&#39;이 있음</p>
<h4 id="포트-기반-vlan">포트 기반 VLAN</h4>
</li>
<li><p>스위치의 포트가 VLAN을 결정하는 방식</p>
</li>
<li><p>사전에 특정 포트에 VLAN을 할당하고, 해당 포트에 호스트를 연결함으로써 VLAN에 포함시킬 수 있음</p>
</li>
<li><p>사실 한 대의 스위치만으로 포트 기반 VLAN을 나누면 포트 수가 부족해질 수 있다는 문제가 생김
<img src="https://velog.velcdn.com/images/data_buddha/post/bb24c577-906a-4c01-a21d-5ebe44228b85/image.png" alt="">
출처) <a href="https://community.fs.com/article/switch-stacking-vs-trunking-vs-uplink-which-is-best-to-connect-switches.html">https://community.fs.com/article/switch-stacking-vs-trunking-vs-uplink-which-is-best-to-connect-switches.html</a></p>
</li>
<li><p>이럴 때 사용하는 방법이 <strong>&#39;VLAN 트렁킹 trunking&#39;</strong></p>
<ul>
<li>두 대 이상의 VLAN 스위치를 효율적으로 연결하여 확장하는 방법</li>
<li>스위치 간의 통신을 위한 특별한 포트인 <strong>&#39;트렁크 포트&#39;</strong>에 VLAN 스위치를 서로 연결하는 방식<h4 id="mac-기반-vlan">MAC 기반 VLAN</h4>
</li>
</ul>
</li>
<li><p>포트가 VLAN을 결정하는 것이 아니라 <strong>송수신하는 프레임 속 &#39;MAC 주소&#39;가 호스트가 속할 VLAN을 결정하는 방식</strong></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네트워크] 컴퓨터 네트워크 시작하기]]></title>
            <link>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@data_buddha/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 15 Aug 2024 05:51:42 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>부트캠프 마지막 프로젝트로 웹소켓 프로토콜을 이용해 실시간 메세징 기능을 구현했다. 강의를 통해 기능 구현은 완성했지만 프로토콜, 더 나아가 네트워크에 대한 지식이 부족함을 느꼈다. &quot;혼자 공부하는 네트워크&quot;라는 책을 공부하고 정리하면서 네트워크에 대한 이해도를 높이고자 한다.</p>
</blockquote>
<h1 id="ch1-컴퓨터-네트워크-시작하기">Ch1. 컴퓨터 네트워크 시작하기</h1>
<h2 id="1-컴퓨터-네트워크를-알아야-하는-이유">1. 컴퓨터 네트워크를 알아야 하는 이유</h2>
<ul>
<li><p>네트워크 == 여러 장치가 연결되어 정보를 주고 받을 수 있는 통신망</p>
</li>
<li><p>인터넷 == 네트워크 of 네트워크 즉, 네트워크를 연결하는 네트워크</p>
<ul>
<li>대부분의 프로그램들은 네트워크를 통해 다른 장치와 상호작용하며 작동한다.</li>
<li><strong>이는 다른 장치와 상호작용하며 실행되는 프로그램을 개발하는 경우가 많다는 것을 의미한다.</strong> 따라서 개발 직군은 네트워크를 제대로 이해해야 한다.<h2 id="2-네트워크-거시적으로-살펴보기">2. 네트워크 거시적으로 살펴보기</h2>
</li>
</ul>
</li>
<li><p>네트워크의 노드와 간선으로 구성된 그래프 모습을 띤다.</p>
</li>
<li><p><strong>네트워크의 기본구조는 호스트, 네트워크 장비, 통신 매체, 메시지로 구성된다.</strong></p>
<ul>
<li>호스트<ul>
<li>네트워크 가장자리에 위치한 노드로 정보를 최초로 생성 및 송신하고 최종적으로 수신하는 역할</li>
<li><strong>서버와 클라이언트의 역할을 수행한다.</strong><ul>
<li>서버는 &#39;어떠한 서비스를 제공하는 역할&#39; </li>
<li>클라이언트는 &quot;서버에 정보를 요청하고 응답을 제공받는 역할&#39;</li>
</ul>
</li>
</ul>
</li>
<li>네트워크 장비<ul>
<li>가장자리에 위치하지 않는 노드, 중간노드</li>
<li>예시로는 이더넷 허브, 스위치, 라우터, 공유기 등이 있다.</li>
<li>이를 &#39;네트워크 장비&#39;라 칭한다.</li>
<li><strong>호스트 간 주고받는 정보가 원하는 수신지까지 안정적이고 안전하게 전송될 수 있도록 한다.</strong></li>
</ul>
</li>
<li>통신 매체<ul>
<li>각 노드를 연결하는 간선이 &#39;통신 매체&#39;이다.</li>
<li>유선 매체와 무선 매체가 있다.</li>
</ul>
</li>
<li>메시지<ul>
<li>노드가 주고 받는 정보를 &#39;메시지&#39;라고 한다.</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>네트워크를 범위에 따라 분류하기도 한다. LAN과 WAN이 있다.</strong></p>
<ul>
<li>LAN (Local Area Network)<ul>
<li>가까운 지역을 연결한 근거리 통신망</li>
<li>가정, 기업, 학교처럼 한정된 공간에서의 네트워크를 LAN</li>
</ul>
</li>
<li>WAN (Wide Area Network)<ul>
<li>먼 지역을 연결하는 광역 통신망</li>
<li>서로 멀리 떨어진 LAN을 연결하는 네트워크</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>네트워크를 메세지 교환 방식에 따라 분류하기도 한다. 회선 교환 네트워크, 패킷 교환 네트워크가 있다.</strong></p>
<ul>
<li>회선 교환 네트워크<ul>
<li>회선 교환 방식을 사용하는 네트워크</li>
<li><strong>호스트 간에 메시지를 주고받기 전에 회선을 설정한 뒤, 해당 회선을 통해서만 메세지를 주고 받을 수 있다.</strong></li>
<li>회선 스위치를 통해 호스트 사이에 일대일 전송로를 확보한다.</li>
<li>대표적인 예로 전동적인 전화망이 있다.</li>
<li>장점으로는, 우선 두 호스트 사이에 연결을 확보한 후에 메시지를 주고 받는 특성 덕분에 주어진 시간 동안 전송되는 정보의 양이 비교적 일정하다는 점이다.</li>
<li>단점으로는, 회선의 이용 효율이 낮아질 수 있다는 것이다.<blockquote>
<p>&#39;주어진 시간 동안 전송되는 정보의 양이 일정하다&#39;는 것이 왜 장점일까? </p>
<blockquote>
<ol>
<li>예측 가능성 : 전송량이 일정하므로 네트워크의 성능을 예측하기가 쉽다. 이는 실시간 어플리케이션에 중요하다.</li>
<li>서비스 품질 보장 : 대역폭이 보장되어 지연이 적다. 음성통화나 비디오 스트리밍 같은 서비스에 적합하다.</li>
<li>패킷 교환 네트워크에 비해 구조가 간단하며 전용 회로를 사용하므로 보안성이 뛰어나다.</li>
</ol>
</blockquote>
</blockquote>
</li>
</ul>
</li>
<li>패킷 교환 네트워크<ul>
<li>회선 교환 네트워크의 단점을 해결한 교환 방식</li>
<li><strong>메시지를 &#39;패킷&#39;이라는 단위로 쪼개어 전송한다.</strong><ul>
<li>패킷 packet은 송수신되는 메시지의 단위이다. 현대 인터넷은 대부분 패킷 교환 네트워크를 이용한다.</li>
</ul>
</li>
<li>회선을 점유하는 방식이 아니기 때문에 네트워크 이용 효율이 상대적으로 높다. </li>
<li><strong>설정된 경로만으로 통신하는 회선 교환 네트워크와는 달리, 정해진 경로만으로 메시지를 송수신하지 않으며, 중간 노드인 &#39;패킷 스위치&#39;는 패킷이 수신지까지 올바르게 도달할 수 있도록 최적의 경로를 설정하거나 송수신지를 식별한다. 대표적인 예로는 &#39;라우터&#39;와 &#39;스위치&#39;가 있다.</strong></li>
<li><strong>패킷을 통해 전송하고자 하는 데이터를 &#39;페이로드 payload&#39;라고 한다.</strong><ul>
<li>택배 상자에 넣을 물품이라고 생각해도 좋다.</li>
</ul>
</li>
<li><strong>페이로드 앞에 &#39;헤더 header&#39;와 페이로드 뒤에 &#39;트레일러 trailer&#39;라는 정보가 포함되기도 한다.</strong><ul>
<li>패킷에 붙는 일종의 부가정보, 제어정보이며 택배 상자에 붙이는 송장과 같다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>주소와 송수신지 유형에 따라 전송 방식을 구분한다.</p>
<ul>
<li>패킷의 헤더에 담기는 대표적인 정보로는 주소가 있다.<ul>
<li>&#39;주소 address&#39;는 송수신지를 특정하는 정보를 의미한다.</li>
</ul>
</li>
<li>*<em>주소가 있다면 송수신지 유형에 따라 다양한 방식으로 메시지를 보낼 수 있다. 대표적으로 &#39;유니캐스트 unicast&#39;와 &#39;브로드캐스트 broadcast&#39; 방식이 있다. *</em><ul>
<li>유니캐스트<ul>
<li>가장 일반적인 형태의 송수신 방식으로, 송신지와 수신지가 일대일로 메시지를 주고 받는 경우</li>
</ul>
</li>
<li>브로드캐스트<ul>
<li>자신을 제외한 네트워크상의 모든 호스트에게 전송하는 방식<h2 id="3-네트워크-미시적으로-살펴보기">3. 네트워크 미시적으로 살펴보기</h2>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>프로토콜 : 통신 과정에서 정보를 올바르게 주고 받기 위한 규칙이나 방법</strong></p>
<ul>
<li>일상에서 정보를 주고 받기 위해 &#39;언어&#39;를 사용하듯이 노드 간에 정보를 주고 받을 때도 &#39;언어&#39;와 같은 약속된 규칙이 필요하다. 이를 &#39;프로토콜&#39;이라고 한다.</li>
<li>프로토콜의 종류는 매우 다양하며, 통신 과정에서는 여러 프로토콜을 사용한다. </li>
</ul>
</li>
<li><p><strong>네트워크 참조 모델 : 통신이 일어나는 구조(과정)을 계층화</strong></p>
<ul>
<li><p>네트워크를 통해 정보를 주고받을 때는 &#39;정형화&#39;된 여러 단계를 거친다. 이 과정은 계층으로 표현할 수 있다.</p>
</li>
<li><p>*<em>이렇게 통신이 일어나는 각 과정을 계층으로 나눈 구조를  &#39;네트워크 참조 모델 network reference model&#39; 혹은 &#39;네트워크 계층 모델&#39;이라고 부른다. *</em></p>
</li>
<li><p><strong>통신 과정을 계층으로 나눈 이유는 네트워크 구성과 설계가 용이하며, 네트워크 문제 진단과 해결이 계층별로 진단하기 쉬워진다.</strong></p>
</li>
<li><p>OSI 모델과 TCP/IP 모델이 있다.</p>
<ul>
<li><p>OSI 모델 (OSI 7계층)
<img src="https://velog.velcdn.com/images/data_buddha/post/8955de22-453a-4a27-ac26-0330c0caecb5/image.png" alt="https://lxxyeon.tistory.com/155">
출처) <a href="https://lxxyeon.tistory.com/155">https://lxxyeon.tistory.com/155</a></p>
<blockquote>
<pre><code>- 1. 물리 계층 : 1과 0으로 표현되는 비트 신호를 주고 받는 계층, 가장 근원적인 통신이 이루어지는 계층, 통신 매체에 맞는 신호(전기, 빛, 전파 등)로 운반되도록 비드 데이터의 변환이 이루어지고 통신 매체를 통한 송수신이 이루어지는 계층</code></pre></blockquote>
</li>
<li><ol start="2">
<li>데이터 링크 계층 : 주변 장치 간의 정보를 올바르게 주고받기 위한 계층, 주고받는 정보에 오류가 없는지 확인하고, MAC 주소라는 주소 체계를 통해 네트워크 송수신지를 특정한다. </li>
</ol>
</li>
<li><ol start="3">
<li>네트워크 계층 : 메시지를 (다른 네트워크에 속한) 수신지까지 전달하는 계층, 네트워크 간 통신이 이루어지는 계층, 인터넷을 가능케하는 계층, IP 주소라는 주소 체계를 통해 통신하고자 하는 수신지 호스트와 네트워크를 식별하고 수신지에 도달하기 위한 최적의 경로를 결정</li>
</ol>
</li>
<li><ol start="4">
<li>전송 계층 : 패킷이 정상적으로 보내졌는지 확인하는 계층, 포트라는 정보를 통해 실행 중인 응용 프로그램의 식별이 이루어짐</li>
</ol>
</li>
<li><ol start="5">
<li>세션 계층 : 응용 프로그램 간의 연결 상태인 &#39;세션 session&#39;을 생성하거나 유지하고 끊어주는 역할을 하는 계층</li>
</ol>
</li>
<li><ol start="6">
<li>표현 계층 : 사람이 이해할 수 있는 언어인 문자를 컴퓨터가 이해할 수 있도록 코드로 변환하는 계층</li>
</ol>
</li>
<li><ol start="7">
<li>응용 계층 : 사용자와 가장 밀접하게 맞닿아 있는 계층, 사용자에게 다양한 서비스가 제공될 수 있도록 하며 그만큼 타 계층에 비해 응용 계층에 속한 프로토콜이 많다</li>
</ol>
</li>
<li><p>TCP/IP 모델 (TCP/IP 4계층)
<img src="https://velog.velcdn.com/images/data_buddha/post/60da6e42-c007-4f47-9759-f9c5727d5158/image.png" alt="">
출처) <a href="https://velog.io/@hey-hey/TCP-IP-4%EA%B3%84%EC%B8%B5">https://velog.io/@hey-hey/TCP-IP-4%EA%B3%84%EC%B8%B5</a></p>
</li>
<li><p><strong>OSI 모델은 네트워크를 이론적으로 풀어낸 것이고 TCP/IP 모델은 구현에 중점을 둔 네트워크 참조 모델이다. OSI 모델이 &#39;이상적 설계&#39;에 가깝다면 TCP/IP 모델은 &#39;실용적 구현&#39;에 가깝다.</strong></p>
</li>
<li><p>TCP와 IP, 이 두 프로토콜은 현대 네트워크 구현의 핵심으로 간주되어 이러한 이름이 붙었다.</p>
<blockquote>
<pre><code>- 1. 네트워크 엑세스 계층 : OSI 모델의 데이터 링크 계층과 유사하다. </code></pre></blockquote>
</li>
<li><ol start="2">
<li>인터넷 계층 : OSI 모델에서의 네트워크 계층과 유사하다.</li>
</ol>
</li>
<li><ol start="3">
<li>전송 계층 : OSI 모델의 전송 계층과 유사하다. </li>
</ol>
</li>
<li><ol start="4">
<li>응용 계층 : OSI 모델의 세션, 표현, 응용 계층과 유사하다. </li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>통신과정에서 이루어지는 : 캡슐화, 역캡슐화</strong></p>
<ul>
<li>패킷은 송신과정에서 캡슐화가 이루어지고, 수신과정에서 역캡슐화가 이루어진다. </li>
<li>송수신하는 메시지는 송신지 입장에서는 가장 높은 계층 -&gt; 가장 낮은 계층으로 이동, 수신지 입장에서는 가장 낮은 계층 -&gt; 가장 높은 계층으로 이동한다.</li>
<li>캡슐화<ul>
<li>어떤 정보를 송신할 때 각 계층에서는 상위 계층에서 내려바은 패킷을 페이로드로 삼아, 프로토콜에 걸맞은 헤더(혹은 트레일러)를 덧붙인 후 하위 계층으로 전달한다. (러시아 인형 &#39;마트로시카&#39;를 떠올리자)</li>
</ul>
</li>
<li>역캡슐화<ul>
<li>수신하는 과정은 송신하는 과정의 반대이다.</li>
<li>캡슐화 과정에서 붙였던 헤더(혹은 트레일러)를 각 계층에서 확인한 뒤 제거한다.</li>
</ul>
</li>
</ul>
</li>
<li><p>PDU (Protocol Data Unit) : 각 계층에서 송수신되는 메시지의 단위</p>
<ul>
<li>OSI 모델 기준, 전송 계층 이하의 메시지를 구분하기 위해 사용한다. </li>
</ul>
</li>
<li><p>OSI 모델, TCP/IP 모델은 사실 아무것도 해주지 않는다.</p>
<ul>
<li>반드시 지켜야하는 엄격한 규칙이 아니다.</li>
<li>네트워크 &#39;참조&#39; 모델이라는 이름처럼 네트워크 구조에 대한 개념 참조를 위해 사용하는 가이드라인 같은 것이다.</li>
<li>그저 네트워크를 계층화해 보이지 않는 것을 시각화하여 구성과 설계, 문제진단을 용이하도록 도와주는 역할이다. 즉, 네트워크를 이해하는데 중요한 개념이다.</li>
</ul>
</li>
<li><p>트래픽과 네트워크 성능 지표</p>
<ul>
<li>&#39;트래픽&#39;은 네트워크 내의 정보량을 의미한다. </li>
<li>트래픽이 몰리면 과부하가 발생할 수 있다.</li>
<li>그렇다면 네트워크의 성능은 &#39;처리율&#39;, &#39;대역폭&#39;, &#39;패킷 손실&#39; 등의 지표로 측정한다.</li>
<li>처리율<ul>
<li>단위 시간당 네트워크를 통해 실제로 전송되는 정보량</li>
<li>비교적 실시간성이 강조된 지표</li>
</ul>
</li>
<li>대역폭<ul>
<li>단위 시간 동안 통신 매체를 통해 송수신할 수 있는 최대 정보량을 의미</li>
<li>마치 도로의 너비가 넓어 오갈 수 있는 자동차가 많은 상황</li>
</ul>
</li>
<li>패킷 손실<ul>
<li>전체 패킷 중 유실된 패킷을 백분위로 표현한 값을 사용하는 경우가 많다.</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[기초수학] 4장. 변화율과 도함수 : 출력의 민감도 나타내기]]></title>
            <link>https://velog.io/@data_buddha/%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%99-4%EC%9E%A5.-%EB%B3%80%ED%99%94%EC%9C%A8%EA%B3%BC-%EB%8F%84%ED%95%A8%EC%88%98-%EC%B6%9C%EB%A0%A5%EC%9D%98-%EB%AF%BC%EA%B0%90%EB%8F%84-%EB%82%98%ED%83%80%EB%82%B4%EA%B8%B0</link>
            <guid>https://velog.io/@data_buddha/%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%99-4%EC%9E%A5.-%EB%B3%80%ED%99%94%EC%9C%A8%EA%B3%BC-%EB%8F%84%ED%95%A8%EC%88%98-%EC%B6%9C%EB%A0%A5%EC%9D%98-%EB%AF%BC%EA%B0%90%EB%8F%84-%EB%82%98%ED%83%80%EB%82%B4%EA%B8%B0</guid>
            <pubDate>Fri, 13 Oct 2023 06:08:10 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/data_buddha/post/b3d7d105-71e6-40e2-9b35-ef3acb4e9bfe/image.png" alt="">
<img src="https://velog.velcdn.com/images/data_buddha/post/84976470-9712-4a6d-bc7e-5bd7fbd64f22/image.png" alt="">
<img src="https://velog.velcdn.com/images/data_buddha/post/512991c8-2a39-4d8a-9098-8f52f7cee0d8/image.png" alt="">
<img src="https://velog.velcdn.com/images/data_buddha/post/df364729-fe0e-4785-8299-1f1d69c33670/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[이코테] 이진탐색]]></title>
            <link>https://velog.io/@data_buddha/%EC%9D%B4%EC%BD%94%ED%85%8C-%EC%9D%B4%EC%A7%84%ED%83%90%EC%83%89</link>
            <guid>https://velog.io/@data_buddha/%EC%9D%B4%EC%BD%94%ED%85%8C-%EC%9D%B4%EC%A7%84%ED%83%90%EC%83%89</guid>
            <pubDate>Fri, 13 Oct 2023 03:52:11 GMT</pubDate>
            <description><![CDATA[<h1 id="순차탐색">순차탐색</h1>
<ul>
<li><p>순차탐색Seqiential Search란 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법</p>
<pre><code class="language-python">def sequential_search(n, target, array):

# 각 원소 하나씩 확인하여
for i in range(n):
  # 현재의 원소가 타겟값과 일치할 경우
  if array[i] == target:
    # 현재위 위치 반환 (인덱스 이므로 +1)
    return i + 1
</code></pre>
</li>
</ul>
<p>print(&#39;생성할 원소 갯수, 타겟 문자열 입력하세요&#39;)
input_data = input().split()
n = int(input_data[0])
target = input_data[1]</p>
<p>print(&#39;앞서 적은 원소 갯수만큼 문자열을 입력하세요&#39;)
array = input().split()</p>
<h1 id="순차탐색-결과-출력">순차탐색 결과 출력</h1>
<p>print(sequential_search(n, target, array))</p>
<pre><code>- 순차탐색은 데이터 정렬 여부와 상관없이 하나씩 확인해야 하므로, 데이터의 개수가 N개일 때, 최악의 시간복잡도는 $O(N)$

# 이진탐색 : 반으로 쪼개면서 탐색하기
- 이진탐색Binary Search는 내부의 데이터가 정렬되어 있어야만 사용할 수 있음
- 탐색범위를 절반씩 좁혀가며 데이터를 탐색하기 때문에 매우 빠르게 데이터를 찾을 수 있음
- 이진탐색은 위치를 나타내는 변수 3개 사용 : 탐색하고자 하는 범위의 **시작점, 끝점, 중간점**
- **찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교**하여 원하는 데이터를 찾음
- 중간점이 float형일 경우, 소수점 이하를 버려서 중간점을 설정
- 이진탐색은 한번 확인 시 확인하는 원소의 개수가 절반씩 줄어든다는 점에서 시간복잡도가 $O(logN)$
- 이진탐색을 구현하는 방법에는 재귀함수, 단순반복문 2가지 경우가 있음
- 재귀함수로 구현한 코드
```python
def binary_search(array, target, start, end):
  # 종료조건
  if start &gt; end:
    return None

  mid = (start + end) // 2
  # 찾은 경우 중간값 인덱스 반환
  if array[mid] == target:
    return mid
  # 중간값이 타겟값보다 큰 경우
  elif array[mid] &gt; target:
    # 왼쪽 확인 (start ~ mid-1)
    return binary_search(array, target, start, mid-1)
  # 중간값이 타겟값보다 작은 경우
  else:
    # 오른쪽 확인 (mid+1 ~ end)
    return binary_search(array, target, mid+1, end)

n, target = list(map(int, input().split()))
array = list(map(int, input().split()))

# 인덱스 값이므로 n - 1 ex)원소의 개수가 10개면 인덱스는 0~9
result = binary_search(array, target, 0, n-1)
if result == None:
  print(&#39;원소가 존재하지 않습니다.&#39;)
else:
  # 몇 번째 원소인지 반환해야하므로 인덱스에 더하기 1
  print(result + 1)</code></pre><ul>
<li>반복문으로 구현한 코드<pre><code class="language-python">def binary_search(array, target, start, end):
# start가 end보다 작거나 같을 때만 실행
while start &lt;= end:
  # 중간값 설정
  mid = (start + end) // 2
  # 같으면 mid 반환
  if array[mid] == target:
    return mid
  # 중간값이 타겟값보다 크면 왼쪽 확인
  elif array[mid] &gt; target:
    end = mid-1
  # 중간값이 타겟값보다 작으면 오른쪽 확인
  else:
    start = mid + 1
# start가 end보다 크면 None 반환
return None
</code></pre>
</li>
</ul>
<p>n, target = list(map(int, input().split()))
array = list(map(int, input().split()))</p>
<h1 id="인덱스-값이므로-n---1-ex원소의-개수가-10개면-인덱스는-09">인덱스 값이므로 n - 1 ex)원소의 개수가 10개면 인덱스는 0~9</h1>
<p>result = binary_search(array, target, 0, n-1)
if result == None:
  print(&#39;원소가 존재하지 않습니다.&#39;)
else:</p>
<h1 id="몇-번째-원소인지-반환해야하므로-인덱스에-더하기-1">몇 번째 원소인지 반환해야하므로 인덱스에 더하기 1</h1>
<p>  print(result + 1)</p>
<pre><code>- 탐색범위가 2,000만을 넘어가면 이진탐색으로 접근해보자
- 처리해야 할 데이터의 개수나 값이 1,000만 단위 이상으로 넘어가면 이진탐색과 같이 $O(logN)$의 속도를 내야하는 알고리즘 떠올려야 함

# 트리 자료구조
![](https://velog.velcdn.com/images/data_buddha/post/41cf66b4-7e18-4af2-931d-adbddd44d2e4/image.png)

- 이진탐색은 전제조건이 데이터 정렬
- 데이터베이스는 내부적으로 대용량 데이터 처리에 적합한 트리 자료구조를 이용하여 항상 데이터가 정렬되어 있음
- 트리 자료구조 특징
    1. 트리는 부모노드와 자식노드의 관계로 표현
    2. 트리의 최상단 노드를 루트노드라고 함
      3. 트리의 최하단 노드를 단말노드라고 함
       4. 트리에서 일부를 떼어내도 트리구조이며 이를 서브 트리라고 함
       5. 트리는 파일 시스템과 같이 계층적이고 정렬된 데이터를 다루기에 적합
- 트리구조로 데이터 저장 -&gt; 이진탐색과 같은 기법 활용해 빠르게 데이터 탐색 가능

# 이진 탐색 트리
![](https://velog.velcdn.com/images/data_buddha/post/f26d8aab-e082-4951-a355-89b6b87b1c22/image.png)

- 이진 탐색 트리란 이진탐색이 동작할 수 있도록 고안된, 효율적인 탐색이 가능한 자료구조
- 이진 탐색 트리 특징
    1. 부모노드보다 왼쪽 자식노드가 작음
       2. 부모노드보다 오른쪽 자식노드가 큼
- 즉, **왼쪽 자식노드 &lt; 부모노드 &lt; 오른쪽 자식노드**

# 빠르게 입력받기
- 이진탐색 문제는 입력 데이터가 많거나, 탐색범위가 매우 넓은 편
- 데이터 개수가 1,000만 개를 넘어가거나 탐색범위가 1,000억 이상이라면 이진탐색 알고리즘을 떠올려보자
- 입력 데이터의 개수가 많은 문제에 input() 함수를 사용하면 동작 속도가 느려서 시간초과 판정을 받을 수 있음
- 입력 데이터가 많은 문제는 **sys 라이브러리의 readline()함수**를 이용하면 시간초과 피할 수 있음
```python
import sys

input_data = &#39;hello, coding, test!&#39;
# 하나의 문자열 데이터 입력받기
input_data = sys.stdin.readline().rstrip()

# 입력받은 문자열 그대로 출력
print(input_data)</code></pre><ul>
<li>rstrip() 꼭 호출해야 함, readline()으로 입력하면 입력 후 엔터Enter가 줄 바꿈 기호로 입력되는데, 이 공백 문자를 제거하려면 rstrip()을 사용해야 함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[기초수학] 3장. 다변수함수와 벡터함수 : 입력과 출력이 여러 개..]]></title>
            <link>https://velog.io/@data_buddha/%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%99-3%EC%9E%A5.-%EB%8B%A4%EB%B3%80%EC%88%98%ED%95%A8%EC%88%98%EC%99%80-%EB%B2%A1%ED%84%B0%ED%95%A8%EC%88%98-%EC%9E%85%EB%A0%A5%EA%B3%BC-%EC%B6%9C%EB%A0%A5%EC%9D%B4-%EC%97%AC%EB%9F%AC-%EA%B0%9C</link>
            <guid>https://velog.io/@data_buddha/%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%99-3%EC%9E%A5.-%EB%8B%A4%EB%B3%80%EC%88%98%ED%95%A8%EC%88%98%EC%99%80-%EB%B2%A1%ED%84%B0%ED%95%A8%EC%88%98-%EC%9E%85%EB%A0%A5%EA%B3%BC-%EC%B6%9C%EB%A0%A5%EC%9D%B4-%EC%97%AC%EB%9F%AC-%EA%B0%9C</guid>
            <pubDate>Tue, 10 Oct 2023 05:23:00 GMT</pubDate>
            <description><![CDATA[<p>** 책의 내용을 정리하다보니, 쉽게 설명한 부분에서 정확하지 않은 부분이 있을 수 있습니다.**</p>
<h1 id="입력과-출력에-따른-함수">입력과 출력에 따른 함수</h1>
<h2 id="스칼라와-벡터">스칼라와 벡터</h2>
<ul>
<li><p>스칼라 : 크기만을 가지는 값, 숫자 하나로 표현되는 값 ex)재산, 온도의 크기</p>
</li>
<li><p>벡터 : 크기와 방향을 모두 가지는 값, 숫자 여러 개인 값, 벡터는 기본적으로 열벡터 ex) 속도</p>
</li>
<li><p>일변수 스칼라함수, 일변수 벡터함수, 다변수 스칼라함수, 다변수 벡터함수</p>
</li>
</ul>
<h1 id="일변수-스칼라함수">일변수 스칼라함수</h1>
<ul>
<li>입력 : 숫자 하나 / 출력 : 숫자 하나</li>
</ul>
<h1 id="일변수-벡터함수">일변수 벡터함수</h1>
<ul>
<li><p>입력 : 숫자 하나 / 출력 : n차원 벡터</p>
</li>
<li><p>경사도 벡터가 함수의 최대 증가 방향을 가리킨다는 중요한 성질을 증명하는데 사용됨</p>
</li>
</ul>
<h1 id="다변수-스칼라함수--벡터변수-스칼라-함수">다변수 스칼라함수 = 벡터변수 스칼라 함수</h1>
<ul>
<li><p>함숫값을 최대 or 최소로 만들면 어떤 목적이 달성되는 함수를 목적함수 or 비용함수 or 손실함수라고 함, 모두 다변수 스칼라함수</p>
</li>
<li><p>입력 : 여러 개 / 출력 : 숫자 하나</p>
</li>
</ul>
<h2 id="다변수-스칼라함수의-함숫값이-고정되어-있다면">다변수 스칼라함수의 함숫값이 고정되어 있다면?</h2>
<p><img src="https://velog.velcdn.com/images/data_buddha/post/6d923fb6-09b0-4c0d-8c8d-21ab6c23d63c/image.png" alt="">
<img src="https://velog.velcdn.com/images/data_buddha/post/b81397fc-5639-44eb-9094-eb7f064598e4/image.png" alt=""></p>
<ul>
<li><p>2차원에서 정의된 함수가 있고, 그 높이를 하나의 차원으로 표시한다면 3차원에 어떠한 곡면이 생길 것임</p>
</li>
<li><p>이변수 함수(2차원에서 정의된 함수)의 함숫값을 고정하면, 곡면에 곡선이 그어질 것</p>
</li>
<li><p>그어진 여러 개의 곡선을 등고선 그래프라 하고</p>
</li>
<li><p>경사도 벡터의 방향이 어느 방향인지 이 등고선 그래프를 통해 알 수 있음</p>
<h1 id="다변수-벡터함수">다변수 벡터함수</h1>
</li>
<li><p>대표적인 예 : 인공신경망</p>
</li>
<li><p>인공신경망은 딥러닝 분야의 핵심 모델</p>
</li>
<li><p>좀 복잡한 &quot;다변수 벡터함수&quot;</p>
</li>
<li><p>왜 복잡하냐? 출력이 입력이 되는 과정이 여러 번 반복되는 형태(층이 깊을 경우)</p>
</li>
<li><p>이렇게 &quot;출력이 입력이 되는&quot; 것을 &quot;합성함수&quot;라고 함</p>
</li>
</ul>
<h1 id="합성함수">합성함수</h1>
<ul>
<li><p>머신러닝의 궁극적인 목적은 입력에 대해서 좋은 출력을 만들어 내는 모델을 만드는 것</p>
</li>
<li><p>그렇기 때문에 간단한 하나의 함수로는 표현할 수 없음 -&gt; &quot;합성함수&quot; 사용</p>
</li>
<li><p>어떤 두 함수 f와 g가 있을 때, 함수 f가 집합 X의 원소 x를 집합 Y의 원소 y로 대응시키고, 함수 g가 y를 집합 Z의 원소 z로 대응시킬 때, x를 z로 대응시키는 함수를 &quot;합성함수&quot;라 표현함</p>
</li>
<li><p>로그함수의 특징 : 원래 함수의 오목, 볼록한 위치(정의역)를 변화시키지 않음 -&gt; 확률을 기반으로 하는 머신러닝 과정에서 중요하게 사용되는 특징</p>
</li>
</ul>
<h1 id="소프트맥스-함수">소프트맥스 함수</h1>
<ul>
<li><p>대표적인 &quot;다변수 벡터함수&quot;</p>
</li>
<li><p>동일한 분모에 대해서 각 요소가 차지하는 비율이므로, 결과를 모두 더하면 1이 됨</p>
</li>
<li><p>이와 같은 특징으로 소프트맥스의 출력도 확률로 해석</p>
</li>
<li><p>다중분류문제에서 마지막 출력단을 소프트맥스 함수로 설정</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[기초수학] 2장. 함수 : 세상의 모든 것을 입력과 출력으로 바라보기]]></title>
            <link>https://velog.io/@data_buddha/%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%99-2%EC%9E%A5.-%ED%95%A8%EC%88%98-%EC%84%B8%EC%83%81%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83%EC%9D%84-%EC%9E%85%EB%A0%A5%EA%B3%BC-%EC%B6%9C%EB%A0%A5%EC%9C%BC%EB%A1%9C-%EB%B0%94%EB%9D%BC%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@data_buddha/%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%99-2%EC%9E%A5.-%ED%95%A8%EC%88%98-%EC%84%B8%EC%83%81%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83%EC%9D%84-%EC%9E%85%EB%A0%A5%EA%B3%BC-%EC%B6%9C%EB%A0%A5%EC%9C%BC%EB%A1%9C-%EB%B0%94%EB%9D%BC%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Mon, 09 Oct 2023 07:34:33 GMT</pubDate>
            <description><![CDATA[<h1 id="함수를-공부하기-위한-기초체력">함수를 공부하기 위한 기초체력</h1>
<h2 id="수-체계">수 체계</h2>
<ul>
<li><p>자연수 : 자연수란 사물을 셀 때나 순서를 매길 때 사용하는 수</p>
</li>
<li><p>정수 : 자연수에 0과 음수를 더한 것</p>
</li>
<li><p>유리수 : 유리수는 분자, 분모로 정수를 갖는 분수로 나타낼 수 있는 수</p>
</li>
<li><p>무리수 : ratio가 없는 수, 즉 비율로 표현되지 않는 수를 의미 ex) $\pi$</p>
</li>
<li><p>실수 : 무리수 + 유리수, 우리가 수직선을 그었을 때 그 수직선 위에 있는 모든 수</p>
</li>
</ul>
<h2 id="함수의-정의">함수의 정의</h2>
<ul>
<li><p>함수란 입력과 출력의 관계를 나타내는 것</p>
</li>
<li><p>정의 : &quot;공집합이 아닌 두 집합 $X, Y$에서 <strong>$X$의 각 원소에 $Y$의 원소가 오직 하나씩 대응</strong>할 때 이 대응 $f$를 $X$에서 $Y$로의 함수&quot;</p>
</li>
<li><p>머신러닝에서 데이터는 X의 원소와 Y의 원소를 의미</p>
</li>
<li><p>지도학습이 하는 일은 그 데이터를 이용해서 왼쪽과 오른쪽의 연결관계를 찾아내는 것</p>
</li>
</ul>
<h2 id="입력과-출력의-관계를-설명하는-그래프">입력과 출력의 관계를 설명하는 그래프</h2>
<ul>
<li><p>함수를 직교 좌표계가 아닌 밝기 그래프로 표현 가능</p>
</li>
<li><p>독립변수가 많아지면 밝기 그래프로 표현하는 것이 유리</p>
</li>
</ul>
<h2 id="합의-기호">합의 기호</h2>
<ul>
<li><p>$\sum$의 특징</p>
</li>
<li><p>$\sum_{i=1}^m\sum_{j=1}^na_ib_j = \sum_{i=1}^ma_i\sum_{j=1}^nb_j$</p>
</li>
<li><p>복잡한 시그마 기호가 등장하면 인덱스를 자세히 보고 어떤 인덱스가 어떤 시그마 기호게 영향을 받는지 살펴봐야 함</p>
</li>
</ul>
<h1 id="다항함수">다항함수</h1>
<ul>
<li>함수를 도구로 사용하여 현상을 설명할 수 있도록 하는 작업을 <strong>모델링</strong>이라고 함</li>
</ul>
<h1 id="지수함수">지수함수</h1>
<h2 id="거듭제곱근">거듭제곱근</h2>
<ul>
<li><p>어떤 수 x를 n번 곱했을 때, a가 되었다면 다시말해 $x^n=a$라면, 이때 a에 대한 n 제곱근은 x임</p>
</li>
<li><p>8의 세제곱근 = &quot;어떤 수를 3번 곱해야 8이냐?&quot;</p>
</li>
<li><p>지수함수는 매우 빠르게 증가하는 특징이 있음</p>
</li>
</ul>
<h2 id="자연상수-e">자연상수 $e$</h2>
<ul>
<li><p>지수함수의 밑으로 자주 쓰이고 대표적인 무리수</p>
</li>
<li><p>$\lim_{x \rightarrow \infty}(1+\frac{1}{x})^x = e$ or $\lim_{x \rightarrow 0}(1+x)^\frac{1}{x} = e$</p>
</li>
</ul>
<h1 id="로그함수">로그함수</h1>
<ul>
<li><p>$y = log_ax$</p>
</li>
<li><p>a를 y번 제곱하면 x가 되는 꼴</p>
</li>
<li><p>a를 밑, x를 진수라고 함</p>
</li>
<li><p>$log_aMN = log_aM + log_aN$ / $log_a\frac{M}{N} = log_aM - log_aN$  (O)</p>
</li>
<li><p>$log_aM log_aN = log_aM + log_aN$ / $\frac{log_aM}{log_bN} = log_aM - log_aN$ (X)</p>
</li>
</ul>
<h2 id="역함수">역함수</h2>
<ul>
<li><p>y = f(x)인 함수에서 입력과 출력이 뒤바뀐 경우를 생각해 볼 수 있음</p>
</li>
<li><p>이 함수를 g라고 하면 x = g(y)라는 말. 이때 g를 f의 역함수라고 함</p>
</li>
<li><p>보통 독립변수를 x로 쓰는 관행이 있으므로 y = g(x)라고 표현</p>
</li>
<li><p>$f^{-1}$라고 표현</p>
</li>
<li><p>그러나 원래의 함수가 일대일 대응일 때만 역함수가 존재, 일대일 대응이 아니라면 역함수에서 함수의 조건을 만족하지 못함</p>
</li>
<li><p>지수함수의 역함수 = 로그함수</p>
</li>
<li><p>밑이 1보다 큰 로그함수의 그래프는 매우 완만하게 증가</p>
</li>
</ul>
<h1 id="자주-만나는-특별한-함수--로지스틱-시그모이드-함수">자주 만나는 특별한 함수 : 로지스틱 시그모이드 함수</h1>
<ul>
<li>$\sigma(z) = \frac{1}{1+e^{-z}}$</li>
</ul>
<p><img src="https://velog.velcdn.com/images/data_buddha/post/9bd3de1a-1b25-4c2c-9031-337da1a143e8/image.png" alt=""></p>
<ul>
<li><p>그래프를 보면 정의역은 실수 전체, 함숫값은 0에서 1사이</p>
</li>
<li><p>즉 어떤 값이 입력되더라도 0에서 1사이의 값을 출력한다는 의미</p>
</li>
<li><p>따라서 출력값을 확률로 해석 가능</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[이렇게 쉬운 통계학] 5장 표본을 이용하여 모집단의 특징 추정하기]]></title>
            <link>https://velog.io/@data_buddha/%EC%9D%B4%EB%A0%87%EA%B2%8C-%EC%89%AC%EC%9A%B4-%ED%86%B5%EA%B3%84%ED%95%99-5%EC%9E%A5-%ED%91%9C%EB%B3%B8%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EB%AA%A8%EC%A7%91%EB%8B%A8%EC%9D%98-%ED%8A%B9%EC%A7%95-%EC%B6%94%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@data_buddha/%EC%9D%B4%EB%A0%87%EA%B2%8C-%EC%89%AC%EC%9A%B4-%ED%86%B5%EA%B3%84%ED%95%99-5%EC%9E%A5-%ED%91%9C%EB%B3%B8%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EB%AA%A8%EC%A7%91%EB%8B%A8%EC%9D%98-%ED%8A%B9%EC%A7%95-%EC%B6%94%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 09 Oct 2023 05:46:52 GMT</pubDate>
            <description><![CDATA[<h1 id="1-표본을-이용하여-모집단의-특징-추정">1. 표본을 이용하여 모집단의 특징 추정</h1>
<ul>
<li>추측통계학을 이루는 두 기둥 &quot;추정&quot;과 &quot;가설검정&quot;</li>
<li>무엇을 추정하냐? 모집단의 평균, 분산, 비율(시청률과 비슷함)</li>
<li>추정의 순서는 &quot;모집단의 평균을 추정하는 방법&quot;만 알면 모두 비슷함</li>
<li>정규분포, $t$분포, $\chi^2$분포 사용함.</li>
<li><strong>중심극한정리</strong> : 모집단의 평균을 추정하는 추측통계학의 근거가 되는 중요한 정리</li>
</ul>
<h1 id="2-통계학-용어정리">2. 통계학 용어정리</h1>
<ul>
<li>모평균($\mu$), 모분산($\sigma^2$), 모표준편차($\sigma$)</li>
<li>위의 모집단의 값들은 &quot;통계량&quot;이라 부르지 않음</li>
<li>일반적으로 평균, 분산, 표준편차는 모집단의 값들을 의미</li>
<li>표본평균($\overline{X}, \overline{x}$), 표본분산($s^2$), 표본표준편차($s, u$), 불편분산($u^2$)</li>
<li>위의 표본들의 값들은 &quot;통계량&quot;이라 부름</li>
<li>불편분산 : &quot;분산&quot;과 다르게 (데이터의 개수 - 1)로 나눔, &quot;표본분산&quot;은 (데이터의 개수)로 나눔</li>
<li>왜 불편분산 필요함?(왜 (데이터의 개수 - 1)로 나눔?)<ul>
<li>우리의 목적은 표본평균, 표본분산을 아는 것이 아니라 결과적으로 모집단의 평균과 분산을 추정하는 것<ul>
<li>&quot;표본분산&quot;을 통해 모분산을 추정하면 모분산보다 작음</li>
<li>&quot;불편분산&quot;을 통해 모분산을 추정하면 모분산과 같음</li>
</ul>
</li>
</ul>
</li>
<li>이런 의미에서 &quot;표본평균&quot;과 &quot;불편분산&quot;은 &quot;추정값&quot;이 되지만,</li>
<li>표본분산은 모집단의 값을 정확히 추정할 수 없으므로 &quot;추정값&quot;이 될 수 없음</li>
</ul>
<h1 id="3-점-추정은-맞을-수도-틀릴-수도-있다">3. &quot;점 추정&quot;은 맞을 수도 틀릴 수도 있다?</h1>
<ul>
<li>표본의 평균이 그대로 모집단의 평균일 것 이다 =&gt; &quot;점 추정&quot;</li>
<li>점 추정과 달리 일정한 폭과 구간을 추정하는 방법 =&gt; &quot;구간 추정&quot;</li>
<li>&quot;구간 추정&quot;을 위해 <strong>중심극한정리</strong>가 필요</li>
</ul>
<h1 id="4-평균값의-평균분포와-중심극한정리">4. &quot;평균값의 평균&quot;분포와 중심극한정리</h1>
<ul>
<li>$\overline{X}$ = $\mu$의 경우, 즉 &quot;점 추정&quot;의 경우는 매우 찾아보기 힘듦</li>
<li>과수원에서 10개씩의 사과를 추출해 그 표본의 평균을 측정하면 매번 다를 것</li>
<li>아마 $\overline{X}$의 분포는 &quot;정규분포&quot;를 따를 것</li>
<li>&quot;표본평균($\overline{X}$)의 분포&quot;의 특징은 다음과 같음</li>
</ul>
<blockquote>
<ol>
<li>&quot;표본평균($\overline{X}$)의 분포&quot;의 평균은 모집단의 평균($\mu$)와 일치</li>
<li>&quot;표본평균($\overline{X}$)의 분포&quot;의 분산은 $\frac{\sigma^2}{n}$ (표준편차는 $\frac{\sigma}{\sqrt{n}}$) ($\mu$는 모집단의 표준편차)</li>
<li>모집단의 분포가 어떠하든 표본 수n이 커질수록 &quot;표본평균($\overline{X}$)의 분포&quot;는 &quot;정규분포&quot;에 가까워짐</li>
</ol>
</blockquote>
<ul>
<li>위 3가지 내용이 바로 <strong>중심극한정리</strong>
<img src="https://velog.velcdn.com/images/data_buddha/post/6e1cac52-7114-4f34-bf48-d85612a699e0/image.png" alt=""></li>
</ul>
<h1 id="5-구간으로-나타내는-구간추정">5. 구간으로 나타내는 &quot;구간추정&quot;</h1>
<ul>
<li>&quot;점 추정&quot; : 표본평균이 모평균이다!</li>
<li>&quot;구간 추정&quot; : 95%의 확률로 모평균이 5,500원 ~ 8,000원 사이에 있을 것이다!</li>
<li>즉, <strong>일정확률</strong>과 <strong>구간으로 추정</strong>하는 것이 <strong>구간 추정</strong></li>
<li>구간 추정에서는 중심극한정리 3번을 이용,</li>
<li>모집단의 분포가 어떠하든 표본 수n이 커질수록 &quot;표본평균($\overline{X}$)의 분포&quot;는 &quot;정규분포&quot;에 가까워짐 -&gt; 이 말인 즉, <strong>모집단이 &quot;정규분포&quot;임을 알고있다면 표본 수는 상관없다 (즉, 표본 수가 적어도 된다)</strong>
<img src="https://velog.velcdn.com/images/data_buddha/post/51f34205-cc74-445d-a6a1-0c6d9c82d77a/image.png" alt=""></li>
</ul>
<h1 id="6-표본-수가-많아지면-어떻게-달라질까">6. 표본 수가 많아지면 어떻게 달라질까?</h1>
<p><img src="https://velog.velcdn.com/images/data_buddha/post/f233f777-1790-41ba-a073-905b35793450/image.png" alt=""></p>
<h1 id="7-99-신뢰도-일-때의-구간-추정">7. 99% 신뢰도 일 때의, 구간 추정</h1>
<p><img src="https://velog.velcdn.com/images/data_buddha/post/005d92ae-adb5-498d-9902-2e1f828a976b/image.png" alt=""></p>
<h1 id="8-t분포-chi2분포">8. $t$분포, $\chi^2$분포</h1>
<p><img src="https://velog.velcdn.com/images/data_buddha/post/e6c04d6f-3e2c-4b17-b7f1-665913aad9ae/image.png" alt=""></p>
<h1 id="9-시청률모비율은-어떻게-추정할까">9. 시청률(모비율)은 어떻게 추정할까?</h1>
<p><img src="https://velog.velcdn.com/images/data_buddha/post/d8e9f569-caf1-493e-af0e-a3eb098f2a4e/image.png" alt="">
<img src="https://velog.velcdn.com/images/data_buddha/post/69c9d653-384c-42b7-83c0-c547a4e80abc/image.png" alt=""></p>
<h1 id="10-설문조사-응답-수는-얼마가-적당할까">10. 설문조사 응답 수는 얼마가 적당할까?</h1>
<ul>
<li><p>설문조사 시 가장 신경쓰이는 것 : &quot;응답 수에 따른 신뢰도는 어느정도 될까?&quot;</p>
</li>
<li><p>이를 위해선 시청률의 &quot;표본오차&quot; 사용</p>
</li>
<li><p>ex) X국가에 1,000만 가구가 있고 1,000가구 대상으로 시청률 조사 / Y국가는 6,000만 가구가 있고, 1,200가구 대상으로 시청률 조사 / 어느쪽이 오차가 더 작을까?</p>
</li>
<li><p>감각적으로 X는 1만 가구 당 1가구 / Y는 5만 가구 당 1가구 이므로 X가 더 작아보이지만 실제로 계산하면 Y국가의 오차가 더 작음</p>
</li>
</ul>
<blockquote>
</blockquote>
<p>$-1.96\times\sqrt{\frac{p(1-p)}{n}}\le표본오차\le1.96\times\sqrt{\frac{p(1-p)}{n}}
$</p>
<blockquote>
</blockquote>
<ul>
<li><p>위 식을 살펴보면 n(조사한 가구 수)와 p(시청률)만 변함</p>
</li>
<li><p>즉, 뉴질랜드 133만 가구, 일본 5100만 가구, 중국 2억 7000만 가구와 같은 모집단의 개수와 상관없이 <strong>오차는 &quot;조사한 가구 수&quot;(표본 수)의 크기에 따라 결정</strong></p>
</li>
<li><p>표본이 크면 오차가 작아짐</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ML] 적절한 스케일링 방법]]></title>
            <link>https://velog.io/@data_buddha/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%A0%81%EC%A0%88%ED%95%9C-%EC%8A%A4%EC%BC%80%EC%9D%BC%EB%A7%81-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@data_buddha/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EC%A0%81%EC%A0%88%ED%95%9C-%EC%8A%A4%EC%BC%80%EC%9D%BC%EB%A7%81-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Sat, 07 Oct 2023 06:35:22 GMT</pubDate>
            <description><![CDATA[<p>우선, 표준화와 정규화를 통칭하여 &#39;스케일링&#39;이라고 표현함</p>
<blockquote>
<p>데이터 컬럼별로 분포를 뽑아서 분포에 맞는 스케일링을 적용하려고 하는데 어떤 분포에 어떤 스케일링이 효과적일까?</p>
</blockquote>
<ul>
<li><p>일반적으로 스케일링은 개별 feature내에서 데이터들이 skew되었거나, 서로 다른 feature들 간 크기의 척도가 극명하게 차이가 날 경우에 적용</p>
</li>
<li><p>하지만 머신러닝 알고리즘이 개선되면서 스케일링의 효과가 생각보다 크지 않음</p>
</li>
<li><p>트리 계열에서는 스케일링의 효과가 미미함</p>
</li>
<li><p>선형 계열(선형회귀, 로지스틱 회귀, SVM, K-nearest)이나 딥러닝 적용할 때 스케일링을 고려</p>
</li>
<li><p>하지만 선형 계열도 스케일링 적용 유무에 따라 성능 향상이 필연적인 것은 아님</p>
</li>
<li><p>즉, <strong>직접 적용해봐야함</strong></p>
</li>
<li><p>그러나 딥러닝은 데이터 스케일링이 필수</p>
</li>
<li><p>딥러닝의 경우, 비교적 큰 값을 가지면 상대적으로 최적화하기 어려운 특성을 가짐</p>
</li>
<li><p>결론적으로, 어떤 분포에 어떤 스케일링을 적용하면 성능이 향상된다는 만능의 방법은 없음</p>
</li>
<li><p>따라서, 적용 전 후 결과로 판단을 해야함</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[이렇게 쉬운 통계학] 4장 정규분포 체감하기]]></title>
            <link>https://velog.io/@data_buddha/%EC%9D%B4%EB%A0%87%EA%B2%8C-%EC%89%AC%EC%9A%B4-%ED%86%B5%EA%B3%84%ED%95%99-4%EC%9E%A5-%EC%A0%95%EA%B7%9C%EB%B6%84%ED%8F%AC-%EC%B2%B4%EA%B0%90%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@data_buddha/%EC%9D%B4%EB%A0%87%EA%B2%8C-%EC%89%AC%EC%9A%B4-%ED%86%B5%EA%B3%84%ED%95%99-4%EC%9E%A5-%EC%A0%95%EA%B7%9C%EB%B6%84%ED%8F%AC-%EC%B2%B4%EA%B0%90%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 02 Oct 2023 12:15:41 GMT</pubDate>
            <description><![CDATA[<h1 id="1-데이터로-도수분포표-만들기">1. 데이터로 도수분포표 만들기</h1>
<ul>
<li>정규분포의 첫걸음은 <strong>히스토그램 만들기</strong></li>
<li>대략적인 순서는<ol>
<li>데이터 : 공공기관 데이터, 회사 등의 매출 데이터</li>
<li>도수분포표 : 원시 데이터를 이용하여 최댓값,최솟값(범위) / 그래프 폭(계급)과 빈도 등을 통해 도수분포표 완성</li>
<li>히스토그램 : 도수분포표를 이용하여 히스토그램 생성, 분포상황을 한눈에 파악</li>
</ol>
</li>
<li>데이터의 구간을 나눔 이를 <strong>계급</strong>이라 함</li>
<li>적정한 계급 수(구간 수)를 구하는 기준은 <strong>스터지스의 법칙</strong></li>
<li>스터지스의 법칙 : 표본이 수를 n이라 했을 때 계급 수 K를 구하는 공식은 $K = log_{2}n$ 임</li>
<li>계급값 : 해당 계급의 한가운데 값</li>
<li>ex) 57.0~59.0 구간에 30개의 데이터가 있다고 한다면 이 계급의 계급값은 58.0, 해당 구간의 데이터를 모두 더하지 않아도 계급값을 통해 30 x 58.0 = 1,740과 같이 대략적인 값을 구할 수 있음</li>
</ul>
<h1 id="2-히스토그램에서-쌍봉형을-발견했다면">2. 히스토그램에서 쌍봉형을 발견했다면?</h1>
<ul>
<li>산(봉)이 2개인 쌍봉형 패턴은 데이터를 재확인 필요
<img src="https://velog.velcdn.com/images/data_buddha/post/4c2e83a0-e61e-4c15-948f-39e32a0c05aa/image.png" alt=""></li>
<li>단봉형이 2개 겹친 것이라면 이치에 맞지만,</li>
<li><strong>서로 다른 데이터의 종류가 섞인 경우가 존재함</strong></li>
<li>ex) 여자의 키와 남자의 키가 섞인 경우</li>
</ul>
<h1 id="3-히스토그램에서-분포곡선으로">3. 히스토그램에서 분포곡선으로</h1>
<ul>
<li>키의 분포 등이라면 좌우 대칭을 이루는 깔끔한 종형 모양의 분포에 가까워질 것, 이를 <strong>정규분포</strong>라고 함
<img src="https://velog.velcdn.com/images/data_buddha/post/f53dc730-445f-48f5-9e4b-c4717a70094b/image.png" alt=""></li>
<li>정규분포는 <strong>평균</strong>과 <strong>분산(표준편차)</strong>로 정해짐</li>
<li>정규분포에서는 &#39;평균에서 얼마나 떨어져 있나?&#39;로 해당 범위에 포함되는 데이터의 비율(확률)이 정해짐</li>
<li>그리고 그 거리 단위로 표준편차를 사용</li>
<li>100개의 데이터로 이루어진 정규분포에선 평균에서 $\pm1\sigma$ 거리에 68개 정도의 데이터가 포함됨</li>
</ul>
<h1 id="4-정규분포-움직이기-①-평균-변경">4. 정규분포 움직이기 ①: 평균 변경</h1>
<ul>
<li>평균이 달라지면 중심축이 달라짐</li>
<li>즉, 평균이 변하면 <strong>정규분포는 좌우로 움직이는 것</strong></li>
<li>평균 = 0, 표준편차 = 1인 정규분포를 <strong>표준정규분포</strong>라고 함</li>
</ul>
<h1 id="5-정규분포-움직이기-②-표준편차-변경">5. 정규분포 움직이기 ②: 표준편차 변경</h1>
<ul>
<li>평균이 다르면 좌우 위치가 바뀌지만 표준편차가 다르면 형태가 달라짐
<img src="https://velog.velcdn.com/images/data_buddha/post/a67aa980-bfb2-46d5-93f7-a6b3b9c4702c/image.png" alt=""></li>
</ul>
<h1 id="6-정규분포로-확률-보기">6. 정규분포로 확률 보기</h1>
<ul>
<li>정규분포곡선에서 &#39;평균+표준편차(혹은 분산)&#39;까지의 범위는 <strong>특정 데이터가 해당 범위에 포함될 확률</strong>을 나타냄</li>
<li>$\pm1\sigma$ 위치는 수학에서 &#39;변곡점&#39;으로 불리는 위치, 곡선 위에서 가장 &#39;기울기가 큰&#39; 지점으로 이 지점을 기준으로 양쪽의 기울기가 작아짐</li>
<li>95% = 1.96시그마 / 99% = 2.58시그마</li>
</ul>
<h1 id="7-관리도를-이용한-품질관리">7. &#39;관리도&#39;를 이용한 품질관리</h1>
<h1 id="8-2개의-서로-다른-정규분포를-1개로">8. 2개의 서로 다른 정규분포를 1개로?</h1>
<ul>
<li>정규분포곡선을 사용하여 그대로는 비교하기 어려운 서로 다른 2개 데이터를 상대적으로 비교할 수 있음</li>
<li>예시를 들면,<ol>
<li>고교생 홍길동 군이 전국모의고사에서 수학 73점, 영어 76점 획득</li>
<li>평균점수는 수학이 60점, 영어가 68점</li>
<li>표준편차는 수학이 8점, 영어가 6점</li>
</ol>
</li>
<li>어느 과목의 성적이 우수할까?
<img src="https://velog.velcdn.com/images/data_buddha/post/691347e4-e17f-4da9-812c-b705c791999f/image.png" alt=""></li>
<li><strong>2개의 그래프를 (한데 모아) 같은 모양</strong>으로 만들면 비교가능</li>
</ul>
<h1 id="9-여러-곳에서-사용할-수-있는-표준정규분포">9. 여러 곳에서 사용할 수 있는 표준정규분포</h1>
<h2 id="표준점수-표준화로-비교할-수-있는-장소-만들기">표준점수, 표준화로 &#39;비교할 수 있는 장소&#39; 만들기</h2>
<ul>
<li>수학 : 점수 - 평균점수 = 73 - 60 = 13점</li>
<li>영어 : 점수 - 평균점수 = 76 - 68 = 8점</li>
<li>이 점수 차를 산포도(표준편차)와 대응시키려면 다음과 같이 생각할 수 있음</li>
<li>&#39;수학의 13점은 표준편차 8점에 대해 13/8 = 1.625에 해당&#39;</li>
<li>&#39;영어의 8점은 표준편차 6점에 대해 8/6 = 1.333에 해당&#39;</li>
<li>여기서 1.625나 1.333을 <strong>표준점수standard score</strong> 또는 <strong>표준화점수</strong>라고 함</li>
<li>원래 데이터에서는 수치가 모두 다르므로 비교하기 어렵지만,</li>
<li>표준점수를 계산함으로써, &#39;표준편차를 1로 했을 때, 홍길동 군의 수학 및 영어 성적은 각각 1.625, 1.333&#39;으로 그 차이를 수치로 비교할 수 있음</li>
<li>즉, &#39;평균과의 차이&#39;를 해당 과목의 표준편차로 나누면 표준점수를 계산할 수 있음</li>
<li>이는 전원의 성적을 &#39;표준점수=1&#39;에 대한 비율로 공통화한 것으로 <strong>표준화</strong>라고 함<h2 id="표준정규분포는-평균0-표준편차1">표준정규분포는 평균=0, 표준편차=1</h2>
</li>
<li>각자의 성적에서 표준점수를 계산하여 표준화했을 때 이를 나타내는 분포는 <strong>&#39;평균 = 0, 표준편차 = 1인 정규분포&#39;</strong>가 됨</li>
<li>무수히 많은 정규분포 중에서도 이러한 특별한 정규분포를 <strong>표준정규분포</strong>라 부름<h2 id="개인의-위치-알기">개인의 위치 알기</h2>
</li>
<li>수학의 표준점수 : 1.625 / 영어의 표준점수 : 1.333</li>
<li>이는 표준정규분포에서 표준편차1의 1.625배, 1.333배의 위치라는 것</li>
<li>표준정규분포표를 통해 %를 알 수 있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[이코테] 정렬]]></title>
            <link>https://velog.io/@data_buddha/%EC%9D%B4%EC%BD%94%ED%85%8C-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@data_buddha/%EC%9D%B4%EC%BD%94%ED%85%8C-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Mon, 02 Oct 2023 06:16:42 GMT</pubDate>
            <description><![CDATA[<h1 id="정렬-알고리즘-개요">정렬 알고리즘 개요</h1>
<ul>
<li>정렬Sorting이란 데이터를 특정한 기준에 따라서 순서대로 나열하는 것</li>
</ul>
<h1 id="선택정렬">선택정렬</h1>
<ul>
<li>가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸고, 그 다음 작은 데이터를 선택해 앞에서 두 번째 데이터와 바꾸는 과정을 반복</li>
<li>매번 가장 작은 데이터를 <strong>선택</strong>한다는 의미에서 선택정렬Selection Sort 알고리즘이라고 함<pre><code class="language-python">array = [7,5,9,0,3,1,6,2,4,8]
</code></pre>
</li>
</ul>
<p>for i in range(len(array)): # len(array) -&gt; 전체 array 탐색
  min_index = i # 제일 작은 원소의 index
  for j in range(i+1, len(array)): # 제일 작은 원소의 index 다음 값부터 끝까지 탐색
    if array[j] &lt; array[min_index]: # index가 j일 때 값이 index가 min_index일 때 보다 작다면
      min_index = j # min_index는 j로
  array[i], array[min_index] = array[min_index], array[i] # 스와프 (순서바꿔주기)</p>
<p>print(array)  </p>
<pre><code>
# 삽입정렬
- 데이터를 하나씩 확인하며, 각 데이터를 적절한 위치에 삽입하는 것
- 구현 난이도 : 삽입정렬 &gt; 선택정렬
- 시간 효율성 : 삽입정렬 &gt; 선택정렬
- 선택정렬은 무조건 모든 원소를 비교하고 위치를 바꿈
- 삽입정렬은 필요할 때만 위치를 바꾸므로 **데이터가 거의 정렬되어 있을 때** 효율적
- 특정한 데이터를 적절한 위치에 **삽입**한다고 하여 삽입정렬Insertion Sort라고 함
- 삽입정렬은 특정한 데이터가 적절한 위치에 들어가기 이전에, 그 앞까지의 데이터는 이미 정렬되어 있다고 가정
```python
array = [7,5,9,0,3,1,6,2,4,8]

for i in range(1, len(array)): # 1부터 시작하는 이유는 j-1 때문,
                               #0부터 시작하면 하단의 반복문에서 array[-1] 생성
  for j in range(i, 0 , -1):
    if array[j] &lt; array[j-1]: # 현재 원소가 전의 원소보다 작으면
      array[j], array[j-1] = array[j-1], array[j] # 스와프
    else: # 아닐 경우 즉, 자기보다 작은 데이터를 만나면 그 위치에서 멈춤
      break
print(array)</code></pre><h1 id="퀵-정렬">퀵 정렬</h1>
<ul>
<li>기준 데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸는 것</li>
<li>퀵 정렬에서는 <strong>피벗pivot</strong>이 사용</li>
<li>큰 숫자와 작은 숫자를 교환할 때, 교환하기 위한 &#39;기준&#39;을 바로 &#39;피벗&#39;이라 함</li>
<li>퀵 정렬을 수행하기 전에는 피벗을 어떻게 설정할 것인지 미리 명시해야 함</li>
<li>피벗을 설정하고 리스트를 분할하는 방법에 따라서 여러가지 방식으로 퀵 정렬을 구분</li>
<li>해당 내용에선 &#39;호어분할&#39;방식을 기준으로</li>
<li>&#39;호어분할&#39;방식 : 리스트에서 첫 번째 데이터를 피벗으로 정함</li>
<li>퀵 정렬을 3개의 파트로 살펴보자<ol>
<li>리스트의 첫 번째 데이터를 피벗으로 설정 -&gt; 왼쪽(피벗 다음 원소)에서부터 피벗보다 큰 데이터를 선택 -&gt; 오른쪽(리스트 제일 마지막 원소)에서부터 피벗보다 작은 데이터를 선택 -&gt; 두 데이터의 위치를 변경<ol start="2">
<li>왼쪽에서 찾는 값과 오른쪽에서 찾는 값의 위치가 엇갈린 경우 -&gt; <strong>작은 데이터</strong>와 <strong>피벗</strong>의 위치를 변경</li>
</ol>
</li>
<li>1번과 2번의 과정을 완료한 후, 피벗의 왼쪽에는 피벗보다 작은 데이터가 위치, 피벗의 오른쪽에는 피벗보다 큰 데이터가 위치함</li>
</ol>
</li>
<li>&#39;재귀함수&#39;와 동작원리가 같음</li>
<li>따라서, 종료조건도 있어야 함. 퀵 정렬의 종료조건은 <strong>현재 리스트의 데이터 개수가 1인 경우</strong><pre><code class="language-python">array = [5,7,9,0,3,1,6,2,4,8]
</code></pre>
</li>
</ul>
<p>def quick_sort(array):
  if len(array) &lt;= 1: # 리스트가 1개 이하의 원소를 담고 있는 경우 종료
    return array</p>
<p>  pivot = array[0] # &#39;호어분할&#39; : 피벗은 리스트의 첫 번째 원소
  tail = array[1:] # 피벗을 제외한 나머지 원소</p>
<p>  left_side = [x for x in tail if x &lt;= pivot] # 피벗보다 작은 경우, 왼쪽으로
  right_side = [x for x in tail if x &gt; pivot] # 피벗보다 큰 경우 오른쪽으로</p>
<h1 id="분할-이후-왼쪽과-오른쪽에서-각각-퀵-정렬-수행-피벗-리스트로-감싸기">분할 이후, 왼쪽과 오른쪽에서 각각 퀵 정렬 수행 (피벗 리스트로 감싸기!)</h1>
<p>  return quick_sort(left_side) + [pivot] + quick_sort(right_side)</p>
<p>print(quick_sort(array))</p>
<pre><code>
# 계수정렬
- 계수정렬Count Sort알고리즘은 특정한 조건이 부합할 때만 사용할 수 있지만 매우 빠른 정렬 알고리즘
- 특정조건 : &#39;데이터의 크기 범위가 제한되어 정수 형태로 표현할 수 있을 때&#39;
- ex) 0이상 100이하 성적 데이터, 가장 큰 데이터와 가장 작은 데이터의 차이가 1,000,000을 넘지 않을 때
- 이러한 특징을 가지는 이유는, 계수정렬은 **모든 범위를 담을 수 있는 크기의 리스트(배열)를 선언**해야하기 때문
- 주어진 리스트가 &quot;7 5 9 0 3 1 6 2 9 1 4 8 0 5 2&quot;라고 할 때,
- 먼저 가장 큰 데이터와 가장 작은 데이터의 범위가 모두 담길 수 있도록 하나의 리스트를 생성
- 현재 예시에서는 가장 큰 데이터가 &#39;9&#39;, 가장 작은 데이터가 &#39;0&#39;
- 따라서 정렬할 데이터의 범위는 0부터 9까지이므로 리스트의 인덱스가 모든 범위를 포함할 수 있도록 크기가 10인(0~9) 리스트를 선언
- 그 다음 데이터를 하나씩 확인하며 데이터의 값과 동일한 인덱스의 데이터를 1씩 증가시킴
```python
array = [7,5,9,0,3,1,6,2,9,1,4,8,0,5,2]

count = [0] * (max(array) + 1) # 모든 범위 포함하는 리스트 선언 0으로 초기화

for i in range(len(array)): # 각 데이터에 해당하는 인덱스 값 증가
  count[array[i]] += 1

for i in range(len(count)): # 출력단
  for j in range(count[i]): # 해당 인덱스의 값만큼 반복 출력
    print(i, end=&#39; &#39;)</code></pre><h1 id="파이썬의-정렬-라이브러리">파이썬의 정렬 라이브러리</h1>
<ul>
<li>sorted() : 변환되는 결과는 <strong>리스트 자료형</strong><pre><code class="language-python">array = [7,5,9,0,3,1,6,2,4,8]
</code></pre>
</li>
</ul>
<p>result = sorted(array)
print(result)</p>
<pre><code>- sort() : 별도의 정렬된 리스트가 반환되지 않고 내부 원소가 바로 정렬
```python
array = [7,5,9,0,3,1,6,2,4,8]

array.sort()
print(array)</code></pre><ul>
<li>key 매개변수를 입력으로 받을 수 있음</li>
<li>key 값으로는 하나의 함수가 들어가야 하며 이는 정렬 기준이 됨<pre><code class="language-python">array = [(&#39;바나나&#39;, 2), (&#39;사과&#39;, 5), (&#39;당근&#39;, 3)]
</code></pre>
</li>
</ul>
<p>def setting(data):
  return data[1]</p>
<p>result = sorted(array, key = setting)
print(result)</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[기초수학] 1장. 머신러닝과 선형회귀]]></title>
            <link>https://velog.io/@data_buddha/%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%99-1%EC%9E%A5.-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EA%B3%BC-%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80</link>
            <guid>https://velog.io/@data_buddha/%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%99-1%EC%9E%A5.-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%EA%B3%BC-%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80</guid>
            <pubDate>Sun, 01 Oct 2023 04:41:00 GMT</pubDate>
            <description><![CDATA[<h1 id="머신러닝이란">머신러닝이란?</h1>
<ul>
<li>작업&amp;평가를 반복하면서 결과를 개선하는 것</li>
</ul>
<pre><code class="language-python">D1 = np.array([[1.0, 1.2, 3, 4, 5, 6], # x좌표
              [1.7, 3, 2.3, 5.3, 3.8, 5.5]]) # y좌표

D2 = np.array([[-0.6, 1.0, 1.2, 3, 4, 5, 6], # x좌표
              [2.9, 1.7, 3, 2.3, 5.3, 3.8, 5.5]]) # y좌표</code></pre>
<ul>
<li><p>위와 같은 두 2차원 어레이 2개가 있다고 한다면</p>
</li>
<li><p>좌표평면 상에 다음과 같이 나타낼 수 있음</p>
</li>
<li><p>좌표평면 상의 점들과 가장 &#39;친한&#39; 선을 그리고자 한다면,</p>
</li>
<li><p>누군가는</p>
<ol>
<li>여러번의 시도를 통해 그릴 수 있고</li>
<li>매우 똑똑하여 왼쪽 첫점과 오른쪽 끝점을 연결할 수 있음</li>
</ol>
</li>
<li><p>또한, 머신러닝은 어떻게 선을 그릴까?</p>
<pre><code class="language-python">def machine_learning(D): # 노멀방정식을 통한 머신러닝 풀이
N = D.shape[1] # N은 데이터의 갯수 (D의 shape를 떠올려보자)
X = np.c_[np.ones(N), D[0]] # 1열에는 숫자1을 가지고, 2열에는 데이터의 x좌표를 갖는 2차원 어레이 생성, Nx2
y = D[1] # y 좌표

w = np.linalg.solve(np.dot(X.T, X), np.dot(X.T, y)) # 노멀 방정식을 통한 직선의 계수 구하기
return w
</code></pre>
</li>
</ul>
<p>def more_clever(D): # 위에서 제시한 2번과 같은 방법
  first, last = D[:,0], D[:,-1] # 첫점과 끝점</p>
<p>  w1 = (last[1]-first[1])/(last[0]-first[0]) # 기울기 : y증가량/x증가량
  w0 = -w1*first[0] + first[1] # 절편 구하는 식</p>
<p>  return (w0,w1)</p>
<p>def f(x,w): # 직선을 그리기 위해 입력 x와 계수 w를 입력받는 함수 정의
  return w[1]*x + w[0] # 보통 직선의 방정식을 y=ax+b로 표현하지만
                         # 여기서는 a 대신 w[1]을, b 대신 w[0]을 사용</p>
<pre><code>![](https://velog.velcdn.com/images/data_buddha/post/e03273d3-9019-4b1f-8087-b848610e1222/image.png)
- 위에서 제시한 2번과 같은 방법(똑똑한 경우)로 오른쪽 데이터에 적용 시, 머신러닝보다 덜 친한 직선을 그리게 됨
- 따라서 **머신러닝이 규칙기반 알고리즘보다 데이터에 대한 강인함과 범용성에 있어서 더 뛰어난 것을 알 수 있음**

# 입력과 출력의 관계
- 위 직선의 의미를 생각해보면 전체 데이터에 대해 입력-출력 관계를 설명할 수 있음
- 데이터로부터 획득된 직선을 가지고 있으면 입력-출력 관계가 없던 새로운 입력 값에 대한 출력도 계산할 수 있게 됨
- 즉, 데이터로부터 입력과 출력 관계를 찾아내고 이를 통해 **예측**까지 하는 것

# 수학이 사용되는 순간
- 위에서 제시한 1번과 같은 과정을 컴픁에게 시키기 위해선 단계마다 복잡한 과정을 거쳐야 함
- 선과 점이 떨어진 정도를 계산해야 하기에 여러 수학 개념이 필요

&gt;- $point = \left(x,y\right)$ # 좌표라는 개념이 필요
- $h = ax + b$ # 직선을 수식으로
- 위의 수식을 다음과 같이 생각할 수 있음 $h = ax + b * 1$
- 입력 $(x,1)$에 적당한 수 $a,b$를 곱해서 결과를 만들어 낸다고 생각할 수 있음
- 입력 : $(x,1)$
  출력 : $ax + b * 1$
- 머신 러닝에서는 입력에 곱하는 $a,b$를 가중치weight로 자주 이야기함
- 같은 가중치 이기 때문에 벡터로 표현하며
- $h(x,\mathbf{w})=w_{1}x+w_{0}*1$ 로 표시할 수 있음
- 직선의 모양은 $w_{1}$,$w_{0}$에 의해 변하므로
- 직선을 그린다는 행동이 $w_{1}$,$w_{0}$을 결정한다는 수치적 과정으로 모델링 된 것
&gt;

- 그렇다면 컴퓨터는 점과 **친한** 선을 그리기 위해 어떻게 이동시킬까?
- 선과 점들 사이의 수직 거리로 친함의 정도를 나타낸다면
![](https://velog.velcdn.com/images/data_buddha/post/986ad6d3-9335-4941-b8ca-4a7a71158a41/image.png)
- 다음과 같은 그림을 파악할 수 있고
- 이 수직 거리를 모두 더한 총합을 손실loss라고 하며
&gt;
$L = \frac{1}{2} \sum_{n=1}^N \left\{ h(x_n, \mathbf{w}) - y_n \right\}^2$
- 손실은 점과 선이 친하지 않은 정도
- 따라서 손실을 줄이는 방향으로 $w_{1}$,$w_{0}$을 바꿔야 함
- 하지만, $w_{1}$,$w_{0}$을 잘못 바꾸면 오히려 손실 증가할 수 있음
- 그래서 우리는 손실이 감소하도록 $w_{1}$,$w_{0}$을 바꿀 수 있게 해주는 **안전장치** 필요
- 그것이 바로, **경사도 벡터**
&gt;
$\triangledown_{\mathbf{w}}L = \frac{\partial }{\partial \mathbf{w}}\left(\frac{1}{2} \sum_{n=1}^N \left\{ h(x_n, \mathbf{w}) - y_n \right\}^2\right)$
&gt;
- 위의 식을 통해 $\mathbf{w}$를 변경 시킬 수 있고, 그렇게 변경하면 절대 $L$이 커지지 않음
&gt;
$\mathbf{w}\leftarrow \mathbf{w}-\eta\frac{\partial }{\partial \mathbf{w}}\left(\frac{1}{2} \sum_{n=1}^N \left\{ h(x_n, \mathbf{w}) - y_n \right\}^2\right)$
&gt;
- 위와 같이 $\mathbf{w}$를 업데이트 시킴
- 위의 과정을 코드로 표현하면 다음과 같음
```python
num_iters = 150
alpha = 0.02

np.random.seed(2)
w = np.random.randn(2)
N = D1.shape[1] 

ws, L = [], []

# 1열에 1, 2열에 데이터의 x좌표를 가지는 행렬을 만듭니다.
# X: (N,2), y: (N,)
X = np.c_[np.ones(N), D1[0]]
y = D1[1]

# 여기서 우리의 경험 E를 반복하면서 태스크 T를 개선해 나간다.
for i in range(num_iters) :
    # grad L
    c = (1/N) * np.dot(X.T, np.dot(X, w) - y) 
    # 안전장치 grad L을 이용해서 w를 수정한다.
    w -= alpha * c 
    # w가 변화되는 과정을 저장해둔다.
    ws.append(w)

    # 손실을 계산한다.
    L.append( ((np.dot(X, w) - y)**2).sum()/(2*N) )</code></pre><p> <img src="https://velog.velcdn.com/images/data_buddha/post/de71f23e-1d53-41f2-b8fa-fc1bdca6187d/image.png" alt=""></p>
<h1 id="머신러닝의-분류">머신러닝의 분류</h1>
<ul>
<li>지도학습 : 입력과 출력이 있을 때, 이것들 사이의 관계를 찾아내는 과정
  ex) 분류, 회귀</li>
<li>비지도학습 : 입력과 출력이 쌍으로 주어지지 않고 입력만 사용해서 의미있는 결과를 이끌어 내는 과정
  ex) 군집화, 차원축소</li>
<li>선찾기 작업은 주어진 점들이 보여주는 분포에서 평균을 찾는 과정으로 해석할 수 있음</li>
<li>점들이 특정 분포에서 발생했다고 가정하면 이런 점들은 평균으로 회귀하는 성질이 있음</li>
<li>따라서 점들이 회귀regression하고자 하는 평균선을 찾는다고 해서 회귀라는 용어 사용</li>
</ul>
<h1 id="왜-선형회귀를-배울까">왜 선형회귀를 배울까?</h1>
<ul>
<li>비지도 학습의 k-최근접 이웃은 입력-출력 관계를 찾지않고 주어진 데이터를 그대로 이용함</li>
<li>선형회귀의 경우 입력-출력이 가질 것 같은 직선관계를 잘 표현하고 있음</li>
<li>위 두 모델의 차이점은, 모델을 설정하는냐 하지 않느냐의 차이</li>
<li>선긋기 예제에서 우리는 직선이라는 모델을 선택하였고, k-최근접 이웃은 그냥 주어진 데이터 기반으로 결과를 만들어 냄</li>
<li>선형회귀는 $w_{1}$,$w_{0}$이라는 분명하게 알고리즘이 결정하는 요소들이 있음</li>
<li>우리는 모델을 설정하고 관계를 찾는 알고리즘이며, 선형회귀는 그런 알고리즘의 출발점이라고 할 수 있음</li>
<li>분류를 위한 가장 기본적인 알고리즘은 &#39;로지스틱 회귀&#39;</li>
<li>선형회귀 출력단에 s자형 함수를 추가한 것이 로지스틱 회귀임을.. 또 이것들이 모여 &#39;다층 퍼셉트론&#39;까지 이어지는 흐름을 본다면 선형회귀가 딥러닝으로 가는 시발점이기에 선형회귀를 완전히 구현하고 이해하는 것이 필요</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[이렇게 쉬운 통계학] 3장 평균과 분산 이해하기]]></title>
            <link>https://velog.io/@data_buddha/%EC%9D%B4%EB%A0%87%EA%B2%8C-%EC%89%AC%EC%9A%B4-%ED%86%B5%EA%B3%84%ED%95%99-3%EC%9E%A5-%ED%8F%89%EA%B7%A0%EA%B3%BC-%EB%B6%84%EC%82%B0-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@data_buddha/%EC%9D%B4%EB%A0%87%EA%B2%8C-%EC%89%AC%EC%9A%B4-%ED%86%B5%EA%B3%84%ED%95%99-3%EC%9E%A5-%ED%8F%89%EA%B7%A0%EA%B3%BC-%EB%B6%84%EC%82%B0-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 30 Sep 2023 07:17:48 GMT</pubDate>
            <description><![CDATA[<h1 id="1-평균은-대푯값의-대표">1. 평균은 대푯값의 대표?</h1>
<ul>
<li>모든 데이터를 나열하여 데이터의 특징을 파악할 수 없음</li>
<li>따라서, 데이터 전체의 특징을 단 하나의 데이터로 나타낼 수 있음. 이를 &#39;대푯값&#39;이라고 함</li>
<li>대푯값에는 &#39;평균&#39;, &#39;중앙값&#39;, &#39;최빈값&#39;이 있음</li>
<li>평균의 아킬레스건 &#39;특잇값Outlier&#39;</li>
<li>평균은 데이터 전체의 중심에 위치하고 이는 큰 수의 영향을 받기 때문</li>
</ul>
<h1 id="2-특잇값에-강한-중앙값">2. 특잇값에 강한 &#39;중앙값&#39;</h1>
<ul>
<li>중앙값 = 강건한Robust 대푯값</li>
<li>중앙값이란 데이터를 작은 순서(또는 큰 순서)로 나열했을 때 &#39;가장 가운데&#39; 위치에 있는 수치</li>
<li>단순히 정렬되어 있는 값에서 중앙에 있는 값을 선정한 것이기에 특잇값에 크게 흔들리지 않음</li>
</ul>
<h1 id="3-가장-많은-데이터가-최빈값">3. 가장 많은 데이터가 &#39;최빈값&#39;</h1>
<ul>
<li>인기투표로 말하자면 가장 표를 많이 받은 사람으로 최빈도값, 모드mode, 유행값 등으로도 표현</li>
<li>연속량 데이터의 경우 클래스를 어떻게 구분하느냐에 따라 최빈값의 클래스가 달라짐</li>
</ul>
<h1 id="4-평균-중앙값-최빈값의-위치관계는">4. 평균, 중앙값, 최빈값의 위치관계는?</h1>
<ul>
<li>데이터가 균형을 이룬 정규분포 형태의 그래프일 경우 평균, 중앙값, 최빈값은 거의 같은 위치에 있음</li>
<li>데이터가 정규분포를 보일 경우 평균을 대푯값으로 사용하는 것이 일반적</li>
<li>평균을 대푯값으로 사용하는 것이 일반적인 이유는 &#39;분산&#39;과의 궁합이 좋기 때문</li>
<li>그래프의 분포가 왼쪽으로 길게 늘어진 경우 &#39;평균&lt;중앙값&lt;최빈값&#39;</li>
<li>그래프의 분포가 오른쪽으로 길게 늘어진 경우 &#39;평균&gt;중앙값&gt;최빈값&#39;</li>
</ul>
<h1 id="5-산포도dispersion을-나타내는-사분위수-상자수염그림">5. 산포도Dispersion을 나타내는 &#39;사분위수, 상자수염그림&#39;</h1>
<ul>
<li>대푯값만으로 데이터의 특성을 온전히 파악 불가능</li>
<li>데이터는 거의 흩어진 상태 -&gt; 흩어짐의 정도 역시 중요한 데이터의 특징</li>
<li>데이터의 최솟값~최댓값 = 범위Range</li>
<li>최솟값에서부터 4분의 1 위치(25%)에 있는 데이터가 &#39;제 1사분위수&#39;</li>
<li>4분의 2위치 데이터가 &#39;제 2사분위수(중앙값)&#39;</li>
<li>4분의 3위치 데이터가 &#39;제 3사분위수&#39;</li>
</ul>
<h1 id="6-평균에서-분산으로">6. 평균에서 &#39;분산&#39;으로</h1>
<ul>
<li>평균을 사용하여 데이터의 산포도를 보는 것이 &#39;분산&#39;</li>
<li>산포도를 나타내는 값 = &#39;분산&#39;</li>
<li>편차 = (각)데이터 - 평균 -&gt; 편차의 총합은 0</li>
<li>각 데이터의 편차를 단순히 더하기만 해서는 쓸모가 없다!</li>
<li>평균편차는 각 데이터의 편차를 &#39;거리&#39;의 개념으로 파악하고 편차에 &#39;절댓값&#39;을 씌운 후 계산 이는, 편차의 합계가 0인 문제를 해결</li>
<li>But, 정규분포표를 사용할 때는 &#39;표준편차(분산)&#39;가 더 편하기 때문에 &#39;표준편차(분산)&#39;을 사용</li>
<li>&#39;제곱하여 더하면 0이 되지 않는다는 아이디어&#39; = &#39;분산&#39;</li>
</ul>
<h1 id="8-분산에서-표준편차로">8. &#39;분산&#39;에서 &#39;표준편차&#39;로</h1>
<ul>
<li><p>분산에는 2가지 단점이 존재</p>
<blockquote>
<ol>
<li>분산값 자체가 너무 큼 : 편차에 제곱을 하기 때문에 &#39;차이를 두드러지게 한다&#39;라고 표현할 수 있겠지만, 실제 각 데이터와 평균과의 차이를 비교하면 뭔가 부족함</li>
<li>단위가 변함 : 키를 나타내는 단위를 m라 하고 이때 분산을 구할 경우 m^2으로 단위가 변하게 됨 즉, 길이가 면적으로 변하게 됨</li>
</ol>
</blockquote>
</li>
<li><p>단위를 무시하고 분산을 사용해도 되지만,</p>
<blockquote>
<ol>
<li>수치가 너무 커지지 않고</li>
<li>단위를 원래로 되돌린 또 하나의 지표를 원함</li>
</ol>
</blockquote>
</li>
<li><p>위의 요구사항을 만족하는 지표가 &#39;표준편차&#39;</p>
</li>
<li><p>$표준편차 = \sqrt{분산}$</p>
</li>
</ul>
<h1 id="9-표준편차-계산하기">9. 표준편차 계산하기</h1>
<ul>
<li>평균 -&gt; 편차 -&gt; 분산 -&gt; 표준편차</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>