파이썬 네트워크 프로그래밍 모듈 - ipaddress 모듈

728x90
반응형

출처 : 사물인터넷을 위한 파이썬 네트워크 프로그래밍

 

파이썬 네트워크 기본 모듈

 

이번 시간에는 IP 주소를 파이썬 프로그램으로 처리하는 방법을 알아본다.

인터넷에서는 호스트를 식별하기 위해 IP 주소를 사용하기 때문에 네트워크로 데이터를 전송할 때 호스트에서 실행되는 프로그램은 IP 주소를 처리할 수 있어야 한다.

 

파이썬의 표준 라이브러리에는 네트워크 서비스를 생성하거나 기존 서비스에 원격으로 접속할 수 있는 다음과 같은 기본 모듈이 포함되어 있다.

 

  • ipaddress : IPv4, IPv6 주소와 네트워크를 만들고 처리하는 모듈
    • IP 주소와 관련된 다양한 작업을 간단하게 처리하게 해주는 모듈이다. 
    • 두 호스트가 같은 서브넷에 있는지 확인
    • 특정 서브넷의 모든 호스트를 대상으로 처리를 반복
    • 문자열이 유효한 IP 주소나 네트워크를 정의하고 있는지 확인
  • socket : 데이터 송수신을 위한 기본 통신 모듈
    • C 소켓 라이브러리에 대한 직접 액세스를 제공
    • 모든 네트워크 서비스와 통신을 위해 사용
    • 가장 기본적인 모듈이며 파이썬을 사용한 통신 프로그램을 작성할 때 가장 많이 사용
  • select : 입출력 모니터링 모듈
    • 운영체제에서 일어나는 여러 가지 입출력 동작을 모니터링하기 위해 사용
    • 소켓이나 파일이 읽기 또는 쓰기 가능으로 되거나 통신 오류가 발생하는지를 모니터링
    • 동시에 여러 연결을 모니터링하는 것이 더 쉬워지고, 폴링 루프를 작성하는 것보다 효율적이다.
    • 윈도우에서는 소켓에 대해서만 select 모듈 사용 가능
  • selectors : 효율적인 입출력 다중화를 위한 모듈
    • select 모듈을 기반으로 동작
    • 여러 소켓을 동시에 감시할 수 있는 고급 인터페이스 제공
    • 네트워크 서버가 여러 클라이언트와 동시에 통신 가능
  • socketserver : 네트워크 서버 작성 모듈
    • 새로운 네트워크 서버를 만드는 데 필요한 많은 반복적인 작업을 추상화
    • 클래스를 결합하여 스레드를 새로 생성하여 사용
    • TCP, UDP를 지원하는 서버 작성 가능
    • 응용 프로그램에서 실제 메시지 처리만 집중 가능
  • asyncio : 비동기 입출력 모듈
    • async/wait 구문의 코루틴을 사용하여 동시성 응용 프로그램을 작성하기 위한 모듈
    • 고성능 네트워크 및 웹 서버, 데이터베이스 연결 라이브러리, 분산 작업 대기열 등을 제공하는 파이썬 비동기 프레임워크를 구현하기 위한 기반으로 사용
    • IP 바인딩 및 높은 수준의 구조화된 네트워크 코드에 적합
  • urllib : URL 관련 프로그래밍 모듈
    • HTTP 서버에 접근하여 요청을 보내고 응답을 받기 위해 사용
  • http : HTTP 프로토콜을 이용한 프로그래밍 모듈
    • HTTP 서버를 구현하기 위해 사용

 

기본 모듈 이외에도 제 3자가 개발한 Twisted, requests 등의 모듈이 있다.

 

 

ipaddress 모듈

 

IP 주소를 나타내는 3가지 클래스가 존재한다.

  • IPv4Address : IPv4 호스트 주소 -> ipaddress.ip_address()
  • IPv4Network : IPv4 네트워크 주소 -> ipaddress.ip_network()
  • IPv4Interface : IPv4 인터페이스 주소 -> ipaddress.ip_interface()

 

 

