2012-11-24 43 views
5

Khi nâng cấp kết nối HTTP lên websocket, người dùng có thể cung cấp một hoặc nhiều giao thức con trong tiêu đề HTTP tùy chọn 'Sec-WebSocket-Protocol'.Mã phản hồi HTTP khi yêu cầu subsotot websocket không được hỗ trợ/nhận dạng

Nếu máy chủ chấp nhận bất kỳ giao thức con nào đáp ứng với mã phản hồi HTTP 101 ("HTTP/1.1 101 Chuyển giao thức") và bao gồm tiêu đề HTTP 'Sec-WebSocket-Protocol' cho biết subprotocol đã chọn.

Nhưng làm thế nào máy chủ nên xử lý chính xác một subprotocol không xác định/không được hỗ trợ?

Điều này có nên được thực hiện 'trong' kết nối HTTP - bằng cách sử dụng một số mã phản hồi HTTP không?

Hoặc kết nối sẽ được nâng cấp lên websocket - và ngay lập tức bị đóng bởi máy chủ bằng cách gửi 'Đóng khung' với một số mã web được xác định trước Mã trạng thái?

RFC6455 nói gì? Tôi không thể đi đến kết luận. Cài đặt máy chủ hiện tại xử lý nó như thế nào?

Trân /mỗi/

+0

Như tôi đã hiểu, phần 4.2.2 có một số thông tin về điều này: "nếu máy chủ không đồng ý với một trong các giao thức con được đề xuất (...)", nhưng không rõ ràng điều gì xảy ra với kết nối . – pimvdb

Trả lời

4

Từ một cái nhìn thoáng qua ngắn tại RFC 6455, tôi tin rằng các WebSocket Subprotocol là tùy chọn và đàm phán. Trong phần 4.2.2, dưới "Máy chủ Rquirements":

/subprotocol/ 
     Either a single value representing the subprotocol the server 
     is ready to use or null. The value chosen MUST be derived 
     from the client's handshake, specifically by selecting one of 
     the values from the |Sec-WebSocket-Protocol| field that the 
     server is willing to use for this connection (if any). If the 
     client's handshake did not contain such a header field or if 
     the server does not agree to any of the client's requested 
     subprotocols, the only acceptable value is null. The absence 
     of such a field is equivalent to the null value (meaning that 
     if the server does not wish to agree to one of the suggested 
     subprotocols, it MUST NOT send back a |Sec-WebSocket-Protocol| 
     header field in its response). The empty string is not the 
     same as the null value for these purposes and is not a legal 
     value for this field. The ABNF for the value of this header 
     field is (token), where the definitions of constructs and 
     rules are as given in [RFC2616]. 

Máy chủ không nên gửi một đáp ứng tiêu đề subprotocol với một giá trị khác hơn là 'null' nếu nó không đồng ý sử dụng subprotocol với khách hàng, và nó là trách nhiệm của khách hàng là tiếp tục hoặc chấm dứt kết nối tại thời điểm đó.

+0

Thậm chí nếu tôi nghĩ rằng trong hầu hết các trường hợp thiếu sự hỗ trợ cho subprotocol sẽ làm cho nó unessesary để nâng cấp kết nối đến websocket, có vẻ như hợp lý. Nếu máy chủ thiết lập kết nối - chỉ ra rằng nó KHÔNG cung cấp bất kỳ giao thức con được yêu cầu nào - nó sẽ có thể đăng nhập/xử lý điều này ở phía máy khách. – PerS

+0

Điểm trong RFC là subprotocol là một phần mở rộng được thương lượng giống như trao đổi mật mã trong quá trình bắt tay SSL.Đó là lý do tại sao kết nối phải được kết thúc ở phía máy khách: nếu máy khách và máy chủ không thể hỗ trợ subprotocol phổ biến thì chúng không thể giao tiếp rõ ràng, mặc dù máy chủ sẵn sàng để kết nối mở cho các khả năng khác. – jmkeyes

+0

Có điều này có ý nghĩa. Tôi đã xem [javascript Websocket API] (http://www.w3.org/TR/websockets/) dành cho trình duyệt và thực hiện một số kiểm tra nhanh. Bằng cách sử dụng chỉ báo 'giao thức' chỉ đọc được thiết lập khi kết nối được thiết lập, máy khách có thể xử lý tình huống subprotocol không được hỗ trợ. – PerS

0

Toàn bộ điểm WebSocket là sử dụng WebSocket để chạy một giao thức cụ thể từ máy khách đến máy chủ. Nhưng máy khách và máy chủ cần phải biết giao thức để cả hai đầu đều biết phải làm gì với các thông điệp WS đến. Việc xử lý tin nhắn WS không khác gì những gì bạn sẽ làm ở cấp TCP. Bạn không phải sử dụng trường giao thức, nó chỉ có liên quan nếu bạn muốn thực thi khả năng tương thích.

Đối với máy chủ Kaazing, chúng tôi cung cấp các thư viện giao thức cụ thể sẽ nằm trên đầu lớp websocket cơ bản. Bạn cũng có thể tìm thấy các thư viện giao thức khác nhau trên Github. Ngoại trừ cái bắt tay, mọi thứ khác là cách bạn xử lý nó với TCP. Bạn xử lý các thông điệp websocket và cố gắng giải mã giao thức. Trường giao thức trong bắt tay nên được sử dụng để đảm bảo rằng thư viện của bạn thực sự là thư viện giao thức phù hợp. Vì vậy, ví dụ nếu máy chủ của tôi nói STOMP, và tôi cố gắng kết nối với khách hàng của tôi và tôi muốn nói STOMP, thư viện STOMP của tôi nên kiểm tra trường giao thức để đảm bảo nó phù hợp. Các điểm cuối có thể biểu thị theo thứ tự ưu tiên ví dụ như nó có thể nói AMQP 0.9 và AMQP 1.0, và sẽ chọn AMQP 1.0 nếu cả hai đều có sẵn. Nếu một trong các thiết bị đầu cuối không nói bất kỳ giao thức nào mà đầu kia có thể nói, nó có thể trả về null và do đó kết nối bị chấm dứt.

Các vấn đề liên quan