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 호스트로 직접 패킷을 보낼 수 없습니다. 카메라의 networksocket 모듈은 둘 다 지원합니다. 이 튜토리얼에서는 카메라가 접속할 대부분의 로컬 네트워크가 여전히 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바이트 숫자로 작성되기도 합니다. /24255.255.255.0과 동등하며, 각 바이트를 “네트워크 부분에 속하는 모든 비트”로 읽으면 됩니다. 두 형태는 서로 교환 가능하며, 다음 하위 절의 ipconfig() 리더는 마침 4바이트 형태를 반환합니다.

이 분할이 도대체 왜 중요한지, 즉 장치가 넷마스크를 사용해 목적지가 로컬 네트워크에 있는지 아니면 게이트웨이를 통해 나가야 하는지를 어떻게 결정하는지, 그리고 대부분의 가정 네트워크가 왜 /24로 귀결되는지는 사설 네트워크와 NAT에서 다룹니다.

9.5.5. 주소를 다시 읽어 오기#

인자 없이 호출한 ipconfig() 메서드는 활성 구성을 반환합니다. addr4 뷰는 IP 주소와 넷마스크를 반환합니다:

>>> wlan.ipconfig("addr4")
('192.168.1.50', '255.255.255.0')