9.1. 왜 네트워크인가¶
하드웨어 제어는 카메라가 특정한 다른 전선상의 특정한 다른 장치와 대화할 수 있는 방법을 제공했습니다. 카메라와 단일 동반 보드 사이의 UART. 카메라와 같은 짧은 버스에 매달린 센서들 사이의 I2C. 하나의 견고한 버스를 공유하는 소수의 모듈 사이의 CAN. 각 경우는 같은 형태를 따릅니다: 두 당사자(또는 알려진 소규모 그룹), 하나의 공유 매체, 그 매체 위의 바이트가 무엇을 의미하는지에 대한 그들 사이의 합의.
9.1.1. 그 형태는 확장되지 않습니다¶
점대점 패턴은 양쪽 끝이 가깝고, 양쪽 끝이 미리 알려져 있으며, 스크립트가 어느 전선으로 대화할지 고를 수 있는 한 작동합니다. 이러한 제약 중 어느 하나라도 깨지면 배선만으로는 더 이상 충분하지 않게 됩니다.
많은 상대. 하나의 서버에 보고하는 50대의 카메라로 이루어진 네트워크는 일대일로 배선할 수 없습니다. 서버에 충분한 UART가 없고, 케이블을 까는 것이 불가능할 것입니다.
같은 전선상에 있지 않은 상대. 공장 안의 카메라와 시내 건너편 사무실의 대시보드는 시리얼 케이블을 공유할 수 없습니다. 두 건물 사이에 이미 깔려 있는 인프라가 무엇이든 그것을 통해 그들 사이에 어떤 경로가 존재해야 합니다.
미리 알려져 있지 않은 상대. 결과를 클라우드에 게시하는 카메라는 배선도에서 어느 서버와 대화할지 고르지 않습니다. 클라우드의 주소는 스크립트가 런타임에 조회하여 데이터를 라우팅하는 무엇입니다.
하나의 케이블상의 많은 프로그램. 오늘날의 노트북은 브라우저, 채팅 앱, 화상 통화, 백업을 실행하면서 이 모두가 동시에 같은 네트워크 인터페이스를 통해 대화합니다. UART처럼 하나의 대화가 전선을 “소유”할 수는 없습니다.
이러한 각각의 실패는 서로 다른 종류 의 주소 지정 문제입니다. 이 모두를 함께 해결하려면 전선과 보드 레이트 이상의 것이 필요합니다.
9.1.2. 네트워크란 무엇인가¶
네트워크 는 각 쌍이 자신만의 전용 링크를 필요로 하지 않고도 많은 수의 컴퓨터 중 임의의 것이 다른 임의의 것과 메시지를 주고받을 수 있게 하는 인프라입니다. 세 가지 속성이 네트워크를 단순히 큰 시리얼 케이블 이상의 무엇으로 만듭니다:
공유 매체. 많은 장치가 같은 케이블, 스위치, 또는 무선 채널에 연결됩니다. 둘 이상의 대화가 같은 물리적 링크에 들어갈 수 있도록 차례를 번갈아 쓰거나 다중화합니다.
논리 주소. 각 장치는 어느 케이블에 꽂혀 있는지와 무관하게 그것을 식별하는 번호를 가집니다. 메시지를 보낸다는 것은 특정 전선을 연결하는 것이 아니라 그 번호를 메시지에 쓰는 것을 의미합니다.
라우팅. 송신자와 수신자가 같은 로컬 세그먼트상에 있지 않을 때, 그들 사이 의 인프라가 메시지를 한 홉씩 운반합니다. 종단점은 경로를 알지 못합니다. 단지 서로의 주소를 알 뿐입니다.
사무실 Wi-Fi에 연결된 노트북이 먼 데이터 센터의 서버에 도달하는 것은 이 세 가지를 모두 사용합니다. Wi-Fi 링크는 공유 무선 매체이고, 노트북과 서버는 각각 자신의 논리 주소를 가지며, 메시지는 둘 사이에 자리한 인프라가 무엇이든 그것을 한 번에 한 홉씩 전달되며 통과합니다. 사용자가 링크를 클릭하면 노트북이 패킷을 보내고, 네트워크가 나머지를 처리합니다.
9.1.3. 그러면 cam은?¶
카메라는 네트워크에서 노트북과 정확히 같은 역할을 합니다. 네트워크에 합류할 때 논리 주소를 받아오고, 나가는 메시지를 다른 장치들의 논리 주소로 지정하며, 인프라가 그것들을 라우팅하게 합니다.
하드웨어 제어 장들로부터 바뀌는 것은 인터페이스 입니다. UART 인스턴스를 열고 거기에 바이트를 쓰는 대신, 스크립트는 소켓 을 열고 거기에 바이트를 씁니다. 소켓은 네트워크로의 종단점으로, UART 인스턴스가 전선으로의 종단점인 것과 같습니다. 소켓과 전선 사이의 요소들 – 프레임, 패킷, 라우팅 테이블, 스위치, 무선 – 은 모두 그 아래에 자리하며 Python 코드에게는 대부분 보이지 않습니다.
앞으로의 페이지들은 “소켓을 열고 바이트를 보낸다”는 추상화가 마법이 아니라 필연적으로 느껴지도록 그 요소들을 계층별로 자세히 설명합니다.