Outdated/Network

[Network] IPv4(Internet Protocol version 4)

해달 2018. 8. 30. 12:30

[Network] IPv4(Internet Protocol version 4)

IPv4는 우리가 흔히 말하는 IP 주소를 뜻한다. OSI 7 계층에선 네트워크 계층에 속하며, TCP/IP 계층에선 인터넷 계층에 속하는 비연결지향 프로토콜(connectionless protocol)이다. 여기서, 비연결지향 프로토콜이라는 것은 상대에게 연락 없이 그냥 데이터를 전송하고 끝내는 프로토콜이다. 반대로는 연결지향 프로토콜(connection-oriented protocol)이 있다.

많이 접해본 개념이기에 독자 대부분이 기본적인 것은 잘 알 것이라고 생각한다. IP 주소의 길이는 32비트이며, 8비트 단위로 점을 찍어 표시(dotted decimal)한다. 32비트면 약 42억 7천만개의 장비에 할당이 가능하다. 억이라는 단위가 흔히 접할 수 있는 단위는 아니라 상당히 많은 것처럼 느껴지나, 인터넷의 급속한 발달로 인하여 1983년부터 할당되어 오던 IP 주소는 2011년 4월 15일부로 모든 IP 주소가 할당되었다. 주소가 모자름에 따라 더 많은 주소를 할당할 수 있고, 그 간의 IPv4의 문제점을 고친 IPv6이 존재하나, IP 주소를 아끼려는 트릭(?)과 완전한 이전으로의 어려움 등 여러가지 이유로 혼용하고 있다. 그렇기 때문에 아직 IPv4는 유효하다.

IPv4 패킷

IPv4의 패킷의 구조부터 살펴보자.

IPv4
IPv4 패킷

  • 버전(version, 4비트) : IP의 버전이다. 항상 4이다.
  • 헤더 길이(header length, 4비트) : 헤더의 길이를 워드(word) 단위로 표현한다. 최소 길이는 20바이트이다.
  • DSCP(Differentiated Services Code Point, 6비트) : 패킷의 우선순위를 표시한다.
  • ECN(Explicit Congestion Notification, 2비트) : 종단장비 간에 혼잡발생을 통보한다.
  • 전체 패킷 길이(total packet length, 16비트) : 헤더와 데이터를 포함한 전체 패킷의 길이를 바이트 단위로 나타낸다.
  • ID(IDentifier, 16비트) : 각 패킷마다 고유하게 부여하는 일련번호이다. 패킷 분할 시 재조립할 때 이용된다.
  • 플래그(flag, 3비트) : 패킷 분할 가능 여부와 분할 시 최종 패킷임을 표시한다.
  • 분할 위치(fragment offset, 13비트) : 분할된 패킷이 원래 패킷의 어느 위치에 있었는지 표시한다.
  • TTL(Time To Live, 8비트) : 패킷 루핑(looping)을 방지한다. 라우터가 패킷을 중계할 때마다 값을 1씩 감소시키고, 0이 되면 패킷을 폐기한다.
  • 프로토콜(protocol, 8비트) : 전송 계층의 프로토콜을 표시한다.
  • 헤더 체크섬(header checksum, 16비트) : IP 헤더의 에러 발생 여부를 확인한다.
  • 송신지 IP 주소(source IP address, 32비트), 수신지 IP 주소(destination IP address, 32) : 송신지와 수신지의 IP 주소를 나타낸다.
  • 옵션(option, 최대 40바이트) : 패킷 전송경로 기록 등 추가적인 옵션을 사용하기 위한 필드이다. 잘 사용되진 않는다.
  • 데이터(data, 최대 65,515바이트)

주소 표기

앞서 얘기했듯, 주소의 길이는 32비트이며, 사람이 보기 쉽게 8비트 단위로 점을 찍어 표시한다. IP 주소는 네트워크 부분과 호스트 부분으로 나눌 수 있다. 네트워크 부분이 다른 IP 주소를 가진 장비들 간의 통신에는 라우터가 필요하며, 동일하다면 스위치를 이용한다. 여기서, 라우터의 인터페이스에 부여된 IP 주소를 게이트웨이(gateway) 주소라고 한다. 주소에서 호스트 부분이 모두 0이면 네트워크 주소를, 모두 1이면 브로드캐스트 주소를 뜻한다. 이 주소들은 종단장비에 부여할 수 없다.

클래스풀 주소체계

IP 주소는 다음으로 분류된다. 이 주소들을 클래스풀 주소(classful address)라고 한다.

  • 클래스 A 주소
  • 첫 번째 비트가 0인 주소이다.
  • 범위는 0.0.0.0 ~ 127.255.255.255이다.
  • 첫 8비트가 네트워크 부분을 나타낸다.
  • 클래스 B 주소
  • 처음 두 비트가 10인 주소이다.
  • 범위는 128.0.0.0 ~ 191.255.255.255이다.
  • 첫 16비트가 네트워크 부분을 나타낸다.
  • 클래스 C 주소
  • 처음 세 비트가 110인 주소이다.
  • 범위는 192.0.0.0 ~ 223.255.255.255이다.
  • 첫 24비트가 네트워크 부분을 나타낸다.
  • 클래스 D 주소
  • 처음 네 비트가 1110인 주소이다.
  • 범위는 224.0.0.0 ~ 239.255.255.255이다.
  • 네트워크와 호스트 구분이 없이 하나의 그룹을 나타내며, 멀티캐스트(multicast) 통신방식 용도로 사용한다.
  • 클래스 E 주소
  • 처음 네 비트가 1111인 주소이다.
  • 범위는 240.0.0.0 ~ 255.255.255.255이다.
  • 사용이 유보되었다.

