Tổng quan về thiết kế giao thức mạng

Giao thức TCP (Transmission Control Protocol) và Giao thức Internet (IP – Internet Protocols) tạo thành một bộ giao thức được triển khai phổ biến trên mạng lưới. TCP/IP cho phép một kênh giao tiếp hai chiều đáng tin cậy giữa các hệ thống trên internet.

Việc phân phối theo thứ tự các giao thức truyền thông node Cardano được đảm bảo bởi giao thức TCP/IP.

Hệ điều hành giới hạn số lượng kết nối đồng thời. Theo mặc định, Linux, chẳng hạn, có thể mở 1.024 kết nối cho mỗi quá trình, trong khi macOS giới hạn con số này ở mức 256. Để tránh sử dụng quá nhiều tài nguyên và kích hoạt các phương tiện đáng tin cậy để thiết lập kết nối, Cardano sử dụng bộ ghép kênh (multiplexer).

Quản lý kết nối

Layer mạng lưới xử lý một loạt các nhiệm vụ cụ thể bên cạnh việc trao đổi khối và thông tin giao dịch theo yêu cầu của giao thức Ouroboros.

Nói chung, việc triển khai quản lý kết nối bao gồm việc thực hiện các nhiệm vụ sau:

  • Mở một socket và/hoặc lấy tài nguyên từ hệ điều hành (OS – operator system)
  • Thương lượng phiên bản giao thức với giao thức mini handshake
  • Sinh ra tiến trình chạy bộ ghép kênh (multiplexer) (có thể được hướng dẫn để bắt đầu/dừng các giao thức mini khác nhau)
  • Phát hiện và phân loại các ngoại lệ do các giao thức mini hoặc chính multiplexer tạo ra
  • Tắt kết nối trong trường hợp có lỗi
  • Xử lý yêu cầu tắt máy từ peer
  • Tắt các luồng chạy các giao thức nhỏ
  • Đóng một socket

Ghép kênh (Multiplexing)

Layer multiplexing hoạt động như một điểm giao thoa trung tâm giữa các giao thức mini và kênh mạng lưới. Nó chạy song song một số giao thức mini trong một kênh duy nhất – chẳng hạn như kết nối TCP (Transmission Control Protocol).

Hình 1 phản ánh cách dữ liệu lưu chuyển giữa hai node, mỗi node chạy ba giao thức mini sử dụng bộ ghép kênh (MUX – multiplexer) và phân kênh (DEMUX – de-multiplexer).

Hình 1. Luồng dữ liệu giữa các node thông qua multiplexing

Dữ liệu được truyền giữa các node đi qua MUX/DEMUX của các node. Có một sự ghép nối cố định của các thực thể giao thức mini, có nghĩa là mỗi thực thể chỉ giao tiếp với thực thể kép của nó (một bên khởi tạo và một bên phản hồi).

Việc thực hiện giao thức mini cũng xử lý tuần tự hóa và hủy tuần tự hóa các thông báo của nó. Các giao thức mini ghi các phần byte vào MUX và đọc các phần byte từ DEMUX. MUX đọc dữ liệu từ các giao thức mini, chia nó thành các phân đoạn, thêm tiêu đề phân đoạn và truyền các phân đoạn tới DEMUX peer của nó. DEMUX sử dụng các tiêu đề của phân đoạn để tập hợp lại các luồng byte cho các giao thức nhỏ bên cạnh nó. Bản thân giao thức ghép kênh (multiplexer) (xem ghi chú bên dưới) hoàn toàn không liên quan với cấu trúc của dữ liệu được ghép kênh.

Lưu ý: Đây không phải là cách sử dụng ghép kênh chung chung mà chuyên biệt. Các giao thức nhỏ riêng lẻ có những ràn buộc nghiêm ngặt đối với các gói tin chưa được xác nhận đang truyền đi. Thiết kế tránh các điều kiện trong đó việc sử dụng TCP chung qua ghép kênh TCP tạo ra các hoạt động hỗn loạn.

Các phân đoạn dữ liệu của giao thức ghép kênh (multiplexer)

Phân đoạn dữ liệu ghép kênh bao gồm các chi tiết sau:

  • Transmission time – thời gian đã trôi qua tính trên đồng hồ của người gửi và độ phân giải một micro giây và thấp hơn 32 bit.
  • Mini-protocol ID – IDduy nhất của giao thức mini.
  • Payload length – kích thước của payload tính bằng byte. Chiều dài tối đa payload hỗ trợ bởi bộ ghép kênh là 216 – 1. Lưu ý rằng một thực thể của giao thức có thể chọn giới hạn nhỏ hơn cho kích thước của các phân đoạn mà nó truyền.
  • Mode– bit đơn M (mode – chế độ) được sử dụng để phân biệt các thực thể kép của một giao thức mini. Mode được set = 0 trong các phân đoạn từ trình khởi tạo (phía bên mang tính chủ động) và được set = 1 trong các phân đoạn từ bên phản hồi.

