MQTT protocol
MQTT là gì?
MQTT là viết tắt của Truyền tải từ xa xếp hàng tin nhắn. Đây là một giao thức nhắn tin nhẹ để sử dụng trong trường hợp máy khách cần một lượng mã nhỏ và được kết nối với các mạng không đáng tin cậy hoặc các mạng có tài nguyên băng thông hạn chế. Nó chủ yếu được sử dụng cho giao tiếp giữa máy với máy (M2M) hoặc các loại kết nối Internet of Things.
Lịch sử
MQTT ban đầu được tạo ra bởi Tiến sĩ Andy Stanford-Clark và Arlen Nipper vào năm 1999. Mục đích ban đầu của phương thức liên lạc là cho phép các thiết bị giám sát được sử dụng trong ngành dầu khí gửi dữ liệu của họ đến các máy chủ từ xa. Trong nhiều trường hợp, các thiết bị giám sát như vậy được sử dụng ở những địa điểm xa, nơi khó hoặc không thể thiết lập bất kỳ loại kết nối điện thoại cố định, kết nối có dây hoặc kết nối truyền vô tuyến nào. Vào thời điểm đó, lựa chọn duy nhất cho những trường hợp như vậy là liên lạc qua vệ tinh, rất tốn kém và được tính phí dựa trên lượng dữ liệu được sử dụng. Với hàng nghìn cảm biến tại hiện trường, ngành này cần một hình thức liên lạc có thể cung cấp dữ liệu đủ tin cậy để sử dụng trong khi sử dụng băng thông tối thiểu.
MQTT đã được chuẩn hóa thành nguồn mở theo Tổ chức vì sự tiến bộ của các tiêu chuẩn thông tin có cấu trúc (OASIS) vào năm 2013. OASIS vẫn quản lý tiêu chuẩn MQTT.
Kiến trúc MQTT
MQTT chạy trên TCP/IP bằng cấu trúc liên kết PUSH/SUBSCRIBE. Trong kiến trúc MQTT, có hai loại hệ thống: máy khách và nhà môi giới. Nhà môi giới là máy chủ mà khách hàng giao tiếp. Nhà môi giới nhận thông tin liên lạc từ khách hàng và gửi những thông tin liên lạc đó đến các khách hàng khác. Khách hàng không giao tiếp trực tiếp với nhau mà kết nối với nhà môi giới. Mỗi khách hàng có thể là nhà xuất bản, người đăng ký hoặc cả hai.
MQTT là một giao thức hướng sự kiện. Không có truyền dữ liệu định kỳ hoặc liên tục. Điều này giữ cho việc truyền tải ở mức tối thiểu. Khách hàng chỉ xuất bản khi có thông tin cần gửi và nhà môi giới chỉ gửi thông tin cho người đăng ký khi có dữ liệu mới.
Kiến trúc tin nhắn
Một cách khác mà MQTT giảm thiểu việc truyền tải của nó là xây dựng thông điệp nhỏ, được xác định chặt chẽ. Mỗi tin nhắn có tiêu đề cố định chỉ 2 byte. Một tiêu đề tùy chọn có thể được sử dụng nhưng làm tăng kích thước của tin nhắn. Tải trọng tin nhắn được giới hạn chỉ 256 MB. Ba mức Chất lượng dịch vụ (QoS) khác nhau cho phép các nhà thiết kế mạng lựa chọn giữa việc giảm thiểu việc truyền dữ liệu và tối đa hóa độ tin cậy.
- QoS 0 – Cung cấp lượng truyền dữ liệu tối thiểu. Với cấp độ này, mỗi tin nhắn sẽ được gửi đến người đăng ký một lần mà không cần xác nhận. Không có cách nào để biết người đăng ký có nhận được tin nhắn hay không. Phương pháp này đôi khi được gọi là “bắn và quên” hoặc “nhiều nhất là một lần giao hàng”. Vì cấp độ này giả định rằng quá trình gửi đã hoàn tất nên tin nhắn sẽ không được lưu trữ để gửi đến các máy khách bị ngắt kết nối và sau đó sẽ kết nối lại.
- QoS 1 – Nhà môi giới cố gắng gửi tin nhắn và sau đó chờ phản hồi xác nhận từ người đăng ký. Nếu không nhận được xác nhận trong khung thời gian xác định, tin nhắn sẽ được gửi lại. Sử dụng phương pháp này, người đăng ký có thể nhận được tin nhắn nhiều lần nếu nhà môi giới không nhận được xác nhận của người đăng ký kịp thời. Điều này đôi khi được gọi là “giao hàng ít nhất một lần”.
- QoS 2 – Khách hàng và nhà môi giới sử dụng quy trình bắt tay bốn bước để đảm bảo rằng tin nhắn đã được nhận và chỉ được nhận một lần. Điều này đôi khi được gọi là “giao hàng đúng một lần”.
Đối với những tình huống mà thông tin liên lạc đáng tin cậy nhưng bị hạn chế, QoS 0 có thể là lựa chọn tốt nhất. Đối với các tình huống mà thông tin liên lạc không đáng tin cậy nhưng kết nối không bị giới hạn về tài nguyên thì QoS 2 sẽ là lựa chọn tốt nhất. QoS 1 cung cấp một loại giải pháp tốt nhất nhưng yêu cầu ứng dụng nhận dữ liệu phải biết cách xử lý các bản sao.
Đối với cả QoS 1 và QoS 2, tin nhắn được lưu hoặc xếp hàng đợi đối với các máy khách ngoại tuyến và có phiên liên tục được thiết lập. Các tin nhắn này sẽ được gửi lại (theo mức QoS thích hợp) sau khi máy khách trực tuyến trở lại.
Chủ đề
Các tin nhắn trong MQTT được xuất bản dưới dạng chủ đề. Chủ đề là cấu trúc phân cấp sử dụng ký tự gạch chéo (/) làm dấu phân cách. Cấu trúc này giống với cây thư mục trên hệ thống tệp máy tính. Cấu trúc như sensors/OilandGas/Pressure/ cho phép người đăng ký chỉ định rằng dữ liệu đó chỉ được gửi từ các máy khách xuất bản lên Chủ đề Áp lực hoặc để có cái nhìn rộng hơn, có thể là tất cả dữ liệu từ khách hàng xuất bản lên bất kỳ cảm biến/OilandGas
Tin nhắn được giữ lại
Để giữ dấu chân nhỏ, các tin nhắn nhận được sẽ không được lưu trữ trên nhà môi giới trừ khi chúng được đánh dấu bằng cờ được giữ lại. Điều này được gọi là một tin nhắn được giữ lại. Người dùng muốn lưu trữ tin nhắn đã nhận sẽ cần lưu trữ chúng ở nơi khác ngoài giao thức MQTT. Có một ngoại lệ.
Là một giao thức hướng sự kiện, thậm chí có khả năng người đăng ký có thể nhận được rất ít tin nhắn về một chủ đề nhất định, thậm chí trong một khoảng thời gian dài. Trong cấu trúc chủ đề đã đề cập trước đó, có lẽ các thông báo tới chủ đề Áp suất chỉ được gửi khi cảm biến phát hiện thấy áp suất đã vượt quá một mức nhất định. Giả sử rằng bất kỳ cảm biến nào đang theo dõi không thường xuyên bị lỗi thì có thể mất vài tháng hoặc thậm chí nhiều năm trước khi khách hàng xuất bản thông báo về chủ đề đó.
Để đảm bảo rằng người đăng ký mới nhận được tin nhắn từ một chủ đề, người môi giới có thể giữ lại tin nhắn cuối cùng được gửi cho mỗi chủ đề. Đây được gọi là tin nhắn được giữ lại. Bất cứ khi nào khách hàng mới đăng ký một chủ đề hoặc khi khách hàng hiện tại trực tuyến trở lại, tin nhắn được giữ lại sẽ được gửi đến người đăng ký, qua đó đảm bảo rằng đăng ký đang hoạt động và có thông tin mới nhất.
Di chúc và di chúc cuối cùng
Khi thông tin liên lạc không đáng tin cậy, có thể nhà xuất bản sẽ ngắt kết nối khỏi mạng mà không có cảnh báo. Nhà xuất bản có thể đăng ký một tin nhắn để gửi đến người đăng ký trong trường hợp nhà xuất bản ngắt kết nối đột ngột, đây được gọi là di chúc và di chúc cuối cùng. Thông báo này được lưu vào bộ nhớ đệm của nhà môi giới và được gửi tới người đăng ký nếu nhà xuất bản ngắt kết nối không đúng cách. Thông thường, thông báo như vậy bao gồm thông tin cho phép xác định nhà xuất bản bị ngắt kết nối để có thể thực hiện các hành động thích hợp.
Tin nhắn MQTT
Để giữ cho giao thức ở mức nhỏ gọn, chỉ có bốn hành động có thể thực hiện được với bất kỳ giao tiếp nào: xuất bản, đăng ký, hủy đăng ký hoặc ping.
- Xuất bản – Gửi một khối dữ liệu chứa tin nhắn sẽ được gửi. Dữ liệu này dành riêng cho từng cách triển khai nhưng có thể đơn giản như chỉ báo bật/tắt hoặc giá trị của một cảm biến nhất định, chẳng hạn như nhiệt độ, áp suất, v.v. Trong trường hợp chủ đề được xuất bản không tồn tại, chủ đề được tạo trên nhà môi giới.
- Đăng ký – Biến khách hàng thành người đăng ký một chủ đề. Các chủ đề có thể được đăng ký cụ thể hoặc thông qua các ký tự đại diện cho phép đăng ký toàn bộ nhánh chủ đề hoặc một phần của bất kỳ nhánh chủ đề nào. Để đăng ký, khách hàng gửi gói SUBSCRIBE và nhận lại gói SUBACK. Nếu có một tin nhắn được giữ lại cho chủ đề thì người đăng ký mới cũng nhận được tin nhắn đó.
- PING – Khách hàng có thể ping nhà môi giới. Gói PINGREQ được người đăng ký gửi và gói PINGRESP trả lời được gửi để trả lời. Ping có thể được sử dụng để đảm bảo rằng kết nối vẫn hoạt động và phiên TCP không bị đóng đột ngột bởi thiết bị mạng khác như bộ định tuyến hoặc cổng.
- NGẮT KẾT NỐI – Người đăng ký hoặc nhà xuất bản có thể gửi tin nhắn NGẮT KẾT NỐI tới nhà môi giới. Thông báo này thông báo cho nhà môi giới rằng họ sẽ không cần gửi hoặc xếp hàng tin nhắn cho người đăng ký nữa và sẽ không còn nhận dữ liệu từ nhà xuất bản nữa. Kiểu tắt máy này cho phép máy khách kết nối lại bằng cách sử dụng cùng một danh tính máy khách như trước. Khi khách hàng ngắt kết nối mà không gửi tin nhắn ngắt kết nối, di chúc và di chúc cuối cùng của khách hàng sẽ được gửi đến người đăng ký
Bảo vệ
Mục tiêu ban đầu của giao thức MQTT là tạo ra khả năng truyền dữ liệu nhỏ nhất và hiệu quả nhất qua các đường truyền thông đắt tiền, không đáng tin cậy. Do đó, bảo mật không phải là mối quan tâm hàng đầu trong quá trình thiết kế và triển khai MQTT.
Tuy nhiên, có một số tùy chọn bảo mật có sẵn với chi phí truyền dữ liệu nhiều hơn và dung lượng lớn hơn.
- An ninh mạng – Nếu bản thân mạng có thể được bảo mật thì việc truyền dữ liệu MQTT không an toàn là không liên quan. Trong trường hợp này, các vấn đề bảo mật sẽ phải xảy ra từ bên trong mạng, có thể thông qua một tác nhân xấu hoặc một hình thức xâm nhập mạng khác.
- Tên người dùng và mật khẩu – MQTT cho phép khách hàng thiết lập kết nối với nhà môi giới bằng tên người dùng và mật khẩu. Thật không may, để tránh sự chú ý, tên người dùng và mật khẩu được truyền dưới dạng văn bản rõ ràng. Vào năm 1999, điều này là quá đủ vì việc chặn liên lạc vệ tinh đối với những gì về cơ bản là việc đọc cảm biến không quan trọng sẽ cực kỳ khó khăn. Tuy nhiên, ngày nay, việc chặn nhiều loại giao tiếp mạng không dây là chuyện nhỏ, khiến cho việc xác thực đó gần như vô dụng.
Nhiều trường hợp sử dụng yêu cầu tên người dùng và mật khẩu không phải để bảo vệ chống lại những kẻ có ý đồ xấu mà như một cách để tránh những kết nối không chủ ý. - SSL/TLS – Chạy dựa trên TCP/IP, giải pháp rõ ràng để bảo mật đường truyền giữa khách hàng và nhà môi giới là triển khai SSL/TLS. Thật không may, điều này làm tăng thêm chi phí đáng kể cho các hoạt động liên lạc vốn nhẹ nhàng.
Cập nhật chuẩn MQTT v5.0
Vào ngày 3 tháng 4rd, năm 2019 OASIS đã xuất bản tiêu chuẩn MQTT v5.0 chính thức
Các tính năng chính của MQTT v5.0 mới
- Mã lý do – Ban đầu, MQTT chỉ đơn giản là không thực hiện hành động nào nếu có lỗi. Bản thân lỗi là mã lỗi duy nhất. Trong phiên bản 5.0, các xác nhận hiện hỗ trợ việc sử dụng mã trả lại, mã này có thể cung cấp lý do lỗi thân thiện với người dùng. Tất nhiên, việc sử dụng mã trả lại một chút sẽ làm tăng dấu chân.
- Đăng ký được chia sẻ – Quá nhiều người đăng ký một chủ đề cụ thể trên một nhà môi giới có thể tạo ra vấn đề về tải. Đăng ký được chia sẻ cho phép tải được cân bằng giữa các máy khách.
- Hết hạn tin nhắn – Tin nhắn có thể được đặt thành xóa nếu chúng không được gửi trong một khoảng thời gian nhất định. Điều này ngăn các tin nhắn cũ, lỗi thời được gửi đến những người đăng ký đã bị ngắt kết nối trong một khoảng thời gian.
- Bí danh chủ đề – Bản thân tên của các chủ đề có thể dài đến mức làm giảm dấu chân nhỏ của giao thức. Giờ đây, chuỗi chủ đề có thể được thay thế bằng một số duy nhất khi sử dụng nhiều lần cùng một chủ đề.