javascript - Tính toàn vẹn của tin nhắn Websockets
Khi sử dụng kết nối dữ liệu hai chiều đầy đủ WebSocket giữa một client và một server, tôi có được đảm bảo rằng, khi gửi hai tin nhắn từ server, tôi sẽ nhận được chính xác hai tin nhắn đó trên client, điều mà TCP không làm được không?
Nói cách khác, nếu máy chủ gửi lần lượt hello và sau đó là its me, thì khách hàng có luôn nhận được hai tin nhắn chứa hello và its me hay có khả năng khách hàng nhận được helloit và sau đó là s me hoặc thậm chí chỉ một tin nhắn duy nhất như helloits me?
Câu trả lời #1
WebSocket ban đầu có các byte bắt đầu và kết thúc của tin nhắn văn bản, nhưng đó là thông tin cũ. Có một thành phần độ dài trong khung (tháng 12 năm 2011). Và nhân tiện, có một cờ trong đặc tả khung xác định liệu khung có phải là toàn bộ "tin nhắn" hay chỉ là một "mảnh tin nhắn", tức là còn có những khung khác tạo thành "tin nhắn" này. Người nhận chịu trách nhiệm kết hợp các mảnh đúng cách để chuyển lên mã ứng dụng. Thông thường bạn không phải nghĩ về điều này trừ khi bạn có các "tin nhắn" rất lớn (hãy nghĩ về "tin nhắn" WS như "dữ liệu" hơn là tin nhắn thực sự... WS thực ra không phải là một giao thức "nhắn tin" theo nghĩa đen).
Nhưng lưu ý, WebSocket là một giao thức truyền tải cấp thấp. Hãy nghĩ về nó như một TCP dựa trên web. Các lập trình viên ứng dụng nên sử dụng các giao thức cấp cao "trên WS/WSS" và không cần lo lắng về thứ tự, kết nối lại, trạng thái hiện diện, pub/sub, tuple-spaces, đảm bảo phân phối, v.v. Nếu chúng ta không làm điều này, hàng tá giao thức ứng dụng đã tồn tại hàng chục năm sẽ bị phát minh lại.
Câu trả lời #2
Khi có kết nối rất kém, bạn có thể mất một tin nhắn (tuy nhiên nó nên được gửi lại với tcp), nhưng khả năng bị chia nhỏ theo cách đó là rất thấp. Mỗi tin nhắn văn bản đều có ranh giới - byte bắt đầu (0x00) và byte kết thúc (0xFF). Trình duyệt không nên làm lộn xộn các tin nhắn. Có khả năng bạn nhận được các tin nhắn theo thứ tự khác.
Làm thế nào bạn có thể chắc chắn hơn:
- Thêm kiểm tra tổng riêng của bạn vào các tin nhắn (nhưng thực ra nó là gánh nặng).
- Sử dụng giao thức wss (websockets+tls/ssl) - các tin nhắn bị hỏng sẽ không được giải mã đúng.