도커로 구축한 랩에서 혼자 실습하며 배우는 네트워크 프로토콜 입문 #3-1

자손킴 @jasonkim@hackers.pub

3장. 레이어 3 프로토콜 이해하기

L3 라우터

내부 네트워크(LAN, Local Area Network)와 외부 네트워크(WAN, Wide Area Network)를 연결하는 장비. 일반적으로 인터넷에 연결하기 위한 WAN 포트, 내부 네트워크에 연결하기 위한 LAN 포트로 구성된다.

네트워크 계층 (L3)

인터넷이란 네트워크를 서로(inter) 연결한다는 의미이다.

데이터 링크 계층(L2)는 같은 네트워크에 있는 장비들을 연결하는 것만을 담당하는데 비해 네트워크 계층(L3)는 데이터 링크 계층에서 연결된 네트워크를 합쳐 더 큰 네트워크를 만들 수 있게 해준다.

네트워크 계층(L3)는 이더넷이나 와이파이로 만들어진 네트워크를 연결하고 서로 다른 네트워크에 있는 단말과의 연결성을 보장하기 위한 계층이다. 데이터 링크 계층이 MAC주소를 기반으로 서로 통신하는 것 처럼, 네트워크 계층은 IP주소를 사용하여 서로 통신한다.

IP(Internet Protocol)

IPv4와 IPv6 두 가지 버전이 있으며 서로 호환되지 않는다. 이 책에서는 IPv4만 다룬다.

IP는 IP헤더와 IP페이로드로 구성되어 있고, 이렇게 캡슐화된 패킷을 IP패킷이라고 한다.

이더넷 헤더의 타입코드는 0x8000으로 정의되어 있다. RFC791에서는 IP를 구성하는 필드와 포맷을 정의하고 있다.

IP 단편화

패킷의 최대 크기는 MTU에 지정된 크기를 넘을 수 없다. 이 크기를 넘는 패킷을 보내려고 하면 패킷을 더 작은 단위로 나누는 IP 단편화(Fragment)를 수행해야 한다. 단편화된 패킷은 식별자, 플래그, 프래그먼트 오프셋을 조합하여 다시 원본 패킷으로 복구된다.

PMTUD(Path MTU Discovery)

IP 패킷이 지나는 경로에 지정된 MTU는 제각각이다. 단편화가 무차별적으로 발생하면 단편화와 재조립(ressembly)로 인한 상당한 비효율이 발생한다. 이것을 방지하는 역할을 하는 것이 플래그의 두 번째 비트인 DF(Don’t Fragment) 비트이다.

DF 비트가 0이면 단편화를 허용하고, 1이면 단편화를 허용하지 않는다. 만약 단편화가 허용되지 않은 패킷이 패킷 크기보다 더 작은 MTU를 가진 경로를 지나가야 하는 경우 해당 경로에서는 패킷을 폐기처분하고 ICMP를 사용해 패킷 발신지에 자신의 MTU를 알려준다.

이 과정을 반복하면 패킷 발신지는 해당 경로에서 가장 작은 MTU값을 알게되고 이를 통해 경로상 모든 지점에서 단편화가 필요없는 크기의 패킷을 보낼 수 있게 된다.

IP 헤더의 구성

  • 버전
    • IP 버전을 표시한다. IPv4는 4를 사용한다.
  • 헤더 길이
    • IP헤더 길이를 4바이트 단위로 환산한 값이 들어간다. 일반적인 IP 헤더는 20바이트이기 때문에 보통 5가 사용된다.
  • ToS(Type of Service)
    • 우선순위 제어, 대역폭 제어, 혼잡 제어 등의 QoS(Quality of Service)에서 사용한다.
    • 첫 6비트는 DSCP(Differentiated Services Code Point) 필드이다.
      • 우선순위 제어 및 대역폭 제어에 사용
    • 나머지 2비트는 ECN(Explicit Congestion Notification) 필드이다.
      • 혼잡 통지용
  • 패킷길이
    • IP헤더와 IP페이로드를 합친 전체 패킷 길이를 나타내는 2바이트 필드.
    • 2바이트 이므로 지정가능한 최대 크기는 65535이다.
  • 식별자
    • 패킷 구별을 위한 고유 번호. 단편화된 패킷은 동일한 식별자를 복사하여 가진다.
  • 플래그
    • 첫 번째 비트: 미사용
    • 두 번째 비트: DF(Don’t Fragment) 비트. PMTUD참고
    • 세 번째 비트: MF(More Fragment) 비트.
      • 1이면 뒤에 단편화된 패킷이 더 온다는 의미이고, 0이면 단편화된 패킷이 뒤에 없다는 의미이다.
  • 프래그먼트 오프셋
    • 단편화된 패킷의 시작부분이 원래 패킷의 어느 위치인지를 나타내는 필드
  • TTL(Time To Live)
    • IP 패킷의 수명을 나타낸다. IP 세계에서의 수명은 “경유하는 라우터 수”를 의미한다. 또한 경우하는 라우터 수를 “홉(Hop) 수”라고 한다. TTL은 라우터를 통과 할 때 마다 1씩 줄어들고 0이 되면 폐기된다. IP패킷을 폐기한 라우터는 ICMP를 사용해 패킷을 폐기 하였음을 발신자에게 알린다.
  • 프로토콜 번호
    • IP 페이로드가 어떤 프로토콜을 사용하는 나타내는 필드
    • 주요 프로토콜로는 TCP, UDP, ICMP 등이 있다.
  • 헤더 체크섬
    • IP 헤더의 무결성 검증용. 1의 보수 연산을 사용.
  • 발신자/목적지 IP주소
    • IP 주소란 IP 네트워크에 연결된 장비를 나타내는 식별 ID 이다. L2에서는 MAC으로 서로를 식별했다면, L3에서는 IP주소로 서로를 식별한다.
  • 옵션
    • IP 패킷 확장 기능을 위한 가변 길이 필드. 책 저자에 따르면 실무에서 사용하는 것을 본 적은 없다고 한다.
  • 패딩
    • IP 헤더는 사양에 의해 4바이트의 배수가 되어야 한다. 옵션의 길이는 동적이기 때문에 4바이트를 맞추기 위해 패딩을 0으로 채워 4바이트 배수로 맞춘다.

