출처 : 사물인터넷을 위한 파이썬 네트워크 프로그래밍
파이썬 네트워크 기본 모듈
이번 시간에는 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 속성은 인터페이스가 속한 네트워크를 알려준다.
'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 |