9.20. Tổng kết

Bạn đã đi qua các tầng mà một thông điệp mạng vượt qua trên đường từ camera đến phần còn lại của thế giới:

  • Động lực -- mạng tồn tại vì dây nối điểm-điểm ngừng mở rộng ngay khi có nhiều hơn một vài thiết bị cần giao tiếp, hoặc đối tác không nằm trên cùng dây, hoặc nhiều chương trình chia sẻ cùng một liên kết. Câu trả lời là phương tiện chia sẻ, địa chỉ logic, và định tuyến.

  • Mô hình phân tầng -- năm tầng, mỗi tầng giải quyết một vấn đề và cung cấp giao diện sạch cho tầng tiếp theo. Tầng vật lý và tầng liên kết xử lý bit và khung hình giữa các láng giềng trực tiếp, tầng mạng xử lý địa chỉ và định tuyến trên toàn internet, tầng vận chuyển xử lý phân phối từ chương trình đến chương trình, và các giao thức ứng dụng xây dựng trên tất cả những thứ đó.

  • Các tầng dưới -- Ethernet và Wi-Fi là các công nghệ liên kết thực tiễn; địa chỉ MAC xác định phần cứng trên một phân đoạn cục bộ. Module network của camera cung cấp một tùy chọn đáng biết: kết nối mạng Wi-Fi nào. Sau đó, mọi thứ bên dưới là tự động.

  • Tầng mạng (IP) -- Địa chỉ IPv4 và IPv6 xác định máy chủ độc lập với cáp nào chúng được cắm vào. Các router chuyển tiếp gói tin giữa các phân đoạn cục bộ cho đến khi chúng đến nơi. Các dải địa chỉ riêng tư và NAT là lý do tại sao mạng gia đình và văn phòng có không gian địa chỉ nội bộ riêng và một địa chỉ công cộng chung tại cạnh; lưu lượng đi ra hoạt động tự do, lưu lượng đến cần hỗ trợ.

  • Tầng vận chuyển -- các cổng xác định chương trình bên trong một máy chủ; cặp (IP, port) đầy đủ xác định một socket cụ thể. UDP là một tầng mỏng gửi một datagram tự chứa tại một thời điểm không có đảm bảo -- nhanh, rẻ, và là công cụ phù hợp khi mất mát có thể chấp nhận được. TCP là một luồng byte đáng tin cậy, có thứ tự, hướng kết nối -- công cụ chủ lực cho hầu hết lưu lượng internet, được trả bằng một lượt đi-về của độ trễ bắt tay.

  • API Python -- socket.socket là lớp duy nhất cho cả hai giao thức. sendto() / recvfrom() cho UDP; các mẫu connect-hoặc-listen cộng với send() / recv() cho TCP. Socket kết hợp gọn gàng với asyncio: asyncio.open_connection()asyncio.start_server() cung cấp cho mỗi kết nối TCP một cặp reader/writer, cho phép nhiều cuộc hội thoại đồng thời chia sẻ một vòng lặp sự kiện mà không cần threading.

  • Tên và thời gian -- socket.getaddrinfo() chuyển đổi tên như example.com thành địa chỉ IP sẵn sàng truyền cho socket. network.hostname() đặt tên riêng của camera, mà các router đăng ký dưới DNS cục bộ và mà trình phản hồi mDNS tích hợp của camera trả lời dưới dạng <name>.local. ntptime.settime() là ý tưởng "tra cứu thứ gì đó trên mạng" tương tự được áp dụng cho thời gian đồng hồ, đặt đồng hồ tích hợp về UTC từ một máy chủ NTP công cộng.

  • Mã hóa -- ssl bọc một socket trong TLS. Camera không có sẵn kho lưu trữ thẩm quyền chứng chỉ, vì vậy mặc định bạn chỉ có mã hóa -- cuộc trò chuyện không còn ở dạng rõ, nhưng camera không xác minh ai đã trả lời. Để xác thực thực sự -- xác minh máy chủ HTTPS công cộng, chạy camera như một máy chủ TLS, TLS lẫn nhau -- quy trình làm việc dựa trên chứng chỉ được đề cập trong Làm việc với chứng chỉ TLS. DTLS (TLS qua UDP) sử dụng cùng module theo cùng cách.

  • Một giao thức ứng dụng thực tế -- MQTT là ví dụ thực hành về tất cả các tầng bên dưới được kết nối cùng nhau. Một byte type-and-flags 1 byte, trường remaining-length có độ dài thay đổi, chủ đề UTF-8 có tiền tố độ dài, và payload, tất cả truyền qua TCP (và tùy chọn bên trong TLS) đến một broker phân phối thông điệp ra cho mỗi subscriber trong chủ đề. Module mqtt đi kèm bọc định dạng dây trong API connect / publish / subscribe nhỏ đủ để đọc trong một lần ngồi.

Điều đó đủ để viết các ứng dụng camera giao tiếp với các máy khác, xuất bản dữ liệu lên các dịch vụ từ xa, chấp nhận kết nối từ các client trên mạng cục bộ, và làm tất cả điều đó đồng thời với công việc còn lại của camera.

9.20.1. Sử dụng tài liệu tham khảo này sau

Hãy coi các chương về mạng như tài liệu tham khảo; quay lại để xem hình dạng chính xác của một UDP listener hoặc mẫu TLS-với-asyncio là cách sử dụng dự kiến. Các trang tham khảo network --- cấu hình mạng, socket --- mô-đun socket, ssl --- Mô-đun SSL/TLS, và ntptime --- máy khách NTP đơn giản liệt kê mọi phương thức, cờ và hằng số ở một nơi khi câu hỏi chỉ là "tên chính xác của lệnh gọi này là gì".

9.20.2. Đi đâu từ đây

Máy chủ Web là chủ đề lớn tiếp theo. Với socket hoạt động và TLS có sẵn, tầng tự nhiên tiếp theo là các giao thức xây dựng trên chúng: HTTP để phục vụ nội dung và API, WebSocket để giữ kết nối mở cả hai chiều, và các framework nhỏ ẩn bớt mã trùng lặp. Mọi thứ từ phần này đều tiếp tục -- xét cho cùng, một máy chủ web chỉ là một máy chủ TCP nói HTTP trên các socket đã chấp nhận, thường với TLS bọc toàn bộ.