IP 주소 및 서브넷 마스크

IP 주소

네트워크 계층은 IP 주소로 이루어진 계층이다. IP 주소는 IP 네트워크에 연결된 장비를 식별하는 ID이다. 32비트(4바이트)로 구성되며 192.168.0.1, 10.1.99.254 와 같이 8비트(1바이트)마다 점으로 구분하여 10진수로 표기한다. 점으로 구분된 그룹을 “옥텟”이라고 하며, 맨 앞부터 1옥텟, 2옥텟, 3옥텟, 4옥텟 이라고 표현한다.

IP 주소는 “네트워크 부분”과 “호스트 부분” 두 가지로 구성되어 있다. 네트워크 부분은 어떤 IP 네트워크에 속하는지를 나타내고, 호스트 부분은 속해있는 네트워크중 어떤 장비인지를 나타낸다.

“네트워크 부분”을 식별하기 위해서는 서브넷 마스크를 사용한다. 따라서 IP 주소가 할당 될 때는 서브넷 마스크가 반드시 같이 할당 된다.

서브넷 마스크

IP 주소가 할당 될 때는 서브넷 마스크라는 32비트 값과 함께 할당된다. 서브넷 마스크는 IP 주소의 네트워크 부분과 호스트 부분을 구분 할 수 있게 해준다.

패킷을 전송하고자 하는 목적지가 내부인지 외부인지에 따라 L2 통신(스위칭)또는 L3 통신(라우팅)여부가 달라진다. 목적지의 IP 주소가 내부인지 외부인지 알기 위해서는 서브넷 마스크를 사용한다.

IP 주소의 네트워크 부분은 32비트중 앞에서부터 연속된 비트열이 표시하고, 네트워크 부분을 제외한 나머지 비트열이 호스트 부분을 표시한다.

예를 들어, 192.168.11.1 이라는 IP 주소에서 앞 24비트가 네트워크 부분이라면 다음과 같이 구분 할 수 있다.

11000000 10101000 00001011 00000001
-------------------------- --------
^ 네트워크 부분                ^ 호스트 부분

호스트 부분이 8비트이기 때문에, 이 네트워크가 가질 수 있는 호스트 개수는 2^8 - 2 개 인다. 2개가 빠지는 이유는 아래의 “제외 주소” 섹션에서 설명한다.

서브넷 마스크 표기법에는 “10진수 표기”와 “CIDR(Classless Inter-Domain Routing) 표기” 두 가지 표기법이 있다.

10진수 표기는 IP 주소와 마찬가지로 32비트를 8비트씩 4그룹으로 나누어 10진수로 변환 한 후 점으로 구분하여 표기한다.

CIDR 표기는 IP 주소와 서브넷 마스크를 함께 표현하는 표기법으로 IP 주소 뒤에 / 와 서브넷 마스크(2진수)의 1의 개수를 표기한다.

위에서 예시로 든 192.168.11.1 은 앞 24비트를 네트워크 부분이므로 서브넷 마스크가 2진법으로 다음과 같다.

11111111 11111111 11111111 00000000

이것은 10진수 표기로는 255.255.255.0이고 CIDR로는 192.168.11.1/24 라고 표기한다.

IP 주소 할당 방식

