<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Keep Coding</title>
    <link>https://jdev.tistory.com/</link>
    <description>engcraft1102@gmail.com</description>
    <language>ko</language>
    <pubDate>Mon, 15 Jun 2026 08:17:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Joonon</managingEditor>
    <image>
      <title>Keep Coding</title>
      <url>https://tistory1.daumcdn.net/tistory/3870974/attach/0e6817a4d1ec4dc7abe32e229ba03eb6</url>
      <link>https://jdev.tistory.com</link>
    </image>
    <item>
      <title>SYN 패킷 처리 딥다이브(번역 + 추가)  </title>
      <link>https://jdev.tistory.com/93</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3 way handshake은 정확한 전송을 보장하기 위해 단말 간에 세션을 수립하는 과정입니다. &lt;code&gt;SYN synchronization packet&lt;/code&gt;과 &lt;code&gt;ACK acknowledgment packet&lt;/code&gt;을 사용합니다. 클라이언트에서 SYN(a)을 보내고, 서버는 SYN(b), ACK(a+1)을 보내고, 클라이언트는 다시 ACK(b+1)을 보냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그런데 궁금한 것이 생겼습니다. 그럼 내부적으로는 SYN 패킷 관련 처리를 어떻게 하는 것일까요? SYN 패킷은 무한정으로 받을 수 있을까요?&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 글은  &lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;궁금증을 해결하기 위해 검색하다가 찾은 &lt;a href=&quot;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/&quot;&gt;SYN에 대한 정말 좋은 글(영문)&lt;/a&gt;을 보고, 부가적인 설명을 곁들이며 정리한 글입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 서버 운영 경험이 많은 &lt;code&gt;Cloudflare&lt;/code&gt;에서 이와 관련해 &lt;code&gt;깊게 파헤치는(원문: black art)&lt;/code&gt; 것을 게을리하지 않아 준 것이 감사하네요. &lt;a href=&quot;https://blog.cloudflare.com/ko-kr/syn-packet-handling-in-the-wild-ko-kr/&quot;&gt;이 글의 번역&lt;/a&gt;에서도 큰 도움을 받았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클라우드플레어는 미국 소재의 CDN 서비스와 DNS 서비스를 제공하는 기업으로, 본사는 미국 샌프란시스코에 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;2021년 기준 전 세계 웹사이트 5개 중 1개가 클라우드플레어의 &lt;code&gt;Reverse Proxy&lt;/code&gt; 서비스와 &lt;code&gt;DNS server&lt;/code&gt;를 사용할 정도인 인터넷업계의 거인입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 글을 이해하기 위한 TCP 3 way handshake에 관해서는 &lt;a href=&quot;https://jdev.tistory.com/92&quot;&gt;제 전 포스팅&lt;/a&gt;을 읽어 주세요.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;들어가며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;사람들이 그다지 신경쓰지 않는 주제 중 SYN floods가 있습니다. Cloudflare는 리눅스를 사용하고 있는데 리눅스에서 SYN 처리는 정말로 복잡합니다. 이 글에서 이 주제를 깊게 파헤쳐 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;두 개의 큐에 대한 이야기&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;265&quot; data-filename=&quot;all-1.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3vQkO/btrj3WrITu5/04YAUjaKNrvZEvzP73WnJ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3vQkO/btrj3WrITu5/04YAUjaKNrvZEvzP73WnJ0/img.jpg&quot; data-alt=&quot;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3vQkO/btrj3WrITu5/04YAUjaKNrvZEvzP73WnJ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3vQkO%2Fbtrj3WrITu5%2F04YAUjaKNrvZEvzP73WnJ0%2Fimg.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;265&quot; data-filename=&quot;all-1.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;listen이나 연결을 위한 준비 상태의 소켓 (bound socket)&lt;/code&gt;은 &lt;code&gt;LISTENING&lt;/code&gt; TCP 상태에 두 개의 분리된 큐를 가집니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN Queue&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Accept Queue&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;일반적으로 이 큐에는 reqsk_queue, ack backlog, listen backlog, TCP backlog 등 다양한 이름이 있지만 혼선을 피하기 위해 위의 이름으로 정하고 시작하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN Queue&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN 큐는 수신한 SYN 패킷(구체적으로는 &lt;code&gt;struct inet_request_sock&lt;/code&gt;)을 저장합니다. 이는 SYN+ACK을 보내고 타임아웃시에 재시도하는 역할을 합니다. 리눅스에서 재시도 값은 다음과 같이 설정됩니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;$ sysctl net.ipv4.tcp_synack_retries
net.ipv4.tcp_synack_retries = 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Docs는 다음과 같습니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;tcp_synack_retries - 정수

