출처 : 사물인터넷을 위한 파이썬 네트워크 프로그래밍
파이썬 네트워크 기본 모듈
이번 시간에는 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(마스크)로 표현된다. 자세한 설명은 아래 페이지 참조
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 속성은 인터페이스가 속한 네트워크를 알려준다.
'Study > 네트워크' 카테고리의 다른 글
네트워크 프로그래밍 - UDP Echo Server와 Echo Client (0) | 2024.07.14 |
---|---|
네트워크 프로그래밍 - Socket, Echo server와 Echo client (Python) (1) | 2024.06.16 |
6. The Link Layer and LANs (3) (1) | 2023.06.14 |
6. Link Layer and LANs (2) (1) | 2023.06.14 |
6. The Link Layer and LANs (1) (1) | 2023.06.14 |