호스트 주소

  • IP 주소를 사용하여 작업할 때 필요한 기본 단위
  • ipaddress를 이용하여 문자열이나 정수로부터 네트워크 프로그래밍을 위한 주소 객체를 만들 수 있다.
  • ipaddress.ip_address() 생성 함수를 사용해 주소 객체를 만들 수 있다.

 

 

"192.0.2.1" 처럼 IPv4 주소를 나타내는 문자열과 함께 호출하면 IPv4Address 주소 객체가 생성되고, "2001:DB8::1" 처럼 IPv6 주소와 함께 호출하면 IPv6Address 주소 객체가 생성된다.

 

 

IPv4Address()와 IPv6Address() 생성 함수를 사용해 직접 IPv4, IPv6 주소 객체를 만들 수 있다.

 

 

IP 주소를 문자열이나 정수로 표현하려면 str()이나 int()를 사용하면 된다. socket 모듈에서는 주소를 표한하기 위해 문자열 주소를 사용한다.

 

 

네트워크 주소

  • IP 주소 그룹으로 만들어지며 해당 네트워크에 속하는 호스트 주소의 범위를 정의하는 문자열로 구성된다.
  • 네트워크 프로그램에서 네트워크를 다루기 위해서는 네트워크 주소 객체가 필요하다.
  • 네트워크 주소 객체는 network address(네트워크 기본 주소)/network prefix(마스크)로 표현된다. 자세한 설명은 아래 페이지 참조
 

4. Network Layer (Data Plane) (1)

(1) Network Layer 개요 이번 챕터에서 가장 중요한 것은 Data Plane이 어떻게 작동하는지를 아는 것이다. ​ ​ 네트워크는 기본적으로 엣지 파트에서 복잡한 것을 하고 코어 파트에서는 간단하게 동작

zangwoo.tistory.com

 

 

ipaddress 모듈의 ip_network() 생성 함수를 통해 IPv4Network, IPv6Network 네트워크 주소 객체를 생성할 수 있다.

 

 

with_netmask 속성은 네트워크 주소를 네트워크 마스크와 함께 문자열로 나타내고, with_hostmask 속성은 네트워크 주소를 호스트 마스크와 함께 문자열로 나타낸다.

예를 들어 IPv4의 IP 주소가 '192.168.0.0/24' 인 경우 24비트가 네트워크 마스크이므로 네트워크 부분은 192.168.0.0 네트워크 마스크는 255.255.255.0 가 되고, 나머지 8비트가 호스트 마스크이므로 호스트 부분은 0.0.0.0 호스트 마스크는 0.0.0.255가 된다.

 

주의할 점은 네트워크를 나타낼 때 기본 주소에서 호스트 주소 부분은 항상 0으로 표시되어야 하며, 0이 아니면 Value Error가 발생한다. ip_network() 호출 시 strict=False 로 지정하면 호스트 주소 부분이 0으로 변경된다.

 

 

num_addresses 속성을 사용하면 네트워크에 몇 개의 개별 주소가 있는지 알 수 있다.

예를 들어, 192.0.2.0/24 의 경우 8비트가 호스트 주소로 사용되므로 0~255까지 총 256개의 개별 주소가 존재한다.

 

 

네트워크 주소 객체의 hosts() 메소드를 호출하면 해당 네트워크에 속하는 호스트의 주소를 반환한다.

예를 들어, 192.0.2.0/24의 경우 192.0.2.1~192.0.2.254 까지 출력된다.

192.0.2.0은 네트워크 주소, 192.0.2.255는 브로드캐스트 주소로 사용되기 때문에 호스트 주소로는 사용할 수 없다.

 

 

인터페이스 주소

 

  • 네트워크에서 방화벽이나 라우터와 같이 변하지 않는 특정 주소를 나타내기 위해 사용된다.
  • 호스트 주소와 넷 마스크로 표현된다.
  • ip_interface(address) 생성자를 호출하면 address의 타입에 따라 IPv4, IPv6 인터페이스 주소 객체를 리턴한다.
  • 인터페이스 주소 객체는 ip와 network 속성이 있다.

 

 

ip 속성은 호스트 주소, network 속성은 인터페이스가 속한 네트워크를 알려준다.

728x90
반응형