Các giao thức giao tiếp node Cardano

Cardano sử dụng các giao thức truyền thông liên quá trình (IPC – inter-process communication) để cho phép trao đổi các block và giao dịch giữa các node và cho phép các ứng dụng cục bộ tương tác với chuỗi khối thông qua node.

Tổng quan về Node-to-Node IPC

Giao thức Node-to-Node (NtN) chuyển giao dịch giữa các full node. NtN bao gồm ba giao thức nhỏ (chain-sync, block-fetch, and tx-submission), được ghép kênh qua một kênh TCP (Transmission Control Protocol) duy nhất bằng cách sử dụng gói network-mux.

Sơ đồ sau thể hiện luồng hoạt động NtN:

NtN tuân theo chiến lược pull-based, trong đó node khởi tạo truy vấn các giao dịch mới và node phản hồi sẽ trả lời các giao dịch nếu có. Giao thức này hoàn toàn phù hợp với một thiết lập không cần đặt niềm tin vào ai nơi mà cả hai bên cần được bảo vệ trước các cuộc tấn công tiêu thụ tài nguyên từ phía bên kia.

Giải thích về các giao thức mini NtN

Giải thích ngắn gọn về các giao thức mini NtN:

  • chain-sync: một giao thức cho phép một node xây dựng lại một chuỗi của một upstream node
  • block-fetch: một giao thức cho phép một node tải xuống các nội dung khối từ các peer khác nhau
  • tx-submitssion: một giao thức cho phép đẩy các giao dịch lên mạng lưới. Việc triển khai giao thức này dựa trên một khung (framework) giao thức nhỏ chung, với một điểm đặc biệt: vai trò của trình khởi tạo và trình phản hồi bị đảo ngược. Máy chủ là người khởi tạo yêu cầu các giao dịch mới và client là người phản hồi trả lời các giao dịch. Sự đảo ngược vai trò này được thiết kế vì lý do kỹ thuật.

Để đảm bảo dịch vụ mạng tối ưu, team cũng đã triển khai một giao thức bổ sung:

  • keep-alive: một giao thức đảm bảo kết nối liên tục giữa các node và giảm thiểu lỗi hiệu suất.

Tổng quan về Node-to-Client IPC

Node-to-Client (NtC) là kết nối giữa một node đầy đủ và một client sử dụng dữ liệu nhưng không tham gia vào giao thức Ouroboros (ví dụ:)

Mục đích của giao thức NtC IPC là cho phép các ứng dụng cục bộ tương tác với blockchain thông qua node. Điều này bao gồm các ứng dụng như phụ trợ ví (wallet backend) hoặc trình khám phá blockchain (blockchain explorer). Giao thức node-to-client cho phép các ứng dụng này truy cập vào dữ liệu chuỗi dạng thô và truy vấn trạng thái sổ cái hiện tại, đồng thời nó cũng cung cấp khả năng gửi các giao dịch mới đến hệ thống.

Giao thức node-to-client sử dụng thiết kế tương tự như giao thức Node-to-Node (NtN), nhưng với một tập hợp các giao thức nhỏ khác và sử dụng đường ống kết nối pipes cục bộ thay vì kết nối TCP. Do đó, nó là một kết nối ở mức thấp (low-level) dành cho node, chỉ hiển thị những gì node có thể cung cấp một cách nguyên sơ. Ví dụ: node cung cấp quyền truy cập vào tất cả dữ liệu chuỗi thô nhưng không cung cấp cách truy vấn dữ liệu trên chuỗi. Công việc cung cấp dịch vụ dữ liệu và các API cấp cao hơn thuận tiện hơn được giao cho các client chuyên dụng, chẳng hạn như cardano-db-sync và phần phụ trợ ví.

Giao thức mini NtC (node-to-client)

Giao thức node-to-client bao gồm ba giao thức nhỏ:

  • chain-sync – được sử dụng để theo dõi chuỗi và nhận các khối
  • local-tx-submit– được sử dụng để gửi các giao dịch
  • local-state-query– được sử dụng để truy vấn trạng thái sổ cái

Phiên bản node-to-client đồng bộ hóa chuỗi đầy đủ các block, thay vì chỉ các tiêu đề khối. Đây là lý do tại sao không cần giao thức block-fetch. Giao thức local-tx-submit giống như giao thức node-to-node tx-submission nhưng đơn giản hơn và nó trả về chi tiết của các lỗi xác thực giao dịch. Giao thức truy vấn trạng thái cục bộ cung cấp quyền truy vấn đến trạng thái sổ cái hiện tại, chứa nhiều dữ liệu cần thiết không được phản ánh trực tiếp trên chính chuỗi khối.

Cách NtC (node-to-client) hoạt động

Trong node-to-client, node chỉ chạy bên phía nhà sản xuất khối (block producer) của giao thức chain-sync và client chỉ chạy phía người tiêu dùng.

Bảng này hiển thị các giao thức nhỏ được kích hoạt cho giao tiếp node-to-client: