[Final] PEP 3144 - IP Address Manipulation Library for the Python Standard Library

원문 링크: PEP 3144 - IP Address Manipulation Library for the Python Standard Library

상태: Final 유형: Standards Track 작성일: 06-Feb-2012

PEP 3144 – Python 표준 라이브러리를 위한 IP 주소 조작 라이브러리

초록 (Abstract)

이 PEP는 Python을 위한 IP 주소 조작 모듈의 설계 및 구현을 제안합니다.

PEP 승인 (PEP Acceptance)

이 PEP는 2012년 5월 15일 Alyssa Coghlan에 의해 승인되었습니다.

동기 (Motivation)

이미 Python을 위한 훌륭한 IP 주소 모듈들이 여럿 존재합니다. 하지만 이들 모두 Pythonic 원칙과 네트워크 엔지니어 및 관리자가 의존하는 단축 표기법 사이의 균형을 맞추는 데 어려움을 겪었습니다. ipaddress 모듈은 이러한 적절한 균형을 맞추는 것을 목표로 합니다.

배경 (Background)

PEP 3144ipaddr는 이전에 표준 라이브러리에 포함될 가능성이 논의된 바 있습니다. 여기에 명시된 라이브러리 버전은 PyPI에 있는 버전 및 이전에 논의되었던 버전과 하위 호환성이 없습니다. 기존 ipaddr 사용자들의 혼동을 피하기 위해, 이 라이브러리 버전은 ipaddress로 이름이 변경되었습니다.

ipaddripaddress의 주요 차이점은 다음과 같습니다.

  • ipaddress*Network 클래스는 strict 플래그가 True로 설정된 ipaddr*Network 클래스와 동일합니다.
  • ipaddress*Interface 클래스는 strict 플래그가 False로 설정된 ipaddr*Network 클래스와 동일합니다.
  • ipaddress의 팩토리 함수(factory functions)는 클래스와의 모호성을 없애기 위해 이름이 변경되었습니다.
  • 몇몇 속성(attributes)도 그 목적을 명확히 하기 위해 이름이 변경되었습니다 (예: network, network_address).
  • ipaddr에서 컨테이너를 반환하던 여러 메서드와 함수(예: subnets, address_exclude, summarize_address_range, collapse_address_list)는 이제 이터레이터(iterators)를 반환합니다.

ipaddressipaddr 간의 하위 호환성이 없는 API 변경으로 인해, 이 모듈은 새로운 “provisional API status”를 사용하여 추가될 것이 제안되었습니다.

명세 (Specification)

ipaddress 모듈은 총 6개의 새로운 공개 클래스를 정의하며, 이들은 IPv4 객체 조작을 위한 3개와 IPv6 객체 조작을 위한 3개로 구성됩니다. 클래스는 다음과 같습니다.

  • IPv4Address / IPv6Address: 개별 주소를 정의합니다. 예를 들어, www.google.com에 대한 A 레코드 쿼리가 반환하는 IPv4 주소(74.125.224.84) 또는 ipv6.google.com에 대한 AAAA 레코드 쿼리가 반환하는 IPv6 주소(2001:4860:4001:801::1011) 등이 있습니다.
  • IPv4Network / IPv6Network: 네트워크 또는 주소 그룹을 정의합니다. 예를 들어, 멀티캐스트 사용을 위해 예약된 IPv4 네트워크(224.0.0.0/4) 또는 멀티캐스트를 위해 예약된 IPv6 네트워크(ff00::/8) 등이 있습니다.
  • IPv4Interface / IPv6Interface: 이 하이브리드 클래스들은 주어진 네트워크 상의 개별 주소를 나타냅니다. 예를 들어, 192.0.2.0/24 네트워크 상의 IPv4 주소 192.0.2.1은 192.0.2.1/24로 참조될 수 있습니다. 마찬가지로, 2001:DB8::/96 네트워크 상의 IPv6 주소 2001:DB8::1은 2001:DB8::1/96으로 참조될 수 있습니다. 컴퓨터 네트워크 인터페이스에 할당된 주소를 이렇게 참조하는 것이 매우 일반적이므로 Interface라는 이름이 붙었습니다.

모든 IPv4 클래스는 특정 특성과 메서드를 공유하며, 이는 주소를 나타내는 데 필요한 비트 수, 특정 특수 IPv4 네트워크 범위에 속하는지 여부 등입니다. 마찬가지로 모든 IPv6 클래스도 특성과 메서드를 공유합니다.

ipaddress는 코드 중복을 최대한 피하기 위해 상속(inheritance)을 광범위하게 사용합니다. 부모 클래스는 비공개이지만 다음과 같이 요약됩니다.

  • _IPAddrBase: 모든 ipaddress 객체에 공통된 메서드를 제공합니다.
  • _BaseAddress: IPv4AddressIPv6Address에 공통된 메서드를 제공합니다.
  • _BaseInterface: IPv4InterfaceIPv6Interface, 그리고 IPv4NetworkIPv6Network에 공통된 메서드를 제공합니다 (ipaddressNetwork 클래스를 Interface의 특수한 경우로 처리합니다).
  • _BaseV4: 모든 IPv4 클래스에 공통된 메서드와 변수(예: _max_prefixlen)를 제공합니다.
  • _BaseV6: 모든 IPv6 클래스에 공통된 메서드와 변수를 제공합니다.

서로 다른 IP 버전의 객체 간 비교는 TypeError를 발생시킵니다. 또한, 서로 다른 _Base 부모 클래스를 가진 객체 간의 비교도 TypeError를 발생시킵니다. _Base 부모 클래스 제한의 효과는 IPv4InterfaceIPv4Network와 비교될 수 있고, IPv6InterfaceIPv6Network와 비교될 수 있다는 것입니다.

참조 구현 (Reference Implementation)

현재 참조 구현은 다음에서 찾을 수 있습니다.

README 및 유닛 테스트를 포함하는 tarball은 다음에서 확인할 수 있습니다.

참조 구현 사용에 대한 자세한 정보는 다음에서 확인할 수 있습니다.

참고 자료 (References)

IPv4와 IPv6의 비교에 대해 Vint Cerf가 보낸 이메일에서, “IPv4 값과 IPv6 값은 비교 불가능하게 취급되어야 한다”는 결론을 내렸습니다. 이는 IPv4 공간이 IPv6의 호스트 공간(0::0/96)에 포함되지만, 이는 유용한 해석이 아니기 때문입니다.

이 문서는 퍼블릭 도메인에 공개되었습니다.

⚠️ 알림: 이 문서는 AI를 활용하여 번역되었으며, 기술적 정확성을 보장하지 않습니다. 정확한 내용은 반드시 원문을 확인하시기 바랍니다.

Comments