살펴보면 실제로 사용할 수 있는 IP 주소는 클래스 A, B, C 주소임을 알 수 있다.

클래스리스 주소체계(서브넷팅)

기본적으로 라우터의 인터페이스가 다르다면 IP 주소의 네트워크 부분도 달라져야 한다. 헌데, 앞서 말했던 주소들로는 네트워크를 충분히 만들기 어려워 보인다. 그래서, 서브넷팅(subneting) 혹은 서브넷 마스킹(subnet masking)이라고 불리는 기법을 통해 이를 극복한다. 이 기술은 하나의 네트워크 주소를 여러 개로 분할하는 것을 말한다. 분할된 각각의 네트워크를 서브넷(subnet)이라고 한다.

서브넷은 서브넷 마스크(subnet mask)를 통해 네트워크를 분리한다. 서브넷 마스크의 갯수는 IP 주소 뒤에 슬래시를 붙이고 적는다. 예를 들어, 테스트용 주소 192.0.2.0/24는 앞에서부터 24비트가 네트워크를 의미한다는 것이다. 즉, 앞의 24비트가 다르다면 다른 네트워크를 뜻하게 되는 것이다. 특별히 서브넷 부분이 모두 0이면 서브넷 제로(subnet zero)라고 한다. 이러한 주소를 클래스리스 주소(classless address)라고 한다.

이 주소 체계는 IP 주소의 낭비 없이 할당할 수 있는 장점이 있다. 예를 들어 보자. 보통 개인의 가정에서 갖고 있는 호스트는 라우터, PC, 노트북 등 많아야 10대도 안될 것이다. 그런데, 여기에 클래스 C 주소를 할당했다면 어떻게 될까? 클래스 C 주소는 24비트가 네트워크 부분을 나타내기에, 할당할 수 있는 호스트는 256대이다. 이는 주소의 낭비로 이어진다. 이런 연유로 현재는 클래스풀 주소체계보다 클래스리스 주소체계를 사용한다.

이런 의문이 들 수도 있겠다. 각각의 서브넷에서 또 서브넷을 만들 수는 없을까? 물론 가능하다. 서로 다른 길이의 서브넷 마스크를 사용할 수 있게 하는 VLSM(Variable Length Subnet Mask) 덕분에 말이다. 이러한 절약 정신 때문에 IP를 최적으로 할당할 수 있게 되었다. 혹여, 자신이 속해있는 그룹의 IP 주소를 직접 할당할 일이 있다면 호스트 대수가 많은 쪽부터 할당하되, 서브넷 마스크는 최대한으로 채우면 된다.

특별한 용도의 주소

이외에도 특별한 용도로 사용되는 주소들이 있다.

  • 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 : 사설(private) IP 주소이다. 추후 NAT 설명시에 살펴본다.
  • 127.0.0.0/8 : 루프백(loopback) 주소이다.
  • 169.254.0.0/16 : 장비가 자동으로 IP 주소를 받아오지 못할 때 스스로에게 부여하는 링크 로컬(link local) 주소이다.
  • 192.0.2.0/24 : 테스트용 주소이다. DDoS를 차단할 때 공격 패킷들을 이 주소로 전송하여 폐기할 수 있다.

경로 축약

IP 주소를 최적으로 할당하면 여러 개의 네트워크가 나올 것이다. 다음과 같이 라우팅 테이블이 각각의 주소를 모두 기입하고 있다면 어떻게 될까?

슬라이드1
호스트 부분은 생략한다

라우터의 자원을 많이 사용하게 될 것이고, 네트워크 상에 어떤 변화가 있을 때마다 주변 라우터에게 알려줘야하니 네트워크가 상당히 번잡해질 것이다. 이를 방지하기 위해 경로 축약(route summary)기법을 이용한다.

수퍼넷팅(superneting), 경로 요약(route summarization)이라고도 불리는 이 기법은 복수 개의 비슷한 네트워크를 하나로 표시하는 것이다. 서브넷팅으로 되돌아가보자. 서브넷팅의 기본 개념은 하나의 IP 주소에서 여러 개의 네트워크를 만드는 것이었다. 즉, 공통된 부분이 존재한다. 경로 축약 기법은 주소 중 공통된 부분만 추려 라우팅 테이블에 저장하는 것이다. 공통된 부분이라는 것은 꼭 모든 부분만을 의미하진 않는다. 가령 192.16.4.0/24, 192.16.5.0/24, 192.16.6.0/24, 192.16.7.0/24 등을 192.16.4.0/22 대신 192.0.0.0/8 식으로 축약할 수도 있다.

슬라이드2
172.16.131.0/24로 축약했다.

경로 축약으로 인해 얻는 효과는 다음과 같다.

  1. 네트워크 변화 정보가 자주 전송되지 않아 네트워크를 안정화시킨다.
  2. 장애처리 및 네트워크 관리가 쉽다.
  3. 라우팅 테이블을 유지하기 위해 필요한 라우터 자원의 낭비를 방지한다.

경로 축약을 해도 정확하게 패킷이 전달되는 이유는 롱기스트 매치 룰(longest match rule)때문이다. 즉, 비트 수가 가장 길게 일치하는 방향으로 라우터가 패킷을 전송한다.

'Outdated > Network' 카테고리의 다른 글

[Network] OSI 참조 모델(OSI reference model)과 TCP/IP  (0) 2018.08.18