IP 주소는 0.0.0.0에서 255.255.255.255 까지 2^32 개가 있다. 이 IP들을 어디서부터 어디까지 어떻게 사용해야 하는지가 RFC에 정의되어 있다. 초기에는 IP를 클래스풀이라는 방식으로 각 기관이나 단체에 할당했는데, 이 방식은 IP의 낭비가 너무 심하다는 단점이 있었다. 그렇기 때문에 현재는 이점을 보완 하고자 클래스리스 주소 지정 방식을 사용하고 있다.

클래스풀 주소 지정

IP 주소 앞쪽 4비트까지의 패턴을 “주소 클래스”라는 이름의 카테고리로 분류하고, 그중에서 IP주소를 할당하는 방식. 주소 클래스는 클래스 A 부터 클래스 E 까지 5가지가 있다.

각 클래스별로 서브넷 마스크도 8비트 단위로 고정적으로 지정되어 있다. 바로 이 점이 IP 낭비의 원인이 된다.

  • 클래스 A
    • 앞 비트 패턴: 0
    • 용도: 유니캐스트 (대규모)
    • 서브넷 마스크: 255.0.0.0 (앞 8비트 /8)
    • 호스트 개수: 2^(32-8) - 2
  • 클래스 B
    • 앞 비트 패턴: 10
    • 용도: 유니캐스트 (중규모)
    • 서브넷 마스크: 255.255.0.0 (앞 16비트 /16)
    • 호스트 개수: 2^(32-16) - 2
  • 클래스 C
    • 앞 비트 패턴: 110
    • 용도: 유니캐스트 (소규모)
    • 서브넷 마스크: 255.255.255.0 (앞 24비트 /24)
    • 호스트 개수: 2^(32-24) - 2
  • 클래스 D
    • 앞 비트 패턴: 1110
    • 용도: 멀티캐스트
    • 서브넷 마스크: 없음
  • 클래스 E
    • 앞 비트 패턴: 1111
    • 용도: 연구, 예약용
    • 서브넷 마스크: 없음

클래스리스 주소 지정

주소 클래스에 구애받지 않고 IP 주소를 할당하는 방식. “서브넷팅”, “CIDR”이라고도 한다.

192.168.11.1은 클래스 지정 방식에서는 서브넷 마스크가 앞 24비트로 고정 될 수 밖에 없었지만 클래스리스에서는 필요한 호스트 개수에 따라서 16비트, 28비트처럼 원하는 만큼 네트워크 비트를 지정하여 사용 할 수 있다.

서브넷 마스크를 28비트로 지정하면 다음과 같이 표현 할 수 있다.

                               네트워크 부분 >
            -------------------------------
IP 주소:     11000000 10101000 00001011 00000001
                                           ----
                                           < 호스트 부분

서브넷 마스크: 11111111 11111111 11111111 11110000 

하위 4비트가 호스트 부분이기 때문에 2^4 - 2 개 만큼의 호스트를 사용 할 수 있다.

공인 IP 주소와 사설 IP 주소

IP 주소를 사용 위치에 따라 분류하기도 한다. 사용 위치는 지역 구분 같은 물리적 위치가 아닌, IP네트워크의 논리적 위치를 의미한다.

사용 위치는 공인(public, global) IP 주소와 사설(private, local) IP 주소로 구분 할 수 있다. 공인 IP 주소는 인터넷에서 고유한 IP 주소이고, 사설 IP 주소는 기업, 가정등의 한정된 네트워크안에서만 고유한 IP 주소이다.

공인 IP 주소

ICANN(Internet Corporation for Assigned Names and Numbers)이라는 비영리 법인인 IANA와 그 산하 조직(RIR, NIR, LIR)에 의해 계층적으로 관리되고 있어서 자유롭게 사용 할 수 없는 IP 주소이다.

공인 IP 주소는 최근 할당 재고가 고갈되어 신규 할당에 제한을 두고 있다.

사설 IP 주소

조직 내에서 자유롭게 할당 할 수 있는 IP 주소이다. 조직 내부에서만 유효한 IP 주소이며 인터넷에 직접 연결 할 수 없다. 사설 IP를 쓰는 장비가 인터넷을 통해 외부와 통신을 하기 위해서는 NAT(Network Address Translation)를 사용해 사설 IP 주소를 외부 네트워크와 연결된 라우터등의 공인 IP 주소로 변환하여 통신하여야 한다. NAT는 뒤에서 자세히 설명한다.