수동 TCP 연결 시도에 대해서 SYN+ACK를 몇번 다시 보낼지를 지정한다.
이 값은 255 이하이어야 한다. 기본값은 5이며, 1초의 초기 RTO값을 감안하면
마지막 재전송은 31초 후에 일어난다. 이는 수동 TCP 연결의 최종 타임아웃은
63초 이후에 일어난다는 것을 의미한다. &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이를 표로 나타내면:&lt;/span&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Time&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Description&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&amp;nbsp;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;+0초&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN+ACK 전송 (timeout=RTO=1초)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;+1초&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;새 timeout = 1 x 2 = &lt;b&gt;2초&lt;/b&gt;. SYN+ACK 재전송&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;retry=1&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;+3초&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;새 timeout = 2 x 2 = &lt;b&gt;4초&lt;/b&gt;. SYN+ACK 재전송&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;retry=2&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;+7초&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;새 timeout = 4 x 2 = &lt;b&gt;8초&lt;/b&gt;. SYN+ACK 재전송&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;retry=3&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;+15초&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;새 timeout = 8 x 2 = &lt;b&gt;16초&lt;/b&gt;. SYN+ACK 재전송&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;retry=4&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;+31초&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;새 timeout = 16 x 2 = &lt;b&gt;32초&lt;/b&gt;. SYN+ACK 재전송&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;retry=5&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;+63초&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;tcp_synack_retries(5). 종료&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;timeout&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;계산하면 최초 SYN+ACK를 전송하고 31초 후에 마지막 재전송이 이루어지고, 32초까지 응답이 없으면 RTO 값 1초를 더한 63초 후에 세션이 종료됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉, &lt;code&gt;net.ipv4.tcp_synack_retries&lt;/code&gt; 값이 디폴트인 5로 설정되어 있다면 한 세션당 타임아웃 값은 63초가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN+ACK를 전송한 뒤에 SYN 큐는 3방향 악수의 마지막 단계인 클라이언트로부터의 ACK 패킷을 기다립니다. 수신된 ACK 패킷은 모두 완전히 수립된 연결 테이블에서 찾을 수 있어야 하며 관련된 SYN 큐에는 없어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN 큐에서 찾을 수 있다면, 커널은 해당 연결을 SYN 큐에서 제거하고 완전히 수립된 연결을 만들어 (struct inet_sock) Accept Queue에 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Accept Queue&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Accept 큐는 애플리케이션이 언제라도 가져갈 수 있도록 완전히 수립된 연결을 저장하고 있습니다. 프로세스가 &lt;code&gt;accept()&lt;/code&gt;를 호출하면 이 큐에서 소켓을 제거하며 애플리케이션에게 전달합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이는 리눅스에서의 SYN 패킷 처리를 매우 간략하게 표현한 것인데, TCP_DEFER_ACCEPT나 TCP_FASTOPEN의 경우에는 약간 다르게 동작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;큐 크기 제한&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Accept와 SYN 큐의 최대 크기는 애플리케이션이 호출하는 &lt;code&gt;listen&lt;/code&gt; 시스템 콜의 &lt;code&gt;backlog&lt;/code&gt; 파라미터로 전달되는 값으로 설정됩니다. 예를 들어 다음은 SYN와 Accpet 큐 크기를 1024로 지정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;listen(sfd, 1024)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;참고로 커널 4.3 이전에는 SYN 큐 크기가 다르게 설정되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN 큐의 최대 크기는 &lt;code&gt;net.ipv4.tcp_max_syn_backlog&lt;/code&gt;에 의해 정해졌었지만 이제는 아닙니다. 최근에는 &lt;code&gt;net.core.somaxconn&lt;/code&gt;이 두 큐의 최대 크기를 지정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;$ sysctl net.core.somaxconn
net.core.somaxconn = 16384&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;완벽한 backlog 값&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위 내용을 이해했다면, 이상적인 backlog 파라미터 값에 대한 궁금증이 생길 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그런데 답은 &lt;code&gt;그때그때 달라요&lt;/code&gt; 입니다. 대부분의 소규모 TCP 서버의 경우 이 값은 그리 중요하지 않습니다. 예를 들어 &lt;code&gt;Go언어&lt;/code&gt;는 backlog 값 변경을 지원하지 않고 128로 고정해 놓았습니다. 하지만 이 값을 더 크게 지정해야 할 이유들이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;초당 들어오는 연결 수가 매우 많다면 잘 동작하는 애플리케이션이라도 SYN 큐는 많은 패킷을 저장해야 할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;backlog 값은 SYN 큐 크기를 지정합니다. 즉, 이 값은 &lt;code&gt;아직 처리되지 않은 ACK 패킷의 수&lt;/code&gt;이기도 합니다. 클라이언트와의 평균 왕복 시간이 크다면, 더 많은 패킷을 저장할 수 있어야 합니다. 많은 클라이언트가 서버에서 멀리 떨어져 있다면 (수백밀리초 이상) 이 값을 늘리는 편이 좋겠죠.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TCP_DEFER_ACCEPT 옵션은 소켓을 SYN_RECV상태로 더 오래 둘 수 있고 큐 크기에 영향을 미칩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;물론 backlog를 지나치게 크게 해도 안 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN 큐는 메모리를 소비합니다. SYN floods 시에는 공격 패킷을 저장하기 위해 리소스를 낭비할 필요가 없습니다. 각각의 &lt;code&gt;struct inet_request_sock&lt;/code&gt; 엔트리는 커널 4.14에서 256bytes의 메모리를 차지합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;linux에서 SYN 큐를 들여다보기 위해서는 &lt;code&gt;ss&lt;/code&gt; 커맨드를 이용해 &lt;code&gt;SYN_RECV&lt;/code&gt; 소켓을 살피면 됩니다. 예를 들어 Cloudflare의 서버 중 하나에서는 다음과 같이 tcp/80 SYN 큐에 119개가, tcp/443에 78개가 쌓여 있음을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;$ ss -n state syn-recv sport = :80 | wc -l
119
$ ss -n state syn-recv sport = :443 | wc -l
78&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;느린 애플리케이션&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;267&quot; data-filename=&quot;full-accept-1.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdaE0b/btrj3iWxcIn/FutneMf608brGeeAEJsuO0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdaE0b/btrj3iWxcIn/FutneMf608brGeeAEJsuO0/img.jpg&quot; data-alt=&quot;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdaE0b/btrj3iWxcIn/FutneMf608brGeeAEJsuO0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdaE0b%2Fbtrj3iWxcIn%2FFutneMf608brGeeAEJsuO0%2Fimg.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;267&quot; data-filename=&quot;full-accept-1.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;애플리케이션이 &lt;code&gt;accept()&lt;/code&gt;를 충분히 빠르게 호출하지 못한다면 어떻게 될까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;마법이 시작됩니다! Accept 큐가 꽉 차게 되면 (backlog+1 크기가 되면) 다음과 같은 일이 일어납니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN 큐로 추가될 수신 SYN 패킷이 버려짐&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN 큐로 추가될 수신 ACK 패킷이 버려짐&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TcpExtListenOverflows / LINUX_MIB_LISTENOVERFLOWS 카운터 증가&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TcpExtListenDrops / LINUX_MIB_LISTENDROPS 카운터 증가&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;수신 패킷을 버려도 되는 주된 이유는 이것이 반작용 메커니즘이기 때문입니다. 달리 말하면 상대방은 느린 애플리케이션이 이미 복구되어 있기를 기대하며 SYN, ACK 패킷을 언젠가 다시 보내기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이는 대부분의 서버에서 바람직한 행동입니다. 추가로 &lt;code&gt;net.ipv4.tcp_abort_on_overflow&lt;/code&gt;를 지정할 수 있습니다만 권장되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;만약 여러분의 서버가 많은 연결을 처리해야 하고 &lt;code&gt;accept()&lt;/code&gt; 성능 문제를 겪고 있다면 &lt;a href=&quot;https://blog.cloudflare.com/the-sad-state-of-linux-socket-balancing/&quot;&gt;Nginx tuning/ Epoll work distribution&lt;/a&gt;과 &lt;a href=&quot;https://blog.cloudflare.com/perfect-locality-and-three-epic-systemtap-scripts/&quot;&gt;a follow up showing useful System Tap scripts&lt;/a&gt;를 읽어 보세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Accept 큐 오버플로를 추적하려면 &lt;code&gt;nstat&lt;/code&gt; 카운터를 보면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ nstat -az TcpExtListenDrops
TcpExtListenDrops     49199     0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 값은 전체 카운터입니다. 모든 애플리케이션이 별 문제 없어보이는데도 이 값이 증가하는 것이 종종 보인다면 좋은 상황은 아닐 것입니다. 가장 먼저 할 일은 &lt;code&gt;ss&lt;/code&gt;로 Accept 큐 크기를 살펴보는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ ss -plnt sport = :6443|cat
State   Recv-Q Send-Q  Local Address:Port  Peer Address:Port
LISTEN  0      1024                *:6443             *:*&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Recv-Q 컬럼은 Accept 큐의 소켓 숫자, Send-Q는 backlog 값입니다. 이 경우에는 &lt;code&gt;accept()&lt;/code&gt;가 안 된 소켓은 아직 없다는 걸 볼 수 있는데, 그래도 ListenDrops 카운터가 증가할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;우리의 경우 애플리케이션이 아주 잠깐동안만 멈춘 것으로 보입니다. 아주 짧은 시간이라도 멈추기만 한다면 Accept 큐가 넘칠 충분한 이유가 될 것입니다. 순식간에 복구가 되었을 수도 있습니다. 이런 경우에 &lt;code&gt;ss&lt;/code&gt;로 디버깅하는 것은 어렵습니다. 이런 경우를 대비해서 &lt;a href=&quot;https://github.com/cloudflare/cloudflare-blog/blob/master/2018-01-syn-floods/acceptq.stp&quot;&gt;acceptq.stp SystemTap Script&lt;/a&gt;를 작성했는데, 커널을 후킹해서 버려지는 SYN 패킷을 출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ sudo stap -v acceptq.stp
time (us)        acceptq qmax  local addr    remote_addr
1495634198449075  1025   1024  0.0.0.0:6443  10.0.1.92:28585
1495634198449253  1025   1024  0.0.0.0:6443  10.0.1.92:50500
1495634198450062  1025   1024  0.0.0.0:6443  10.0.1.92:65434
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이제 ListenDrops에 영향을 미치는 SYN 패킷을 정확하게 알 수 있습니다. 이 스크립트를 통해 어떤 애플리케이션이 연결을 버리고 있는지 쉽게 알 수 있습니다. 느린 애플리케이션 컽!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;576&quot; data-filename=&quot;3713965419_20388fb368_b.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb66E8/btrj9krzMEj/7wb42jK08YDqQv1F9JHrR0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb66E8/btrj9krzMEj/7wb42jK08YDqQv1F9JHrR0/img.jpg&quot; data-alt=&quot;CC BY 2.0 image by [internets_diary](https://www.flickr.com/photos/16339684@N00/)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb66E8/btrj9krzMEj/7wb42jK08YDqQv1F9JHrR0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb66E8%2Fbtrj9krzMEj%2F7wb42jK08YDqQv1F9JHrR0%2Fimg.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;576&quot; data-filename=&quot;3713965419_20388fb368_b.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CC BY 2.0 image by [internets_diary](https://www.flickr.com/photos/16339684@N00/)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN Flood&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;268&quot; data-filename=&quot;full-syn-1.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qB581/btrj7RwFQb1/lyuHG3rQ2W2KnhTUIPqaq0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qB581/btrj7RwFQb1/lyuHG3rQ2W2KnhTUIPqaq0/img.jpg&quot; data-alt=&quot;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qB581/btrj7RwFQb1/lyuHG3rQ2W2KnhTUIPqaq0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqB581%2Fbtrj7RwFQb1%2FlyuHG3rQ2W2KnhTUIPqaq0%2Fimg.jpg&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;268&quot; data-filename=&quot;full-syn-1.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Accept 큐 오버플로가 가능하다면 SYN 큐 오버플로도 가능하겠죠? 어떤 경우일까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;바로 &lt;a href=&quot;https://en.wikipedia.org/wiki/SYN_flood&quot;&gt;SYN Flood attacks&lt;/a&gt;입니다. 예전에는 SYN 큐를 위조된 SYN 패킷으로 넘치게 하는 것이 큰 문제였습니다. 1996년 이전에는 SYN 큐를 채우는 것만으로 대부분의 TCP 서버를 매우 적은 대역폭만으로 서비스 불능으로 만들 수 있었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;276&quot; data-filename=&quot;220px-Tcp_synflood.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8m6Qr/btrkcrcT5PS/WP82kjlq5hwnkvmuvqsSF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8m6Qr/btrkcrcT5PS/WP82kjlq5hwnkvmuvqsSF1/img.png&quot; data-alt=&quot;https://en.wikipedia.org/wiki/SYN_flood&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8m6Qr/btrkcrcT5PS/WP82kjlq5hwnkvmuvqsSF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8m6Qr%2FbtrkcrcT5PS%2FWP82kjlq5hwnkvmuvqsSF1%2Fimg.png&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;276&quot; data-filename=&quot;220px-Tcp_synflood.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://en.wikipedia.org/wiki/SYN_flood&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;공격자는 ACK를 다시 보내지 않는 수많은 SYN 패킷을 보냅니다. 서버는 클라이언트의 연결을 받아들이기 위해 RAM 공간을 확보해서 대기하는데, ACK가 오지 않으니 RAM이 꽉 차게 되고, 정상적인 사용자의 SYN을 받지 못하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 문제의 해결책은 &lt;a href=&quot;https://lwn.net/Articles/277146/&quot;&gt;SYN 쿠키&lt;/a&gt;입니다. SYN 쿠키는 수신 SYN을 저장하지 않고 메모리 소비 없이 SYN+ACK를 만들 수 있는 방법입니다. SYN 쿠키는 정상적인 트래픽을 방해하지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN 쿠키와 TCP 타임스탬프&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN 쿠키는 좋지만 부작용이 없는 것은 아닙니다. 주된 문제는 SYN 쿠키에 저장할 수 있는 데이터 크기가 작다는 것입니다. 구체적으로는 시퀀스 번호 32bits만이 ACK에 들어 있는데 다음과 같이 나눠서 사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;+----------+--------+-------------------+
|  6 bits  | 2 bits |     24 bits       |
| t mod 32 |  MSS   | hash(ip, port, t) |
+----------+--------+-------------------+&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MSS 값을 &lt;a href=&quot;https://github.com/torvalds/linux/blob/5bbcc0f595fadb4cac0eddc4401035ec0bd95b09/net/ipv4/syncookies.c#L142&quot;&gt;4가지만&lt;/a&gt; 정할 수 있게 되면서 리눅스는 상대방의 다른 TCP 옵션 파라미터를 알 수 없습니다. 타임스탬프, ECN, 선택적인 ACK(SACK), 윈도우 크기 변경 정보를 잃게 되어 TCP 세션 성능을 저하하는 요인이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다행히 리눅스에는 대책이 있습니다. 만약 TCP 타임스탬프가 켜져 있다면 이 32비트를 다른 용도로 재사용하여 이 문제를 해결할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;+-----------+-------+-------+--------+
|  26 bits  | 1 bit | 1 bit | 4 bits |
| Timestamp |  ECN  | SACK  | WScale |
+-----------+-------+-------+--------+&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;tcp 타임스탬프는 기본적으로 이용 가능한 상태이기 때문에, sysctl로 확인해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;$ sysctl net.ipv4.tcp_timestamps
net.ipv4.tcp_timestamps = 1 &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;타임스탬프 기능이 활성화되어 있을 경우 타임스탬프 공간의 재활용이 가능하기 때문에 통신 간 대역폭이 조금 더 사용할 수 있습니다. 다만 타임스탬프의 유용성에 대해 많은 논의가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;과거에 타임스탬프가 서버 가동 시간을 유출하는 경우가 있었습니다. (이게 얼마나 중요한 사항인지는 다른 문제지만) 이는 &lt;a href=&quot;https://github.com/torvalds/linux/commit/95a22caee396cef0bb2ca8fafdd82966a49367bb&quot;&gt;2016년 말에&lt;/a&gt; 수정되었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TCP 타임스탬프는 대역폭을 꽤 사용합니다 - 패킷당 12 바이트&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN 쿠키가 동작하는 경우 TCP 타임스탬프는 TCP 연결의 성능 향상에 도움이 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;본문에서 Cloudflare는 TCP 타임스탬프를 꺼 두었다고 하네요.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Cloudflare 스케일의 SYN 홍수&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;191&quot; data-filename=&quot;Screen-Shot-2016-12-02-at-10.53.27-1.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfcWG6/btrkcrqqejj/oEfRYmU04NVPfhsKjf7kZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfcWG6/btrkcrqqejj/oEfRYmU04NVPfhsKjf7kZ1/img.png&quot; data-alt=&quot;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfcWG6/btrkcrqqejj/oEfRYmU04NVPfhsKjf7kZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfcWG6%2Fbtrkcrqqejj%2FoEfRYmU04NVPfhsKjf7kZ1%2Fimg.png&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;191&quot; data-filename=&quot;Screen-Shot-2016-12-02-at-10.53.27-1.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN 쿠키는 위대한 발명이고 &lt;b&gt;소규모의&lt;/b&gt; SYN Flood 문제를 해결해 줍니다. 하지만 Cloudflare에서는 사용하지 않습니다. 암호학적으로 확인 가능한 수천의 SYN+ACK 패킷을 보내는 것은 괜찮지만, 대형 서비스인 Cloudflare는 &lt;a href=&quot;https://blog.cloudflare.com/the-daily-ddos-ten-days-of-massive-attacks/&quot;&gt;초당 2억 패킷 이상의 공격&lt;/a&gt;을 받기 때문입니다. 이런 규모의 경우 SYN+ACK의 응답은 쓸모 없는 패킷만 양산할 뿐 큰 의미가 없다고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그 대신 방화벽 단에서 악의적인 SYN 패킷을 차단하고, BPF에 컴파일된 p0f SYN 지문을 이용한다고 합니다. 또한 &lt;code&gt;Gatebot&lt;/code&gt;이라는 자동화 시스템을 개발했다고 합니다. &lt;a href=&quot;https://blog.cloudflare.com/meet-gatebot-a-bot-that-allows-us-to-sleep/&quot;&gt;자세한 내용은 여기에&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;발전하는 환경&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;리눅스의 SYN 패킷 처리 환경은 계속 발전하고 있습니다. 최근까지만 해도 SYN 쿠키는 오래된 커널 때문에 느렸습니다. 이 문제는 4.4에서 수정되었고 이제 커널은 초당 수백만의 SYN 쿠키를 보낼 수 있어서 대부분의 경우 SYN 홍수 문제는 실질적으로 해결되었습니다. 적절한 튜닝을 통해 정상적인 연결의 성능을 방해하지 않고 아주 귀찮은 홍수를 방어할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;애플리케이션 성능도 많은 관심을 끌고 있습니다. &lt;code&gt;SO_ATTACH_REUSEPORT_EBPF&lt;/code&gt;와 같은 아이디어는 네트워크 스택을 프로그래밍할 수 있는 새로운 계층을 제공합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;운영체제의 잘 바뀌지 않던 부분인 네트워킹 스택에 혁신과 새로운 아이디어가 도입되고 있다는 것은 좋은 일입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;끝으로&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN에 대해 딥다이브 해 보았습니다. 생소한 개념이 많아 이해하기 어려운 부분도 많습니다만 3 way handshake의 기반에 대해 조금은 자세하게 알게 된 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;정리하면서 덧붙이는 과정에 잘못된 내용이 있을 수 있습니다. 제가 잘못 옮겼거나 추가한 부분이 있다면 꼭 말씀해 주세요! 열심히 찾아서 수정하겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;References&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/&quot;&gt;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/&lt;/a&gt; (영문)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://blog.cloudflare.com/ko-kr/syn-packet-handling-in-the-wild-ko-kr/&quot;&gt;https://blog.cloudflare.com/ko-kr/syn-packet-handling-in-the-wild-ko-kr/&lt;/a&gt; (번역)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>CS/Network</category>
      <author>Joonon</author>
      <guid isPermaLink="true">https://jdev.tistory.com/93</guid>
      <comments>https://jdev.tistory.com/93#entry93comment</comments>
      <pubDate>Sun, 7 Nov 2021 18:23:57 +0900</pubDate>
    </item>
    <item>
      <title>3 way handshake의 이해(번역)</title>
      <link>https://jdev.tistory.com/92</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://www.guru99.com/tcp-3-way-handshake.html#2&quot;&gt;이 글(영문)&lt;/a&gt;을 정리해서 옮긴 글입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;오역이 있다면 댓글로 말씀해 주시면 감사하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;THREE WAY HANDSHAKE이란 무엇인가?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Three-Way HandShake, 혹은 TCP 3-way handshake라고 부르는 이것은 TCP/IP 네트워크에서 &lt;code&gt;client&lt;/code&gt;와 &lt;code&gt;server&lt;/code&gt; 간의 &lt;code&gt;연결 connection&lt;/code&gt;을 만들기 위해 사용되는 &lt;code&gt;과정 process&lt;/code&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실제 데이터 통신 프로세스가 시작되기 전에 클라이언트와 서버가 동기화/승인 패킷을 교환하는 3단계의 프로세스입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 프로세스는 두 단말이 동시에 TCP 소켓 연결을 &lt;code&gt;초기화/협상/분리 initiate/negotiate/separate&lt;/code&gt;하는 데 도움이 되도록 설계되었습니다. 이는 또한 양방향으로 동시에 다수의 TCP 소켓 연결을 전송하는 것을 가능하게 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TCP message types&lt;/span&gt;&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Message&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Description&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;연결을 시작하고 설정하는 데 사용됩니다. 또한 장치 간의 시퀀스 번호를 동기화합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;ACK&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;상대방이 SYN을 받았는지 확인합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SYN-ACK&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;로컬 장치의 SYN 메시지와 이전 패킷의 ACK입니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;FIN&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;연결을 종료하는 데 사용됩니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TCP Three-Way Handshake Process&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TCP 트래픽은 &lt;span&gt;3-way handshake&lt;/span&gt;로 시작됩니다. 이 과정에서 클라이언트는 서버와의 통신 세션을 요청하여 대화를 시작해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;277&quot; data-filename=&quot;092119_0753_TCP3WayHand1.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wwCCE/btrj4ooqCZg/CVonKeIgd1ZamRsUjMl2C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wwCCE/btrj4ooqCZg/CVonKeIgd1ZamRsUjMl2C0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wwCCE/btrj4ooqCZg/CVonKeIgd1ZamRsUjMl2C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwwCCE%2Fbtrj4ooqCZg%2FCVonKeIgd1ZamRsUjMl2C0%2Fimg.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;277&quot; data-filename=&quot;092119_0753_TCP3WayHand1.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;첫 번째 단계에서 클라이언트는 서버와 연결을 설정합니다. SYN과 함께 &lt;code&gt;*세그먼트 segment: TCP에서의 packet&lt;/code&gt;를 보내고, 시퀀스 번호를 서버에게 알립니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 때, 클라이언트는 &lt;code&gt;SYN_SENT&lt;/code&gt; 상태가 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 요청을 받는 서버는 &lt;code&gt;CLOSED가 아닌 LISTEN&lt;/code&gt;상태로, 포트 서비스가 가능한 상태여야 합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;요청을 성공적으로 받은 서버는 클라이언트에게 요청을 수락한다는 ACK와 SYN flag가 설정된 SYN-ACK 패킷을 발송하고 클라이언트가 다시 ACK로 응답하기를 기다립니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 때, 서버는 &lt;code&gt;SYN_RECEIVED&lt;/code&gt; 상태가 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;마지막으로 클라이언트는 서버에게 ACK를 보내고, 실제 데이터 전송 프로세스를 시작하기 위한 안정적인 연결을 생성하게 됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이 때, 클라이언트와 서버 상태는 &lt;code&gt;ESTABLISHED&lt;/code&gt;가 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;*segment: TCP에서 바이트 스트림을 그룹화한 것. 송신 TCP에서는 header를 붙여 segment를 만든 후 IP 계층으로 전달(capsulation)하고, 수신쪽은 header를 떼고 application으로 전달(decapsulation)한다. 세그먼트의 헤더 크기는 기본 20byte이고 옵션이 붙으면 최대 60byte까지 커진다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Real-world Example&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;253&quot; data-filename=&quot;092119_0753_TCP3WayHand2.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I2Ot6/btrkaPkMUVk/kBMPstiwPrR1Q0bqqb1AvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I2Ot6/btrkaPkMUVk/kBMPstiwPrR1Q0bqqb1AvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I2Ot6/btrkaPkMUVk/kBMPstiwPrR1Q0bqqb1AvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI2Ot6%2FbtrkaPkMUVk%2FkBMPstiwPrR1Q0bqqb1AvK%2Fimg.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;253&quot; data-filename=&quot;092119_0753_TCP3WayHand2.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Host X는 TCP SYN 패킷을 보내는 것으로 연결을 시작합니다. 이 패킷은 Host X가 전송해야 하는 데이터에 대한 시작을 나타내는 랜덤한 시퀀스 번호 (예: 4321)가 포함되어 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그 후 서버는 패킷을 수신하고 시퀀스 번호로 응답합니다. 응답에는 ACK, 즉 1이 증가한 Host X의 시퀀스 번호를 포함한 승인 번호가 포함됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Host X는 서버의 시퀀스 번호에서 1이 증가한 ACK를 보내 서버에게 응답합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터 전송 프로세스가 끝나면 TCP는 두 단말의 연결을 자동으로 종료합니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>CS/Network</category>
      <author>Joonon</author>
      <guid isPermaLink="true">https://jdev.tistory.com/92</guid>
      <comments>https://jdev.tistory.com/92#entry92comment</comments>
      <pubDate>Sun, 7 Nov 2021 18:17:47 +0900</pubDate>
    </item>
    <item>
      <title>Subnet mask, Subnetting</title>
      <link>https://jdev.tistory.com/91</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서브넷의 탄생&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;앞서 공부했던 네트워크 클래스에서 알 수 있듯, 클래스 단위로 네트워크를 분류하면 비효율적이었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;따라서 단말 수에 맞추어 효율적으로 사용할 수 있는 &lt;code&gt;서브넷 Subnet&lt;/code&gt;이라는 개념이 등장하게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서브넷 Subnet&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;서브넷 Subnet&lt;/code&gt;은 말 그대로 부분망을 뜻합니다. IP 네트워크를 논리적으로 세분화한 것입니다. 그리고 이 서브넷을 만들 때 쓰이는 것이 바로 &lt;code&gt;서브넷 마스크&lt;/code&gt;입니다. 이 서브넷 마스크를 이용해 IP주소 체계의 Network ID와 Host ID를 분리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP 주소는 IP 클래스에 의해 분리되는 Network Prefix와 Host Number로 분리됩니다. 서브넷 마스크에 의해 이루어지는 서브넷팅은 이 Host Number를 Subnet Number와 서브넷 안에서 식별되는 Host Number로 다시 분리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서브넷팅 Subnetting&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;하나의 네트워크를 둘, 혹은 여러 개의 서브 네트워크로 나눠서, 외부에서 해당 네트워크를 바라볼 시에는 단일 네트워크처럼 보이지만 내부에서 보면 여러 개의 네트워크로 만드는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서브넷팅을 통해 네트워크의 밀집을 완화하고, 네트워크의 성능을 향상시킵니다. 보안은 덤입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;FLSM (Fixed Length Subnet Mask)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;고정된 크기의 Subnet-mask를 사용하는 방식으로, 각 서브넷의 크기는 동일합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예를 들어 &lt;code&gt;192.128.32.0/24&lt;/code&gt;라는 네트워크 주소 하나를 12개씩의 호스트가 있는 각각의 네트워크로 분할하려고 한다면, 어떻게 서브넷팅해야 할까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;주어진 서브넷과 서브넷 마스크를 2진수로 바꿔서 AND 연산을 해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP Address&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;11011010.10000000.00100000.&lt;b&gt;00000000&lt;/b&gt;&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;subnet-mask&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;11111111.11111111.11111111.&lt;b&gt;00000000&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;AND연산&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;11011010.10000000.00100000.&lt;b&gt;00000000&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;여기서 서브넷 마스크의 비트 중 1로 표시된 부분(24개)는 모두 Network ID로 사용되었으므로, 0으로 표시된 나머지인 Host ID 부분만 사용가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;12개의 호스트(단말)에 IP를 할당하기 위한 비트의 최소값은 4개입니다. (2^4 = 16개의 Host range)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;기존의 Host-ID 부분을 필요한 만큼인 4bit만큼 자릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20211029005955522.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oYvLq/btrjbM4LDNg/Ps8H5O8pMLrbsa6O5nMJqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oYvLq/btrjbM4LDNg/Ps8H5O8pMLrbsa6O5nMJqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oYvLq/btrjbM4LDNg/Ps8H5O8pMLrbsa6O5nMJqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoYvLq%2FbtrjbM4LDNg%2FPs8H5O8pMLrbsa6O5nMJqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;708&quot; height=&quot;191&quot; data-filename=&quot;image-20211029005955522.png&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;따라서 호스트 부분의 4bit로 표현할 수 있는 수의 범위를 표로 나타내면 아래와 같이 되겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;2405&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRhJzx/btri8s6Ar9X/LV7j3R4zCnQgdIKDPsQ4Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRhJzx/btri8s6Ar9X/LV7j3R4zCnQgdIKDPsQ4Qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRhJzx/btri8s6Ar9X/LV7j3R4zCnQgdIKDPsQ4Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRhJzx%2Fbtri8s6Ar9X%2FLV7j3R4zCnQgdIKDPsQ4Qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2405&quot; height=&quot;760&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;2405&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;총 16개의 서브넷으로 나누어집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;범위 안의 숫자 중 맨 앞의 IP는 각 서브넷의 네트워크 주소가 되고, 맨 뒤의 IP는 브로드캐스트 주소가 됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉, 첫 번째 서브넷에서 사용 가능한 Host IP는 1 ~ 14의 14개가 됩니다. 이 범위를 서브넷으로 나타내면 &lt;code&gt;192.168.32.0&lt;/code&gt;이 되고, &lt;code&gt;subnet mask(prefix)&lt;/code&gt;는 4bit를 더 사용했으니 &lt;code&gt;/24 =&amp;gt; /28&lt;/code&gt;이 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;따라서 &lt;code&gt;192.168.32.0/28&lt;/code&gt;이라는 네트워크 주소로 해당 서브넷을 나타낼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;VLSM (Variable Length Subnet Mask)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서브넷팅을 이해했다면 VLSM은 쉽습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위와 같은 동일한 크기의 서브넷과 달리 큰 부서에는 더 많이, 작은 부서에는 더 적게 IP를 배분해야 하는 상황이 올 수가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;네트워크 주소: &lt;code&gt;200.1.1.0/24&lt;/code&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;개발부: 100개의 단말&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;홍보부: 50개의 단말&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;축구부: 2개의 단말&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위와 같은 조건이라면 FLSM을 한다면 가장 큰 크기인 개발부에 맞춰서 자르게 되고, 다른 부서에는 너무 많은 IP가 남게 되어 낭비가 됩니다. 이러한 경우를 피하기 위해 각 부서 별로 필요한 만큼만 잘라서 사용해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이와 같이 다양한 길이의 서브넷 마스크가 되겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LXQv3/btrlr4OboKv/jwUgIJi2uVLDIc1ZX441wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LXQv3/btrlr4OboKv/jwUgIJi2uVLDIc1ZX441wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LXQv3/btrlr4OboKv/jwUgIJi2uVLDIc1ZX441wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLXQv3%2Fbtrlr4OboKv%2FjwUgIJi2uVLDIc1ZX441wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;436&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;실생활에서 서브넷팅을 해 봅시다 (Youtube Channel: Sunny Classroom)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;어느 날 매니저가 당신에게 까페를 위해 네트워크 세 개를 만들어 달라고 부탁했습니다. 하나는 사무실, 하나는 데스크와 창고, 하나는 공공 사용을 위한 용도입니다. 당신은 각각의 &lt;code&gt;Network ID, subnet mask, Host ID Range, # of usable host IDs, Broadcast ID&lt;/code&gt;를 리스트로 만들어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;주어진 네트워크 ID는 &lt;code&gt;192.168.4.0/24&lt;/code&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;모든 그림은 유튜브의 &lt;a href=&quot;https://www.youtube.com/watch?v=ecCuyq-Wprc&quot;&gt;Sunny Classroom&lt;/a&gt;에서 가져왔습니다. Thank you! 너무 좋은 영상이니 한 번씩 봐주세요!)&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20211028205345319.png&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLgp9U/btrjbx7Fhd4/yupjUPJRmKgjXYqDyXjkl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLgp9U/btrjbx7Fhd4/yupjUPJRmKgjXYqDyXjkl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLgp9U/btrjbx7Fhd4/yupjUPJRmKgjXYqDyXjkl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLgp9U%2Fbtrjbx7Fhd4%2FyupjUPJRmKgjXYqDyXjkl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1317&quot; height=&quot;296&quot; data-filename=&quot;image-20211028205345319.png&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위 표를 보면 한 방에 이해할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서브넷은 1부터 시작해서 2씩 늘어나고, 호스트는 그 역입니다. 저희는 3개의 네트워크가 필요하니까...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20211028205737244.png&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FYLlc/btri85jolfh/ynOjnbUsaWQb9OdnIyeXp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FYLlc/btri85jolfh/ynOjnbUsaWQb9OdnIyeXp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FYLlc/btri85jolfh/ynOjnbUsaWQb9OdnIyeXp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFYLlc%2Fbtri85jolfh%2FynOjnbUsaWQb9OdnIyeXp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1118&quot; height=&quot;290&quot; data-filename=&quot;image-20211028205737244.png&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서브넷 4개로 나눌 수 있는 &lt;code&gt;/26&lt;/code&gt; 서브넷 마스크가 필요하겠네요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20211028205920150.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rBYZx/btrjbzqQJYV/ZOHjz1eLyBD7TVuk21GqwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rBYZx/btrjbzqQJYV/ZOHjz1eLyBD7TVuk21GqwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rBYZx/btrjbzqQJYV/ZOHjz1eLyBD7TVuk21GqwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrBYZx%2FbtrjbzqQJYV%2FZOHjz1eLyBD7TVuk21GqwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1216&quot; height=&quot;483&quot; data-filename=&quot;image-20211028205920150.png&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서브넷 마스크 26에 의해 4개로 나뉘어진 리스트를 표로 보면 위와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;제 컴퓨터로 해볼까요?&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20211029012657518.png&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JPHUs/btrjd35jeZO/kZ46PikgJ9g65GOEuRoEvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JPHUs/btrjd35jeZO/kZ46PikgJ9g65GOEuRoEvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JPHUs/btrjd35jeZO/kZ46PikgJ9g65GOEuRoEvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJPHUs%2Fbtrjd35jeZO%2FkZ46PikgJ9g65GOEuRoEvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;359&quot; height=&quot;39&quot; data-filename=&quot;image-20211029012657518.png&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;제 컴퓨터의 어댑터 IP입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이를 네트워크로 표현하면 &lt;code&gt;192.168.0.100/24&lt;/code&gt;가 되겠네요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP range는 &lt;code&gt;192.168.0.0 ~ 192.168.0.255&lt;/code&gt;이고, 저는 그 중에 하나를 배정받은 것을 알 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;아래의 명령어 순서대로 쳐서 IP 주소를 새로 받아 보아도 범위는 바뀌지 않는 것을 확인했습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;ipconfig /release&lt;/code&gt;: 현재 DHCP 구성 해제 및 어댑터의 IP 주소 구성 제거&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;ipconfig /renew&lt;/code&gt; : DHCP 클라이언트 컴퓨터로 구성된 컴퓨터에서만 사용가능하며, 서버로부터 새로운 IP 주소 및 구성값을 받아옴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;release와 renew를 단시간에 반복하니 같은 주소만 배정되는 것 또한 확인했습니다. 신기하네요  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;긴 글 읽어 주셔서 감사합니다. 잘못된 내용, 오타는 댓글로 알려주세요. 적극적으로 수정하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;References&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://engkimbs.tistory.com/622&quot;&gt;https://engkimbs.tistory.com/622&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/twers/50116961114&quot;&gt;https://m.blog.naver.com/twers/50116961114&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://bignet.tistory.com/50&quot;&gt;BigNetwork - Subnetting&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ecCuyq-Wprc&quot;&gt;https://www.youtube.com/watch?v=ecCuyq-Wprc&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>CS/Network</category>
      <author>Joonon</author>
      <guid isPermaLink="true">https://jdev.tistory.com/91</guid>
      <comments>https://jdev.tistory.com/91#entry91comment</comments>
      <pubDate>Fri, 29 Oct 2021 01:38:02 +0900</pubDate>
    </item>
    <item>
      <title>React font 적용 - otf file format: otf(x) opentype(o)</title>
      <link>https://jdev.tistory.com/90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;로컬에 있는 폰트 파일을 가져다 쓰는 방식으로 적용해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;브라우저 별로 otf, ttf, woff 등 다양한 형식의 폰트 파일이 필요합니다. 필요한 만큼 준비합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20211028124626032.png&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEAWo9/btri86ufwrx/YXKNC1MHPKzJv6q13kl7Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEAWo9/btri86ufwrx/YXKNC1MHPKzJv6q13kl7Tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEAWo9/btri86ufwrx/YXKNC1MHPKzJv6q13kl7Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEAWo9%2Fbtri86ufwrx%2FYXKNC1MHPKzJv6q13kl7Tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;294&quot; height=&quot;315&quot; data-filename=&quot;image-20211028124626032.png&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;font.css&lt;/code&gt;에는 아래와 같이 작성했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;/*
  src: 사용할 폰트의 위치 및 형식
     Safari, Android, iOS =&amp;gt; ttf
     Modern Browsers =&amp;gt; woff
     IE6-IE8 =&amp;gt; eot
  */
@font-face {
  font-family: 'Noto Sans KR';
  font-weight: 400;
  font-style: normal;
  src: url('./NotoSansKR-Medium.otf') format('opentype'),
    url('./NotoSansKR-Bold.woff') format('woff');
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;font-family&lt;/code&gt;에 원하는 이름을 지정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;⭐format('otf '가 아니라 'opentype')!!!!!!&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;otf 파일에는 format에 'opentype'을 지정해 줘야 합니다. 다른 블로그에 'otf'로 되어 있는 곳이 많아서 꽤나 삽질했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이후, &lt;code&gt;index.js&lt;/code&gt;에서 font.css를 import했습니다. 그리고 폰트가 필요한 컴포넌트에 아래와 같이 불러옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;.formHeader {
    /* font-weight: bold; */
    font-family: 'Noto Sans KR';
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;적용 전&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20211028125123143.png&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w1yI1/btri4Zi1YDp/xxJsQYX7Sah3jFPsxq8Ax0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w1yI1/btri4Zi1YDp/xxJsQYX7Sah3jFPsxq8Ax0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w1yI1/btri4Zi1YDp/xxJsQYX7Sah3jFPsxq8Ax0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw1yI1%2Fbtri4Zi1YDp%2FxxJsQYX7Sah3jFPsxq8Ax0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;354&quot; height=&quot;273&quot; data-filename=&quot;image-20211028125123143.png&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;적용 후&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20211028125105928.png&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sOK5y/btri5jatBKR/jDhzs13uCkfriqgTNyisJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sOK5y/btri5jatBKR/jDhzs13uCkfriqgTNyisJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sOK5y/btri5jatBKR/jDhzs13uCkfriqgTNyisJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsOK5y%2Fbtri5jatBKR%2FjDhzs13uCkfriqgTNyisJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;353&quot; height=&quot;279&quot; data-filename=&quot;image-20211028125105928.png&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;잘 적용되는 모습입니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Study/React</category>
      <author>Joonon</author>
      <guid isPermaLink="true">https://jdev.tistory.com/90</guid>
      <comments>https://jdev.tistory.com/90#entry90comment</comments>
      <pubDate>Thu, 28 Oct 2021 12:55:25 +0900</pubDate>
    </item>
    <item>
      <title>Network Class</title>
      <link>https://jdev.tistory.com/89</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클래스 도입 이전&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원래 32Bit IPv4 주소는 호스트가 연결되어 있는 특정 네트워크를 가리키는 단순한 8비트의 네트워크 영역과 해당 네트워크 내에서 호스트의 주소를 가리키는 나머지 영역으로 단순하게 구분되어 있었습니다. 참고로 이 형태는 랜 도입 이전에 정해졌는데, 이는 &lt;code&gt;미 국방성의 ARPANET - 최초의 네트워크&lt;/code&gt;과 같은 적은 수의 대규모 네트워크밖에 없었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;ARPANET&lt;/code&gt;은 대규모 연구소나 군, 대학에서만 사용하던 패킷 스위칭 기반 통신 방식입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;358&quot; data-filename=&quot;img.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9iXdN/btri3UWeS8n/l4JRlNn9ZCxJpKJ7kk53x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9iXdN/btri3UWeS8n/l4JRlNn9ZCxJpKJ7kk53x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9iXdN/btri3UWeS8n/l4JRlNn9ZCxJpKJ7kk53x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9iXdN%2Fbtri3UWeS8n%2Fl4JRlNn9ZCxJpKJ7kk53x1%2Fimg.png&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;358&quot; data-filename=&quot;img.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1982년 프로토타입 인터넷 지도입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;599&quot; data-filename=&quot;456px-Internet_map_in_February_82.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nDVww/btri5kGU0fO/lMckVwzQIajRDx43TFeJV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nDVww/btri5kGU0fO/lMckVwzQIajRDx43TFeJV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nDVww/btri5kGU0fO/lMckVwzQIajRDx43TFeJV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnDVww%2Fbtri5kGU0fO%2FlMckVwzQIajRDx43TFeJV1%2Fimg.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;599&quot; data-filename=&quot;456px-Internet_map_in_February_82.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클래스의 등장&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP 주소의 총 개수: 4,294,967,296&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;계산 방법: 256 _ 256 _ 256 * 256&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;클래스는 IP 주소를 네트워크 영역과 호스트 영역으로 나누는 방법이자 약속입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클래스는 크게 5가지 (A, B, C, D, E) 클래스로 나뉩니다. 네트워크 크기에 따른 구분을 위해 클래스를 나눴습니다. 하나의 네트워크에서 몇 개의 호스트 IP를 가질 수 있냐는 차이가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;A,B,C를 알면 됩니다. D,E는 멀티캐스트용, 연구용으로 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;327&quot; data-filename=&quot;img.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ppgFQ/btri4XrF8uC/1coYNd3rn82LQitOkcsDCK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ppgFQ/btri4XrF8uC/1coYNd3rn82LQitOkcsDCK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ppgFQ/btri4XrF8uC/1coYNd3rn82LQitOkcsDCK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FppgFQ%2Fbtri4XrF8uC%2F1coYNd3rn82LQitOkcsDCK%2Fimg.jpg&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;327&quot; data-filename=&quot;img.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;A 클래스&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Network: 8bit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Host: 24bit&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;108&quot; data-filename=&quot;image-20211021013422128.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/satEQ/btri5IOitc4/AZMsDZUwnPT2DjSwLdqink/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/satEQ/btri5IOitc4/AZMsDZUwnPT2DjSwLdqink/img.png&quot; data-alt=&quot;출처: https://wonit.tistory.com/554&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/satEQ/btri5IOitc4/AZMsDZUwnPT2DjSwLdqink/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsatEQ%2Fbtri5IOitc4%2FAZMsDZUwnPT2DjSwLdqink%2Fimg.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;108&quot; data-filename=&quot;image-20211021013422128.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://wonit.tistory.com/554&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;A Class는 하나의 네트워크가 가질 수 있는 호스트 수가 제일 많기 때문에 대규모 네트워크 집단에서 사용했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;A클래스에서 &lt;code&gt;첫 번째 옥텟 - 8bit&lt;/code&gt;은 네트워크 부분을 나타내고 &lt;code&gt;나머지 부분 - 24 bit&lt;/code&gt;은 호스트 부분입니다. 초기의 미국 대형 기업들이 선점해갔습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP주소를 32자리 2진수로 표현했을 때, 맨 앞자리 수가 항상 0인 경우가 바로 A클래스입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉 &lt;code&gt;0xxx xxxx.xxxx xxxx. xxxx xxxx. xxxx xxxx&lt;/code&gt;과 같은 형태입니다. 가질 수 있는 범위로는&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;0000 0000. 0000. 0000. 0000 0000. 0000 0000 ~ 0111 1111. 1111 1111. 1111 1111. 1111 1111&lt;/code&gt;이고 이를 십진수로 표현하면 &lt;code&gt;0.0.0.0 ~ 127.255.255.255&lt;/code&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;A클래스에서 네트워크 주소는 가장 작은 네트워크인 1.0.0.0과 가장 큰 네트워크인 126.0.0.0까지로 규정되어 있으며(0xxx xxxx에서 x가 가질 수 있는 경우의 수가 네트워크 범위입니다. 여기서 127은 제외되는 것이 약속입니다), 참고로 네트워크에서 0은 호스트 부분을 뜻합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;따라서 호스트 주소가 가질 수 있는 개수는 2^24 -2(모든 자리 값이 0일 경우 네트워크 주소, 모두 1일경우 브로드캐스트 주소로 사용하기 때문에)개가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예를 들어 13.0.0.0 네트워크 주소를 할당 받았다고 치겠습니다. 여기서 13은 네트워크 부분이고, 나머지 0.0.0에 호스트 IP를 할당할 수 있습니다. 십진수 0.0.0은 2진수로 표현하면 총 24개의 2진수로 표현이 가능하고 이는 곧 2^24개의 호스트 IP를 가질 수 있음을 의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;십진수로 나타내면 &lt;code&gt;13.0.0.0 ~ 13.255.255.255&lt;/code&gt;입니다. 여기서 &lt;code&gt;13.0.0.0&lt;/code&gt;은 네트워크 주소, &lt;code&gt;13.255.255.255&lt;/code&gt;는 브로드캐스트 주소로 사용되고 그 사잇값이 호스트 IP로 사용할 수 있는 주소가 되겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;B 클래스&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Network: 16bit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Host: 16bit&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;106&quot; data-filename=&quot;image-20211021014523900.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vUqdo/btri66A847g/nUgiKzDLk5K3F4h4CFxY31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vUqdo/btri66A847g/nUgiKzDLk5K3F4h4CFxY31/img.png&quot; data-alt=&quot;출처: https://wonit.tistory.com/554&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vUqdo/btri66A847g/nUgiKzDLk5K3F4h4CFxY31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvUqdo%2Fbtri66A847g%2FnUgiKzDLk5K3F4h4CFxY31%2Fimg.png&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;106&quot; data-filename=&quot;image-20211021014523900.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://wonit.tistory.com/554&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;중규모의 네트워크 집단에서 사용했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;B클래스는 반드시 10으로 시작합니다. 2진수로 표현하면 &lt;code&gt;10xx xxxx. xxxx xxxx. xxxx xxxx. xxxx xxxx&lt;/code&gt;입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;B클래스의 IP 범위는 &lt;code&gt;128.0.0.0 ~ 191.255.255.255&lt;/code&gt;이고 네트워크 범위는 &lt;code&gt;10xx xxxx. xxxx xxxx&lt;/code&gt;에서 x들이 가질 수 있는 경우의 수인 2^14개입니다. 다르게 계산해 보면 첫 번째 옥텟의 범위는 &lt;code&gt;128 ~ 191&lt;/code&gt;이고, 두 번째 옥텟은 8bit (256) 이므로 2^6 * 2^8 = 2^14(16384)개가 되겠습니다. 호스트 주소 범위는 16bit로 2^16 - 2개입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;C클래스&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Network: 24bit&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Host: 8bit&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;124&quot; data-filename=&quot;image-20211021014822944.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NDIAU/btri6mEhGP5/8syMZck2dQppkobgeedVy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NDIAU/btri6mEhGP5/8syMZck2dQppkobgeedVy1/img.png&quot; data-alt=&quot;출처: https://wonit.tistory.com/554&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NDIAU/btri6mEhGP5/8syMZck2dQppkobgeedVy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNDIAU%2Fbtri6mEhGP5%2F8syMZck2dQppkobgeedVy1%2Fimg.png&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;124&quot; data-filename=&quot;image-20211021014822944.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://wonit.tistory.com/554&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;소규모의 네트워크 집단에서 사용했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;C클래스는 반드시 110으로 시작합니다. 첫 번째 옥텟은 &lt;code&gt;192 ~ 223&lt;/code&gt;으로 2^5, 나머지 2개의 옥텟은 8bit이므로 32 _ 256 _ 256 = 2,097,152개가 C클래스의 총 네트워크 수입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;D, E클래스&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;특수한 목적(실험, 연구, 개발)으로 이미 예약되어 있는 구간입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;235&quot; data-filename=&quot;image-20211021014836783.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mQBEQ/btri5kUrR0e/lh1HqQ4cPimvNpX3tyAYW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mQBEQ/btri5kUrR0e/lh1HqQ4cPimvNpX3tyAYW1/img.png&quot; data-alt=&quot;출처: https://wonit.tistory.com/554&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mQBEQ/btri5kUrR0e/lh1HqQ4cPimvNpX3tyAYW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQBEQ%2Fbtri5kUrR0e%2Flh1HqQ4cPimvNpX3tyAYW1%2Fimg.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;235&quot; data-filename=&quot;image-20211021014836783.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://wonit.tistory.com/554&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;중요) 클래스 계산 간단하게 하는 방법&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클래스 별로 첫 번째 옥텟의 범위가 정해져 있습니다. A ~ E로 이동할수록 앞에서부터 1비트씩 채워진다고 기억하면 편합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;A클래스는 0000 0000 ~ 0111 1111 (0 ~ 127)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;B클래스는 1000 0000 ~ 1011 1111 (128 ~ 191)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;C클래스는 1100 0000 ~ 1101 1111 (192 ~ 223)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;D클래스는 1110 0000 ~ 1110 1111 (224 ~ 239)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;E클래스는 1111 0000 ~ 1111 0111 (240 ~ 255)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;각 클래스별 최상위 비트 ~ 다음 클래스 최상위 비트 까지의 숫자로 나타내면 아래와 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;A클래스는 00000000.00000000.00000000.00000000&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;B클래스는 10000000.00000000.00000000.00000000 (128)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;C클래스는 11000000.00000000.00000000.00000000 (192)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;D클래스는 11100000.00000000.00000000.00000000 (224)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;E클래스는 11110000.00000000.00000000.00000000 (240)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉 A클래스가 움직일 수 있는 범위는 이진수로 보면 00000000 ~ 10000000 입니다. 00000001 ~ 01111111 까지라고 표현할 수도 있습니다. 즉 0 ~ 127로 클래스(네트워크)의 수는 128개입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;A와 B 사이의 127은 그럼 왜 사용하지 못하나요?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자기 자신을 가리키기 위한 목적으로 쓰기 위해 예약된 IP 주소이기 때문입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IPv4의 경우 &lt;code&gt;127.0.0.0 ~ 127.255.255.255&lt;/code&gt;이며, 보통 &lt;code&gt;127.0.0.1&lt;/code&gt;을 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;루프백용으로 넓은 대역을 할당하기에는 아까웠는지 IPv6는 ::1/128, 딱 한 개의 주소만 사용합니다. 보통 시스템에서는 &lt;code&gt;/etc/hosts&lt;/code&gt; 파일 등에 localhost를 127.0.0.1로 연결시켜 두어서, 호스트 이름에 localhost를 입력하면 DNS를 타지 않고 바로 로컬로 연결됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IP 클래스의 비효율성&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;대부분의 사이트는 C 클래스를 사용하기엔 너무 커서 B클래스를 할당받았지만 인터넷의 빠른 발전으로 클래스 B의 주소는 급속도로 소진되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;처음 만들었을 때에는 40억개면 충분하겠다고 생각했지만 지금 기준에는 너무나도 모자라기 때문에 한정된 자원을 체계적으로 잘 나눠 쓰기 위해 고안된 것이 서브넷 마스크(subnet mask)입니다. 1993년, 이 서브넷 마스크를 사용한 CIDR의 등장과 함께 네트워크 클래스는 폐기되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;연습문제 풀어보기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;다음 IP를 보고 클래스, 네트워크 부분, 호스트 부분 맞춰 보세요. IP를 클릭하면 정답이 펼쳐집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;10.3.4.3&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클래스: A&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;네트워크 부분: 10.0.0.0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;호스트 부분:3.4.3&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;132.12.11.4&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클래스: B&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;네트워크 부분: 132.12.0.0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;호스트 부분:11.4&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;203.10.1.1&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클래스: C&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;네트워크 부분: 203.10.1.0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;호스트 부분:1&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;192.12.100.2&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;클래스: C&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;네트워크 부분: 192.12.100.0&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;호스트 부분:2&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;261.124.4.6&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;존재할 수 없는 IP 주소입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;References&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://kim-dragon.tistory.com/9&quot;&gt;https://kim-dragon.tistory.com/9&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC_%ED%81%B4%EB%9E%98%EC%8A%A4&quot;&gt;https://ko.wikipedia.org/wiki/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC_%ED%81%B4%EB%9E%98%EC%8A%A4&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://limkydev.tistory.com/168&quot;&gt;https://limkydev.tistory.com/168&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://raisonde.tistory.com/entry/IP%EC%A3%BC%EC%86%8C-ABC%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B0%8F-%EC%84%9C%EB%B8%8C%EB%84%B7%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4&quot;&gt;https://raisonde.tistory.com/entry/IP%EC%A3%BC%EC%86%8C-ABC%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B0%8F-%EC%84%9C%EB%B8%8C%EB%84%B7%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://wonit.tistory.com/554&quot;&gt;https://wonit.tistory.com/554&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>CS/Network</category>
      <author>Joonon</author>
      <guid isPermaLink="true">https://jdev.tistory.com/89</guid>
      <comments>https://jdev.tistory.com/89#entry89comment</comments>
      <pubDate>Thu, 28 Oct 2021 00:24:24 +0900</pubDate>
    </item>
    <item>
      <title>Nginx, SSL(Letsencrypt)의 설치 및 설정</title>
      <link>https://jdev.tistory.com/87</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;nginx 설치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;sudo apt-get install nginx&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;nginx 서버 블록 설정&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;nginx 설정 파일 수정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;sudo vi /etc/nginx/nginx.conf&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;http {}&lt;/code&gt; 블록 안에 아래의 구문 추가&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;include /etc/nginx/sites-enabled/*.conf; // sites-enabled 디렉토리에서 서버 블록을 찾도록 지시
server_names_hash_bucket_size 64; // 도메인이름 분석하는데 할당되는 메모리 양&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서버 블록 파일 만들기 및 설명&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;sudo vi /etc/nginx/sites-available/j5d202.p.ssafy.io.conf&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;기본 포트인 80을 listen하도록 합니다. 기본 포트를 변경하려면 &lt;code&gt;conf/nginx.conf&lt;/code&gt;의 &lt;code&gt;listen&lt;/code&gt;을 수정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;HTTPS&lt;/code&gt; 연결을 위해 리다이렉트 해줍니다. 이렇게 하면 443 port로 리다이렉트되어, &lt;code&gt;server_name&lt;/code&gt;에 설정해 둔 domain에 해당하는 곳으로 요청하게 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;장고 관련 처리는 &lt;code&gt;/api/v1&lt;/code&gt; 으로 보낼 것입니다. &lt;code&gt;proxy_pass&lt;/code&gt;로는 &lt;code&gt;WSGI&lt;/code&gt; 중 하나인 &lt;code&gt;gunicorn&lt;/code&gt;의 소켓을 사용하여 처리했으며, 이는 ubuntu에서 &lt;code&gt;localhost&lt;/code&gt;로 간주됩니다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;(중요!!) 따라서 django의 &lt;code&gt;settings.py&lt;/code&gt;의 &lt;code&gt;ALLOWED_HOST&lt;/code&gt;에 localhost가 있어야 합니다!! 그렇지 않으면 에러가 발생합니다.  &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이로서 클라이언트 측에는 포트 번호 및 정확한 경로를 보여주지 않으면서 올바르게 리다이렉트 할 수 있게 되었습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;server {
        listen 443 ssl;
        listen [::]:443 ssl;

        server_name j5d202.p.ssafy.io www.j5d202.p.ssafy.io;

        ssl_certificate /home/ubuntu/docker_volume/fullchain.pem;
        ssl_certificate_key /home/ubuntu/docker_volume/privkey.pem;

        root /home/ubuntu/dist;

        index index.html;

        location / {
                try_files $uri $uri/ /index.html;
        }

        location /api/v1 {
                proxy_pass http://unix:/home/ubuntu/Together/backend/gunicorn.sock;
                proxy_redirect off;
                charset utf-8;

                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded_proto $scheme;
                proxy_set_header X-NginX-Proxy true;
        }
}
server {
        listen 80;
        listen [::]:80;

        server_name j5d202.p.ssafy.io www.j5d202.p.ssafy.io;

        return 301 https://$server_name$request_uri;
        index index.html index.htm;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;서버 블록 파일 활성화&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이제 서버 블록 파일을 만들었으니 nginx가 방문자에게 파일을 제공할 수 있도록 활성화합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이를 위해 &lt;code&gt;sites-enabled&lt;/code&gt; 디렉토리에 각 서버 블록에 대한 심볼릭 링크를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/j5d202.p.ssafy.io.conf /etc/nginx/sites-enabled/j5d202.p.ssafy.io.conf&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;nginx 관련 명령어&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;$ sudo apt install nginx
$ sudo systemctl start nginx
$ sudo systemctl stop nginx # nginx 서비스 중단
$ sudo systemctl reload nginx # nginx 설정 리로드
$ sudo nginx -t # nginx 설정 체크 (test)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SSL 설치 및 설정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;letsencrypt 설치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;sudo apt-get install letsencrypt&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;nginx 중지 (도커로 띄워놓지 않은 상태입니다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;sudo systemctl stop nginx&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;인증서 발급&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;sudo letsencrypt certonly --standalone -d j5d202.p.ssafy.io&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;정상적으로 발급되었을 경우 /etc/letsencrypt/live/{도메인 네임}에 키 값을 얻을 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;SSL 옮기기&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;$ sudo cp /etc/letsencrypt/live/j5d202.p.ssafy.io/fullchain.pem &amp;lt;사용할 폴더&amp;gt;
$ sudo cp /etc/letsencrypt/live/j5d202.p.ssafy.io/privkey.pem &amp;lt;사용할 폴더&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;nginx conf 수정&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;server {
        listen 443 ssl;
        listen [::]:443 ssl;

        server_name j5d202.p.ssafy.io www.j5d202.p.ssafy.io;

        ssl_certificate &amp;lt;사용할 폴더 path&amp;gt;/fullchain.pem
        ssl_certificate_key &amp;lt;사용할 폴더 path&amp;gt;/privkey.pem

        root /home/ubuntu/dist;
        index index.html;

        location / {
                try_files $uri $uri/ /index.html;
        }

        location /account {
                proxy_pass https://localhost:8080;
                proxy_redirect off;
                charset utf-8;

                proxy_set_header   X-Real-IP $remote_addr;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded_proto $scheme;
                proxy_set_header   X-NginX-Proxy true;
        }
        location /accounts {
                proxy_pass https://localhost:8080;
                proxy_redirect off;
                charset utf-8;

                proxy_set_header   X-Real-IP $remote_addr;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded_proto $scheme;
                proxy_set_header   X-NginX-Proxy true;
        }
}
server {
        listen 80;
        listen [::]:80;

        server_name j5d202.p.ssafy.io www.j5d202.p.ssafy.io;
        return 301 https://$server_name$request_uri;

        index index.html index.htm;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;nginx 시작&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;sudo systemctl start nginx&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;HTTPS 연결 성공&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;148&quot; data-origin-height=&quot;36&quot; data-filename=&quot;image-20211005130052820.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOEB6R/btrgD3us10f/OC7gJQ1b50e2b5ZLJpDmMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOEB6R/btrgD3us10f/OC7gJQ1b50e2b5ZLJpDmMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOEB6R/btrgD3us10f/OC7gJQ1b50e2b5ZLJpDmMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOEB6R%2FbtrgD3us10f%2FOC7gJQ1b50e2b5ZLJpDmMk%2Fimg.png&quot; data-origin-width=&quot;148&quot; data-origin-height=&quot;36&quot; data-filename=&quot;image-20211005130052820.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;References&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-on-centos-7#step-three-%E2%80%94-create-new-server-block-files&quot;&gt;how-to-set-up-nginx-server-blocks&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Study/DevOps</category>
      <author>Joonon</author>
      <guid isPermaLink="true">https://jdev.tistory.com/87</guid>
      <comments>https://jdev.tistory.com/87#entry87comment</comments>
      <pubDate>Tue, 5 Oct 2021 13:13:56 +0900</pubDate>
    </item>
    <item>
      <title>MTU와 MSS</title>
      <link>https://jdev.tistory.com/85</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MTU (Maximum Transmission Unit)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MTU란 &lt;code&gt;OSI model&lt;/code&gt;의 3계층, &lt;code&gt;Network Layer&lt;/code&gt;에서 처리할 수 있는 가장 큰 데이터 블록입니다. 네트워크 인터페이스에서 세그멘트 없이 보낼 수 있는 최대 데이터그램 크기 값입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;우리가 주로 사용하는 이더넷의 MTU 값은 일반적으로 1500 바이트이며, 옛날에 모뎀을 통해 접속하던 PPPoE 연결은 1492 바이트였다고 합니다. &lt;code&gt;Gigabit MTU&lt;/code&gt;와 같은 &lt;code&gt;Jumbo Frames&lt;/code&gt;은 1500바이트 이상의 페이로드를 지닌 이더넷 프레임으로, 최대 9000바이트의 페이로드까지 지원합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MSS (Maximum Segment Size)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;MSS는 TCP 상에서의 전송할 수 있는 사용자 데이터의 최대 크기를 의미합니다. MSS는 기본적으로 MTU 값에 기인합니다. 예를 들어 &lt;code&gt;Ethernet&lt;/code&gt;일 경우, MTU 1500에 IP 헤더크기 (최소 20byte), TCP 헤더 크기 (최소 20byte)를 제외한 1460이 MSS 값이 됩니다. RFC1323에서 정의한 타임스탬프 옵션이 확장되어 사용되면 12바이트가 늘어 1448 바이트가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TCP 프로토콜 연결 시 SYN 패킷을 보낼 때 MSS를 포함하게 됩니다. SYN 패킷을 들여다 보면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;code&gt;0x0204 0x05B4&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;80&quot; data-filename=&quot;syn_packet_mss.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ltxy0/btrgMzebQmQ/CBpeRnUNQXSrzWt99KarG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ltxy0/btrgMzebQmQ/CBpeRnUNQXSrzWt99KarG1/img.jpg&quot; data-alt=&quot;출처: PacketInside.com&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ltxy0/btrgMzebQmQ/CBpeRnUNQXSrzWt99KarG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fltxy0%2FbtrgMzebQmQ%2FCBpeRnUNQXSrzWt99KarG1%2Fimg.jpg&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;80&quot; data-filename=&quot;syn_packet_mss.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: PacketInside.com&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;값을 볼 수 있습니다. &lt;code&gt;02&lt;/code&gt;는 MSS 옵션의 시작점을 뜻하고 &lt;code&gt;04&lt;/code&gt;는 옵션의 크기(4바이트), &lt;code&gt;0x05B4&lt;/code&gt;는 크기를 뜻합니다. &lt;code&gt;05b4&lt;/code&gt; 값이 1460바이트입니다. 이렇게 MSS 크기를 전송하면 받는 측에서도 어떤 크기로 전송해야 할지 알고 준비하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Where does this limit come from?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3계층의 한계는 2계층에서 비롯됩니다. 2계층은 frame을 사용하는 &lt;code&gt;Data Link Layer&lt;/code&gt;로, 각 프레임은 최대 크기에 한계가 있습니다. 이더넷 표준을 예로 들면, 최대 프레임 사이즈가 1518 bytes입니다. 이더넷의 헤더는 18 bytes 이므로, 나머지 1500를 패킷으로 사용할 수 있게 됩니다. 그러므로 이더넷 패킷 MTU는 1500 바이트가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;265&quot; data-filename=&quot;MTU_MSS.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/18T43/btrgBmg94PP/wXkcVUy9C0bwbXBj5HXLHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/18T43/btrgBmg94PP/wXkcVUy9C0bwbXBj5HXLHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/18T43/btrgBmg94PP/wXkcVUy9C0bwbXBj5HXLHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F18T43%2FbtrgBmg94PP%2FwXkcVUy9C0bwbXBj5HXLHk%2Fimg.png&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;265&quot; data-filename=&quot;MTU_MSS.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Fragmentation (IP 단편화, 분할)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;호스트는 자체 네트워크의 MTU는 확실히 알고 있습니다. 그러나 더 높은 경로에 있는 링크의 MTU를 알 수 있는 방법은 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;예를 들어 컴퓨터의 &lt;code&gt;NIC Network Interface Controller&lt;/code&gt;의 MTU는 1500인데, WAN에 연결하는 MTU는 1400인 경우가 있습니다. 컴퓨터의 MTU가 더 커서 전송하지 못하는 상황이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;114&quot; data-filename=&quot;MTU_MSS-2.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHYh9R/btrgFSr9RGg/voNYEafS2vFPTgL3xlkkCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHYh9R/btrgFSr9RGg/voNYEafS2vFPTgL3xlkkCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHYh9R/btrgFSr9RGg/voNYEafS2vFPTgL3xlkkCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHYh9R%2FbtrgFSr9RGg%2FvoNYEafS2vFPTgL3xlkkCK%2Fimg.png&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;114&quot; data-filename=&quot;MTU_MSS-2.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;해결책은 단편화입니다. 패킷이 MTU보다 크면 장치(주로 라우터)가 패킷을 작은 fragments들로 나눕니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;각각의 fragments들은 여전히 패킷이지만, 원래의 것보다 크기만 약간 작을 뿐입니다. 패킷들은 목적지로 잘 움직입니다. 목적지의 기기는 조각들을 다시 모아서 원래의 패킷으로 재조립하고 정상적으로 처리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;듣기만 하면 기가 막힌 솔루션인데 하나 단점이 있습니다. 먼저 각 조각에 중복된 IP 헤더 때문에 원래의 크기보다 더 많은 트래픽이 전송되게 됩니다. 즉, 효율성이 낮습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;또한 패킷을 나누는 라우터와 재조립하는 기기에 처리를 위한 오버헤드를 추가합니다. 만약 한 조각이라도 누락되거나 손상되면? 다시 전체 패킷을 보내야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;방화벽 또한 조각들과 관련해 문제를 일으킬 수 있습니다. 단편화는 가급적 피해야 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;단편화 방지&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TCP MSS&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;TCP의 MSS 크기를 낮춥니다. 즉, 페이로드를 조절합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;PMTUD&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;PMTUD&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;PMTUD란 목적지로 가는 경로상에 존재하는 링크들 중 MTU값이 가장 작은 링크의 MTU 값을 확인하는 과정을 말합니다. IPv6에서 패킷의 분할을 위해 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IPv6에서는 오직 출발지 장비만이 패킷을 분할할 수 있도록 규정해 놓았습니다. 그 이유는 IPv4에서 목적지로 가는 경로상의 중간 라우터들이 무분별한 분할을 수행하며 발생했던 라우팅 속도 저하와 관련된 문제 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;229&quot; data-filename=&quot;image-20211003205425350.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YJoFr/btrgMujIvta/KZFxApuAhzjhBkhYohXABk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YJoFr/btrgMujIvta/KZFxApuAhzjhBkhYohXABk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YJoFr/btrgMujIvta/KZFxApuAhzjhBkhYohXABk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYJoFr%2FbtrgMujIvta%2FKZFxApuAhzjhBkhYohXABk%2Fimg.png&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;229&quot; data-filename=&quot;image-20211003205425350.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;IPv6에서는 위 문제를 해결하기 위해 출발지에서만 분할이 가능하도록 해 두었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;243&quot; data-filename=&quot;image-20211003205723250.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7XEiq/btrgBIK1p6C/kzn43wrKPYbXEL10iRAtOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7XEiq/btrgBIK1p6C/kzn43wrKPYbXEL10iRAtOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7XEiq/btrgBIK1p6C/kzn43wrKPYbXEL10iRAtOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7XEiq%2FbtrgBIK1p6C%2Fkzn43wrKPYbXEL10iRAtOK%2Fimg.png&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;243&quot; data-filename=&quot;image-20211003205723250.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;PMTUD의 동작&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위와 같이 출발지 장비가 패킷을 알맞게 분해하기 위해서는 PMTUD 과정을 반드시 거쳐야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;251&quot; data-filename=&quot;image-20211003205752833.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be7LbT/btrgBgucHUh/xOmSUM1ag58UtN6TdmMhEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be7LbT/btrgBgucHUh/xOmSUM1ag58UtN6TdmMhEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be7LbT/btrgBgucHUh/xOmSUM1ag58UtN6TdmMhEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe7LbT%2FbtrgBgucHUh%2FxOmSUM1ag58UtN6TdmMhEK%2Fimg.png&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;251&quot; data-filename=&quot;image-20211003205752833.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;호스트 A가 먼저 패킷을 분할해서 전송&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;라우터 A가 패킷을 받고 나서 링크 B의 MTU 크기를 확인. 받은 패킷의 크기가 링크 B의 MTU보다 크면 호스트 A에 패킷 크기 초과 메시지를 재전송&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;반복&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;3~6: 더 이상 패킷 크기 초과 메시지를 받지 않게 되면 가장 작은 MTU인 500바이트로 분할하여 전송한다. 이후 호스트 A는 주기적으로 다시 자신의 링크 MTU 크기에 맞게 패킷을 분할하여 전송하며, 경로상의 최소 MTU 값의 변동을 확인한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Each Application's MTU&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;436&quot; data-filename=&quot;image-20211003203451359.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pMs7g/btrgGszU9JQ/nX5L7Q1cvEimhzcdVG0Vh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pMs7g/btrgGszU9JQ/nX5L7Q1cvEimhzcdVG0Vh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pMs7g/btrgGszU9JQ/nX5L7Q1cvEimhzcdVG0Vh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpMs7g%2FbtrgGszU9JQ%2FnX5L7Q1cvEimhzcdVG0Vh1%2Fimg.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;436&quot; data-filename=&quot;image-20211003203451359.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;윈도우 MTU 확인&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;netsh 명령어로 인터페이스 정보를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;134&quot; data-filename=&quot;image-20211003202357498.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tzHyx/btrgBKa3NpW/S04YwYPQ30HdrUYAD0rkx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tzHyx/btrgBKa3NpW/S04YwYPQ30HdrUYAD0rkx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tzHyx/btrgBKa3NpW/S04YwYPQ30HdrUYAD0rkx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtzHyx%2FbtrgBKa3NpW%2FS04YwYPQ30HdrUYAD0rkx0%2Fimg.png&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;134&quot; data-filename=&quot;image-20211003202357498.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그리고 ping 명령어로도 알아 볼 수 있습니다. -ㅣ로 데이터 크기를 지정할 수 있는데, MTU 크기 값 이상이 되면 Fragment(단편) 메시지를 볼 수 있게 되어 이걸로 MTU를 알아볼 수 있게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;199&quot; data-filename=&quot;image-20211003202841402.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxRt48/btrgHDVN1SP/BDaMJFBumNCknzU7ym5EuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxRt48/btrgHDVN1SP/BDaMJFBumNCknzU7ym5EuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxRt48/btrgHDVN1SP/BDaMJFBumNCknzU7ym5EuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxRt48%2FbtrgHDVN1SP%2FBDaMJFBumNCknzU7ym5EuK%2Fimg.png&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;199&quot; data-filename=&quot;image-20211003202841402.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;1472 크기를 지정하니 잘 보내고 응답도 잘 받습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;왜 1472바이트를 보냈나요?&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;위에서 보았듯 인터페이스에 설정된 값은 1500바이트 입니다. 여기서 &lt;code&gt;IP 헤더&lt;/code&gt;가 20바이트이고 &lt;code&gt;ICMP(ping에 사용되는 프로토콜) 헤더&lt;/code&gt; 가 8바이트 &lt;code&gt;(TYPE, CODE, CHECKSUM, DATA)&lt;/code&gt;입니다. 즉 1500 - 28 = 1472 바이트가 최대가 되는 것입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;ICMP는 IP 데이터그램을 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그럼 이번엔 1472보다 1 큰 1473 바이트를 보내 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;125&quot; data-filename=&quot;image-20211003203028967.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wFpfI/btrgMzFgdcY/3JcFMt3hAMK0wk7GSaCKqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wFpfI/btrgMzFgdcY/3JcFMt3hAMK0wk7GSaCKqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wFpfI/btrgMzFgdcY/3JcFMt3hAMK0wk7GSaCKqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwFpfI%2FbtrgMzFgdcY%2F3JcFMt3hAMK0wk7GSaCKqk%2Fimg.png&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;125&quot; data-filename=&quot;image-20211003203028967.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Fragment가 필요하다고 나타납니다. 한번에 전송할 수 있는 값이 1472 바이트가 맞네요.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;방화벽으로 Ping의 허용, 블록 (ICMP Echo Requests)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;개인적으로 배포한 블로그가 아닌, &lt;code&gt;Tistory, Naver&lt;/code&gt;같은 상용 서비스에 핑을 보내 보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;174&quot; data-filename=&quot;image-20211003203640650.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6puD0/btrgAWbDIqd/SUpRCmhBFyuKVx8o2c3gi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6puD0/btrgAWbDIqd/SUpRCmhBFyuKVx8o2c3gi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6puD0/btrgAWbDIqd/SUpRCmhBFyuKVx8o2c3gi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6puD0%2FbtrgAWbDIqd%2FSUpRCmhBFyuKVx8o2c3gi1%2Fimg.png&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;174&quot; data-filename=&quot;image-20211003203640650.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;오, 역시 막히네요. 쓸데없는 핑을 다 받아 주면 리소스가 낭비될 테니 당연한 일입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;방화벽으로 핑을 허용하고 막는 방법에 대한 글은 &lt;a href=&quot;https://www.howtogeek.com/howto/windows-vista/allow-pings-icmp-echo-request-through-your-windows-vista-firewall/&quot;&gt;링크&lt;/a&gt;에 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;긴 글 읽어 주셔서 감사합니다. 잘못된 내용, 오타는 댓글로 알려주세요. 적극적으로 수정하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;References&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://ipwithease.com/ip-mtu-and-mss/&quot;&gt;https://ipwithease.com/ip-mtu-and-mss/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://lyb1495.tistory.com/68&quot;&gt;https://lyb1495.tistory.com/68&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://networkdirection.net/articles/network-theory/mtu-and-mss/&quot;&gt;https://networkdirection.net/articles/network-theory/mtu-and-mss/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://garimoo.github.io/study/2018/03/26/MSS_MTU.html&quot;&gt;https://garimoo.github.io/study/2018/03/26/MSS_MTU.html&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;http://www.packetinside.com/2013/02/mtumaximum-transmission-unit.html&quot;&gt;패킷 전송 크기를 지정하는 MTU&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://www.cisco.com/c/ko_kr/support/docs/ip/generic-routing-encapsulation-gre/25885-pmtud-ipfrag.html&quot;&gt;https://www.cisco.com/c/ko_kr/support/docs/ip/generic-routing-encapsulation-gre/25885-pmtud-ipfrag.html&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://www.howtogeek.com/howto/windows-vista/allow-pings-icmp-echo-request-through-your-windows-vista-firewall/&quot;&gt;How to Allow Pings (ICMP Echo Requests) Through Your Windows Firewall&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://kb.netgear.com/24015/How-do-I-change-the-MTU-size-on-my-Nighthawk-router&quot;&gt;How do I change the MTU size on my Nighthawk router?&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;a href=&quot;https://hoonheui.tistory.com/entry/PMTUD&quot;&gt;PMTUD&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>CS/Network</category>
      <author>Joonon</author>
      <guid isPermaLink="true">https://jdev.tistory.com/85</guid>
      <comments>https://jdev.tistory.com/85#entry85comment</comments>
      <pubDate>Sun, 3 Oct 2021 21:48:15 +0900</pubDate>
    </item>
    <item>
      <title>[Programmers] 위클리 챌린지 8주차_최소직사각형</title>
      <link>https://jdev.tistory.com/83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;비교적 간단한 문제입니다. 원 라인 코딩으로도 바꿔 보았습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1632923141716&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(sizes):
    h, l = 0, 0
    for size in sizes:
        if min(size) &amp;gt; l:
            l = min(size)
        if max(size) &amp;gt; h:
            h = max(size)
    return l*h

# 위 로직을 한줄로
def solution(sizes):
    return max(max(x) for x in sizes) * max(min(x) for x in sizes)

print(solution([[60, 50], [30, 70], [60, 30], [80, 40]]))&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS/Python</category>
      <author>Joonon</author>
      <guid isPermaLink="true">https://jdev.tistory.com/83</guid>
      <comments>https://jdev.tistory.com/83#entry83comment</comments>
      <pubDate>Wed, 29 Sep 2021 22:46:07 +0900</pubDate>
    </item>
    <item>
      <title>[Programmers] 신규 아이디 추천</title>
      <link>https://jdev.tistory.com/82</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;차근차근 풀면 되는 문자열 문제입니다. indexing 전에 빈 문자열이 되었는지 체크하는 것을 잊지 말도록 합시다.&lt;/p&gt;
&lt;pre id=&quot;code_1632286488226&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import re
def solution(new_id):
    tmp = new_id
    # 1
    tmp = tmp.lower()
    # 2
    tmp = re.sub(&quot;[^a-z0-9_\-.]&quot;, &quot;&quot;, tmp)
    # 3
    tmp = re.sub(&quot;\.{2,}&quot;, &quot;.&quot;, tmp)
    # 4
    if tmp == '':
        tmp = 'a'
    if tmp[0] == '.':
        tmp = tmp[1:]
    if tmp == '':
        tmp = 'a'
    if tmp[-1] == '.':
        tmp = tmp[:len(tmp)-1]
    # 5
    if tmp == '':
        tmp = 'a'

    # 6
    if len(tmp) &amp;gt;= 16:
        tmp = tmp[:15]
    if tmp[-1] == '.':
        tmp = tmp[:len(tmp)-1]

    #7
    if len(tmp) &amp;lt;= 2:
        tmp += tmp[-1]*(3-len(tmp))
    return tmp

# 반례
solution(&quot;=.=&quot;)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS/Python</category>
      <author>Joonon</author>
      <guid isPermaLink="true">https://jdev.tistory.com/82</guid>
      <comments>https://jdev.tistory.com/82#entry82comment</comments>
      <pubDate>Wed, 22 Sep 2021 13:55:43 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ] 14503 - 로봇 청소기</title>
      <link>https://jdev.tistory.com/80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;구현 문제. 차근차근 구현하면 어렵지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택을 사용할 필요는 없는데 머리에서 그려보기 편해서 써봤다.&lt;/p&gt;
&lt;pre id=&quot;code_1631942805794&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sys import stdin

R, C = map(int, stdin.readline().split())
r, c, d = map(int, stdin.readline().split())
arr = [list(map(int, stdin.readline().split())) for x in range(R)]
visited = [[0]*C for x in range(R)]

# 'left', 'bottom', 'right', 'up'
head = [(0,-1), (1,0), (0,1), (-1,0)]

# 바라보는 방향 init
idx_head = 3 - d

result = 0

stack = [(r, c)]
while stack:
    cr, cc = stack.pop()

    if not visited[cr][cc]:
        visited[cr][cc] = 1
        result += 1
    able = False
    # 방향전환으로 갈 수 있는 방향 찾기
    # 왼쪽부터 가야 하므로 방향부터 옮기고 찾기
    for i in range(4):
        idx_head = (idx_head+1)%4
        # 갈 수 있으면 전진 (스택에 추가)
        nr, nc = cr + head[idx_head][0], cc + head[idx_head][1]
        if 0 &amp;lt;= nr &amp;lt; R and 0 &amp;lt;= nc &amp;lt; C and not visited[nr][nc] and not arr[nr][nc]:
            stack.append((nr, nc))
            able = True
            break

    # for문을 빠져나왔다는건 다 돌았는데도 갈데가 없다는 것
    # 후진 가능하면 후진
    br, bc = cr - head[idx_head][0], cc - head[idx_head][1]
    if not able:
        if 0 &amp;lt;= br &amp;lt; R and 0 &amp;lt;= bc &amp;lt; C and not arr[br][bc]:
            stack.append((br, bc))
print(result)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS/Python</category>
      <author>Joonon</author>
      <guid isPermaLink="true">https://jdev.tistory.com/80</guid>
      <comments>https://jdev.tistory.com/80#entry80comment</comments>
      <pubDate>Sat, 18 Sep 2021 14:28:02 +0900</pubDate>
    </item>
  </channel>
</rss>