9.5. IP 주소¶
하드웨어 주소는 동일한 로컬 케이블이나 무선 셀에 있는 다른 장치들 중에서 한 장치를 골라냅니다. 그 일에는 적합하지만 로컬 세그먼트를 벗어나면 쓸모가 없습니다. 옆 건물에 있는 스위치는 이를 기준으로 라우팅할 수 없는데, 스위치가 MAC 주소를 학습하게 해 주는 기반 메커니즘이 하나의 세그먼트 안에서만 동작하기 때문입니다.
네트워크 계층은 장치가 어느 케이블에 연결되어 있는지와 무관한 두 번째 종류의 주소로 이 문제를 해결합니다. 이런 종류의 주소의 이름은 인터넷 프로토콜 주소, 즉 IP 주소이며, “인터넷 프로토콜”이라는 부분은 인터넷상의 모든 호스트가 주소를 보내거나 전달할 때 따르는 규칙의 집합을 가리킵니다. 현재 인터넷은 두 가지 버전의 주소 체계를 병행하여 사용합니다. IPv4(더 오래된 형태로, 소규모 네트워크에서는 여전히 지배적)와 IPv6(더 새로운 형태로, 천천히 이를 대체하고 있음)입니다.
9.5.1. IP 주소란¶
IP 주소는 인터넷상의 모든 장치를 고유하게 식별할 수 있을 만큼 큰 숫자입니다. 이 절의 나머지 부분에서 사용하는 사람이 읽을 수 있는 형태로 작성되지만, 패킷 헤더에서는 단지 고정 크기의 정수일 뿐입니다.
IPv4 주소는 길이가 32비트이며 점으로 구분된 네 개의 십진수로 작성되고, 각 숫자는 1바이트입니다:
192.168.1.42 8.8.8.8 10.0.0.1
32비트는 약 40억 개의 가능한 주소를 제공하는데, IPv4가 1970년대에 설계되었을 때는 충분해 보였지만 2010년대 초에는 충분하지 않았습니다.
IPv6 주소는 길이가 128비트이며 콜론으로 구분된 네 자리 16진수 여덟 그룹으로 작성됩니다:
2001:0db8:85a3:0000:0000:8a2e:0370:7334연속된 0은
::로 줄일 수 있고 그룹 내의 선행 0은 생략할 수 있으므로, 위 주소는 일반적으로2001:db8:85a3::8a2e:370:7334로 작성됩니다.
그 외에는 두 주소 체계는 서로 다른 언어입니다. IPv4 호스트는 게이트웨이의 도움 없이는 IPv6 호스트로 직접 패킷을 보낼 수 없습니다. 카메라의 network 및 socket 모듈은 둘 다 지원합니다. 이 튜토리얼에서는 카메라가 접속할 대부분의 로컬 네트워크가 여전히 IPv4 전용이기 때문에 예제에서 IPv4를 사용하지만, 주소만 바꾸면 이후의 모든 내용이 IPv6에서도 정확히 동일하게 동작합니다.
9.5.2. IP 주소는 무엇을 위한 것인가¶
IP 주소는 패킷이 인터넷상의 어느 호스트를 향한 것인지를 알려줍니다. 목적지에 직접 도달하는 방법을 모르는 라우터는 다른 어떤 라우터가 아마 알 것이라고 보고 패킷을 그쪽으로 전달합니다. 패킷은 라우터 사이를 한 번씩 건너뛰며 매번 목적지에 조금씩 가까워지고, 마침내 목적지의 로컬 세그먼트에 있는 라우터가 마지막 홉을 전달합니다.
그 홉 단위 동작이 인터넷을 여러 개의 작은 섬이 아니라 하나의 거대한 네트워크로 작동하게 만드는 것입니다. 다음 페이지에서는 홉이 어떻게 선택되는지를 다루며, 이 페이지는 단지 주소에 관한 것입니다.
9.5.3. 카메라가 주소를 얻는 방법¶
방금 Wi-Fi 네트워크에 접속한 카메라는 무언가와 통신하기 전에 IP 주소가 필요합니다. 이를 위한 두 가지 일반적인 방법이 있습니다.
첫 번째는 자동 할당입니다. 카메라가 로컬 네트워크에 주소를 요청하고, 주소를 나눠 주는 장치는 라우터입니다. 즉, 로컬 네트워크를 더 넓은 인터넷에 연결하는 박스죠. 대부분의 가정 및 소규모 사무실 환경에서는 동일한 물리적 박스가 유선 장치가 연결되는 스위치와 무선 장치가 연결되는 Wi-Fi 액세스 포인트의 역할도 함께 하므로, “라우터”, “스위치”, “액세스 포인트”가 모두 동일한 하드웨어일 수 있습니다. 라우터는 DHCP(Dynamic Host Configuration Protocol)라는 작은 서비스를 실행하는데, 이 서비스는 사용 가능한 주소 풀을 유지하고 새로 도착한 각 장치에 하나를 골라 일정 시간 동안 임대합니다. DHCP는 그 김에 라우터를 통해 카메라에 몇 가지 유용한 다른 구성 정보도 함께 전달합니다:
목적지가 로컬 네트워크 밖에 있을 때 외부로 나가는 트래픽을 보낼 주소(기본 게이트웨이, 즉 라우터 자신의 주소); 그리고
example.com처럼 사람이 읽을 수 있는 이름을 IP 주소로 변환해 주는 하나 이상의 네임 서버(name server) 의 주소입니다. 이 이름 조회 서비스는 DNS, 즉 Domain Name System(도메인 이름 시스템)이라고 하며, 이름과 DNS 에서 자세히 다룹니다.
이 모든 것은 링크가 올라오는 동안 자동으로 이루어집니다. 카메라는 이 중 어느 것도 명시적으로 요청할 필요가 없습니다. 이전 페이지의 예제에서 isconnected()가 True를 반환하는 순간, 카메라는 이미 자신의 주소, 게이트웨이, 네임 서버를 갖고 있습니다.
두 번째 옵션은 정적 구성입니다. 일부 배포 환경에서는 다른 장치들이 먼저 조회하지 않고도 카메라에 도달할 수 있도록 카메라에 알려진 주소를 부여하고자 합니다. ipconfig() 메서드는 주소, 게이트웨이, 네임 서버를 수동으로 설정합니다:
wlan.ipconfig(addr4=("192.168.1.50/24", "192.168.1.1"))
wlan.ipconfig(dns="192.168.1.1")
정적 구성은 취약합니다(두 장치에 실수로 같은 주소가 부여되면 충돌합니다). 재정의해야 할 특정한 이유가 나타나지 않는 한 DHCP 기본값을 사용하세요.
카메라가 IP 주소를 갖게 되면 인터넷(적어도 그중 로컬 네트워크 부분)에 합류한 것입니다. 이제 다른 장치들은 그 주소로 카메라에 패킷을 보낼 수 있고, 카메라도 그들에게 패킷을 보낼 수 있습니다.
9.5.4. 넷마스크와 /24¶
위의 정적 예제에서 주소 끝에 있는 /24는 넷마스크입니다. IP 주소 그 자체만으로는 로컬 네트워크가 어디서 끝나는지 알 수 없습니다. 192.168.1.50은 작은 가정 네트워크의 수백 개 주소 중 하나일 수도 있고, 더 큰 네트워크의 수천 개 중 하나일 수도 있습니다. 넷마스크는 주소 중 얼마만큼이 네트워크를 가리키고 얼마만큼이 그 안의 호스트를 가리키는지를 알려줍니다.
/24는 “32비트 중 처음 24비트가 네트워크를 가리키고, 마지막 8비트가 호스트를 가리킨다”는 의미입니다. 192.168.1.50/24의 경우 이는 주소를 네트워크에 해당하는 192.168.1과 호스트에 해당하는 .50으로 나누어, 동일한 로컬 네트워크에 약 254개의 장치를 위한 공간을 남깁니다. /16은 호스트 부분에 더 많은 비트를 남겨 한 네트워크에 훨씬 더 많은 장치를 수용하고, /30은 호스트 주소를 두 개만 남겨 점대점 링크에 맞습니다.
넷마스크는 주소와 같은 점으로 구분된 표기법으로 4바이트 숫자로 작성되기도 합니다. /24는 255.255.255.0과 동등하며, 각 바이트를 “네트워크 부분에 속하는 모든 비트”로 읽으면 됩니다. 두 형태는 서로 교환 가능하며, 다음 하위 절의 ipconfig() 리더는 마침 4바이트 형태를 반환합니다.
이 분할이 도대체 왜 중요한지, 즉 장치가 넷마스크를 사용해 목적지가 로컬 네트워크에 있는지 아니면 게이트웨이를 통해 나가야 하는지를 어떻게 결정하는지, 그리고 대부분의 가정 네트워크가 왜 /24로 귀결되는지는 사설 네트워크와 NAT에서 다룹니다.
9.5.5. 주소를 다시 읽어 오기¶
인자 없이 호출한 ipconfig() 메서드는 활성 구성을 반환합니다. addr4 뷰는 IP 주소와 넷마스크를 반환합니다:
>>> wlan.ipconfig("addr4")
('192.168.1.50', '255.255.255.0')