사설 IP 주소 영역은 RFC1918에서 표준화 되어 있으며 클래스 A, B, C에서 일정 영역만큼 떼어서 지정해 두었다.

  • 클래스 A
    • 시작 IP 주소: 10.0.0.0
    • 종료 IP 주소: 10.255.255.255
    • 서브넷 마스크: 255.0.0.0 (/8)
  • 클래스 B
    • 시작 IP 주소: 172.16.0.0
    • 종료 IP 주소: 172.31.255.255
    • 서브넷 마스크: 255.240.0.0 (/12)
  • 클래스 C
    • 시작 IP 주소: 192.168.0.0
    • 종료 IP 주소: 192.168.255.255
    • 서브넷 마스크: 255.0.0.0 (/16)

사설 IP 주소도 클래스리스로 사용 할 수 있다. 다만 서브넷 마스크 지정시 IP 주소 범위가 정해진 구간을 벗어나지 않도록 해당 주소가 속한 클래스의 CIDR보다는 같거나 크도록 신경써야 한다.

예를 들어, 10.2.3.4 라는 사설 IP 주소를 사용하고자 한다면, 서브넷 마스크는 8이상이 되어야 한다.

사설 IP 주소가 이렇게 결정된 이유는 IANA가 공인 IP를 이제 막 나눠주기 시작하던 시점에 해당 구간이 비어있었기 때문이라고 한다.

제외 주소

IP 주소 중에서도 특수한 용도로 사용되며 장비에 설정할 수 없는 주소가 몇 가지 있다. “네트워크 주소”, “브로드캐스트 주소”, “루프백 주소”등이 그것이다. 이중 네트워크 주소와 브로드캐스트 주소가 서브넷 마스크에서 설명한 호스트에서 사용할 수 없는 2가지 주소에 해당한다.

네트워크 주소

호스트 부분의 비트가 모두 0인 IP 주소로 네트워크 그 자체를 나타낸다. 192.168.11.1/24 라면 192.168.11.0 이 네트워크 주소가 된다.

참고로 IP 주소와 서브넷 마스크가 모두 0인 0.0.0.0/0은 “기본 경로 주소”가 된다. 이것은 “모든 네트워크”를 의미한다.

브로드캐스트 주소

호스트 부분의 비트가 모두 1인 IP 주소로, 같은 네트워크에 존재하는 모든 장비를 나타낸다. 192.168.11.1/24 인 경우 브로드캐스트 주소는 192.168.11.255이다.

IP 주소와 서브넷 마스크가 모두 1인 255.255.255.255/255 는 “제한 브로드캐스트 주소”이며, 이것은 자신의 IP 주소/네트워크 주소를 모르는 경우나 DHCP로 IP 주소등을 얻을 때 사용된다.

루프백 주소

자기 자신을 나타내는 IP 주소로 RFC1122에 표준화 되어 있다. 루프백 주소는 1 옥텟이 127 인 IP 주소이다. 127로 시작하면 아무 주소나 상관 없지만 대게 127.0.0.1/8을 사용한다.

ICMP(Internet Control Message Protocol)

ICMP는 IP레벨의 통신을 확인하거나 각종 오류를 알리는 등의 역할을 한다.

ICMP 패킷 형식

ICMP는 IP 헤더의 프로토콜 번호 1을 사용하는 IP 패킷이다. 유형, 코드, 체크섬, ICMP 페이로드로 구성된다. 각 유형별로 지정된 코드 번호가 있다.

다양한 ICMP 유형 및 코드

  • Echo Request/Echo Reply
    • Echo는 IP 레벨의 통신 상태를 확인할 때 사용한다. 요청의 유형은 0이고 코드는 8이다. 응답의 유형은 0이고 코드도 0이다.
  • Destination Unreachable
    • 라우터가 서로 다른 네트워크에 있는 단말에 IP 패킷을 전달하는 동작을 라우팅이라고 한다. 라우터가 목적지 IP 주소로 IP 패킷을 라우팅하지 못했을 경우, 라우터는 ICMP 유형 3을 사용하여 Destination Unreachable을 알리고 해당 IP 패킷을 파기한다.
  • Destination Unreachable - Fragmentation needed but DF bit set
    • IP 단편화에서 설명한 DF 비트와 관련이 있다. 어떤 경로의 MTU가 IP패킷 크기보다 작으면서 DF 비트가 0이면 발신 장비에 이 ICMP 패킷을 전송하여 패킷을 더 작게 보내도록 유도한다.
  • Time-to-live Exceeded
    • IP 패킷의 TTL이 0이 되어 폐기 했을때 이를 발신 장비에 알리는 ICMP 패킷이다. 이것은 traceroute 명령에도 사용된다. traceroute 명령은 TTL을 1로 시작하여 하나씩 증가시켜가며 IP 패킷을 전송하며 어떤 경로를 통해 목적지 IP 주소까지 도달하는지 확인한다.
4

No comments

If you have a fediverse account, you can comment on this article from your own instance. Search https://hackers.pub/ap/articles/019a4008-da76-7f82-ab8b-ace99a33e445 on your instance and reply to it.