9.20. 마무리¶
여러분은 네트워크 메시지가 카메라에서 외부 세계로 나아가는 길에 거치는 계층들을 두루 살펴보았습니다:
동기 – 네트워크가 존재하는 이유는, 몇 개를 넘는 장치가 통신해야 하거나, 상대방이 같은 선에 있지 않거나, 여러 프로그램이 같은 링크를 동시에 공유하는 순간 점대점 배선이 더 이상 확장되지 않기 때문입니다. 그 답이 공유 매체, 논리적 주소, 그리고 라우팅입니다.
계층 모델 – 다섯 개의 계층이 각각 하나의 문제를 해결하고 다음 계층에 깔끔한 인터페이스를 제공합니다. 물리 계층과 링크 계층은 바로 옆 이웃 사이의 비트와 프레임을 다루고, 네트워크 계층은 인터넷 전반에 걸친 주소 지정과 라우팅을 다루며, 전송 계층은 프로그램 대 프로그램 전달을 다루고, 애플리케이션 프로토콜은 그 모든 것 위에 세워집니다.
하위 계층 – 실용적인 링크 기술로서의 이더넷과 Wi-Fi; MAC 주소는 로컬 세그먼트 상의 하드웨어를 식별합니다. 카메라의
network모듈은 알아 둘 만한 조절 항목 하나를 노출합니다: 어느 Wi-Fi 네트워크에 접속할지입니다. 그 이후로는 그 아래의 모든 것이 자동입니다.네트워크 계층(IP) – IPv4와 IPv6 주소는 어떤 케이블에 꽂혀 있는지와 무관하게 호스트를 식별합니다. 라우터는 패킷이 도착할 때까지 로컬 세그먼트들 사이로 패킷을 홉합니다. 사설 주소 범위와 NAT는 가정 및 사무실 네트워크가 자체 내부 주소 공간과 가장자리에 하나의 공유 공인 주소를 갖는 이유입니다. 외부로 나가는 트래픽은 자유롭게 동작하지만, 들어오는 트래픽은 도움이 필요합니다.
전송 계층 – 포트는 호스트 내부의 프로그램을 식별합니다. 전체
(IP, port)쌍은 하나의 특정 소켓을 식별합니다. UDP는 아무런 보장 없이 자기 완결적인 데이터그램을 한 번에 하나씩 보내는 얇은 계층입니다 – 빠르고, 저렴하며, 손실이 허용될 때 적합한 도구입니다. TCP는 연결 지향적이고 신뢰성 있으며 순서가 보장되는 바이트 스트림입니다 – 대부분의 인터넷 트래픽을 책임지는 일꾼으로, 1회 왕복의 핸드셰이크 지연 시간을 대가로 치릅니다.Python API –
socket.socket은 두 프로토콜 모두를 위한 단일 클래스입니다. UDP에는sendto()/recvfrom()을, TCP에는 connect 또는 listen 패턴에 더해send()/recv()를 사용합니다. 소켓은asyncio와 깔끔하게 어울립니다:asyncio.open_connection()과asyncio.start_server()는 모든 TCP 연결에 reader/writer 쌍을 제공하므로, 여러 동시 대화가 스레딩 없이 하나의 이벤트 루프를 공유합니다.이름과 시간 –
socket.getaddrinfo()는example.com같은 이름을 소켓에 곧바로 건넬 수 있는 IP 주소로 변환합니다.network.hostname()은 캠 자신의 이름을 설정하는데, 라우터는 이를 자신의 로컬 DNS에 등록하고 캠에 내장된 mDNS 응답기는 이를<name>.local로 응답합니다.ntptime.settime()은 동일한 “네트워크에서 무언가를 조회하는” 발상을 벽시계 시간에 적용한 것으로, 공개 NTP 서버에서 가져온 UTC로 온보드 시계를 설정합니다.암호화 –
ssl은 소켓을 TLS로 감쌉니다. 캠에는 인증 기관 저장소가 함께 제공되지 않으므로, 기본 상태에서는 암호화만 얻습니다 – 대화가 더 이상 평문은 아니지만, 캠은 누가 응답했는지 검증하지는 않습니다. 진정한 인증을 위해 – 공개 HTTPS 서버를 검증하거나, 캠을 TLS 서버로 실행하거나, 상호 TLS를 하려면 – 인증서 기반 워크플로를 TLS 인증서 다루기에서 다룹니다. DTLS(UDP 위의 TLS)는 같은 모듈을 같은 방식으로 사용합니다.실제 애플리케이션 프로토콜 – 그 아래의 모든 계층이 함께 엮인 실습 예제로서의 MQTT. 1바이트짜리 타입 및 플래그 바이트, 가변 길이의 잔여 길이 필드, 길이 접두어가 붙은 UTF-8 토픽, 그리고 페이로드가 모두 TCP 위로(그리고 선택적으로 TLS 안으로) 이동하여, 메시지를 해당 토픽의 모든 구독자에게 퍼뜨리는 브로커로 전달됩니다. 함께 제공되는
mqtt클라이언트는 이 와이어 형식을 한자리에서 다 읽을 수 있을 만큼 작은connect/publish/subscribeAPI로 감쌉니다.
이 정도면 다른 기계와 통신하고, 원격 서비스에 데이터를 발행하고, 로컬 네트워크의 클라이언트로부터 연결을 받아들이며, 이 모든 것을 카메라의 나머지 작업과 동시에 수행하는 카메라 애플리케이션을 작성하기에 충분합니다.
9.20.1. 나중에 이 참고 자료 활용하기¶
네트워킹 장들을 참고 자료로 다루세요. UDP 리스너의 정확한 형태나 asyncio를 곁들인 TLS 패턴을 찾아 다시 돌아오는 것이 의도된 사용 방식입니다. network — 네트워크 구성, socket — socket 모듈, ssl — SSL/TLS 모듈, ntptime — 간단한 NTP 클라이언트 참고 페이지는 “이 호출의 정확한 이름이 무엇인가”만 궁금할 때 모든 메서드, 플래그, 상수를 한곳에 나열합니다.
9.20.2. 여기서 어디로 갈 것인가¶
웹 서버가 다음 주요 주제입니다. 소켓이 동작하고 TLS를 사용할 수 있게 되었으니, 자연스러운 다음 상위 계층은 그것들 위에 세워지는 프로토콜들입니다: 콘텐츠와 API를 제공하는 HTTP, 연결을 양방향으로 열어 두는 WebSocket, 그리고 상용구를 감추는 작은 프레임워크들입니다. 이 섹션의 모든 것이 그대로 이어집니다 – 결국 웹 서버란 받아들인 소켓에서 HTTP를 말하는 TCP 서버일 뿐이며, 흔히 전체를 TLS로 감쌉니다.