2010-02-04 31 views
27

Ổ cắm web phát hiện sự hiện diện của máy chủ proxy và tự động thiết lập đường hầm để truyền qua proxy. Đường hầm được thiết lập bằng cách phát hành một câu lệnh HTTP CONNECT tới máy chủ proxy, yêu cầu máy chủ proxy mở một kết nối TCP/IP tới một máy chủ và cổng cụ thể. Khi đường hầm được thiết lập, thông tin liên lạc có thể chảy không bị cản trở thông qua proxy. Vì HTTP/S hoạt động theo cách tương tự, các Web Sockets an toàn trên SSL có thể tận dụng cùng một kỹ thuật HTTP CONNECT. [1]Tại sao việc triển khai ứng dụng khách websocket hiện tại không hỗ trợ proxy?

OK, có vẻ hữu ích! Nhưng, trong việc triển khai thực hiện của khách hàng mà tôi đã thấy từ trước đến nay (Go [2], Java [3]) Tôi không thấy bất cứ điều gì liên quan đến phát hiện proxy.

Tôi có thiếu gì đó hoặc những triển khai này chỉ còn trẻ? Tôi biết WebSockets rất mới và việc triển khai máy khách có thể không kém phần trẻ trung và chưa trưởng thành. Tôi chỉ muốn biết nếu tôi đang thiếu một cái gì đó về phát hiện và xử lý proxy.

[1] http://www.kaazing.org/confluence/display/KAAZING/What+is+an+HTML+5+WebSocket

[2] http://golang.org/src/pkg/websocket/client.go

[3] http://github.com/adamac/Java-WebSocket-client/raw/master/src/com/sixfire/websocket/WebSocket.java

+2

Chúng không? Aaargghh! và tôi tự hỏi tại sao mã của tôi không hoạt động! Đã lãng phí cả buổi sáng nhưng bây giờ dường như nó hoạt động vì tôi đã xóa proxy. Cảm ơn bạn đã đặt câu hỏi này! – Tieme

+0

@Tieme chứng minh rằng các câu hỏi cũng quan trọng như câu trả lời –

+0

Thật vậy, họ làm! – Tieme

Trả lời

1

Câu trả lời là những khách hàng này chỉ đơn giản là không hỗ trợ proxy. -Occam

+1

Vâng câu trả lời là một HTTP CONNECT được hướng dẫn.Một kết nối HTTP CONNECT hướng dẫn kết nối giống như một kết nối TCP cơ bản cho khách hàng do đó, ông sẽ gửi các Websocket handshake AFTERWARDS.Ông sẽ gửi hai yêu cầu HTTP cho một cái bắt tay Websocket.Một cho proxy, một cho máy chủ websocket. – sinni800

0

đã được Kênh truyền thông thành lập vào thời điểm giao thức WebSocket đi vào hiện trường. WebSocket được xây dựng trên đầu trang của TCP và HTTP, do đó bạn không phải quan tâm đến những điều đã được thực hiện bởi các giao thức này, bao gồm cả proxy.

Khi kết nối WebSocket được thiết lập, nó luôn bắt đầu bằng kết nối HTTP/TCP sau này được "nâng cấp" trong giai đoạn "bắt tay" của WebSocket. Tại thời điểm này đường hầm được thiết lập sao cho các proxy trong suốt, không cần phải quan tâm đến chúng.

+0

Vậy thì http kết nối như thế nào? – z8000

+2

@ z8000 HTTP CONNECT thiết lập kết nối HTTP. Đây là một yêu cầu GET bình thường, nếu máy chủ hỗ trợ giao thức WebSochet, được nâng cấp sau. Giao thức WebSocket sử dụng HTTP để thương lượng kết nối và, như bạn đã đề xuất, để bỏ qua proxy. – Tihauan

+1

_WHAT_ có kết nối HTTP không? Không phải là gì _IS_ một HTTP CONNECT? Theo Wikipedia: "Phương pháp đường hầm dựa trên HTTP khác sử dụng phương thức/lệnh HTTP CONNECT. Máy khách đưa ra lệnh HTTP CONNECT tới proxy HTTP. Proxy sau đó tạo kết nối TCP tới một máy chủ cụ thể: cổng và chuyển tiếp dữ liệu giữa máy chủ đó: cổng và kết nối máy khách. " Tôi không thấy gì trong các máy khách WebSocket nói chuyện với một proxy thông qua HTTP CONNECT. Hãy xem xét CURLOPT_PROXY trong API của libcurl chẳng hạn. – z8000

41

Hãy để tôi cố gắng giải thích các tỷ lệ thành công khác nhau mà bạn có thể gặp phải. Mặc dù giao thức HTML5 Web Socket không biết về máy chủ proxy và tường lửa, nhưng nó có tính năng tương thích với HTTP để các máy chủ HTTP có thể chia sẻ các cổng HTTP và HTTPS mặc định của họ (80 và 443) với cổng hoặc máy chủ Web Sockets.

Giao thức Web Socket xác định tiền tố ws: // và wss: // để chỉ ra một kết nối WebSocket và một kết nối an toàn WebSocket tương ứng. Cả hai lược đồ đều sử dụng một cơ chế nâng cấp HTTP để nâng cấp lên giao thức Web Socket. Một số máy chủ proxy vô hại và hoạt động tốt với Web Sockets; những người khác sẽ ngăn Web Sockets hoạt động bình thường, khiến cho kết nối thất bại. Trong một số trường hợp có thể cần cấu hình máy chủ proxy bổ sung và một số máy chủ proxy nhất định có thể cần được nâng cấp để hỗ trợ Ổ cắm Web.

Nếu lưu lượng truy cập WebSocket không mã hóa truyền thông qua máy chủ proxy rõ ràng hoặc minh bạch trên máy chủ WebSocket, thì máy chủ proxy có hoạt động như không, kết nối gần như chắc chắn sẽ không thành công ngày hôm nay (trong tương lai , máy chủ proxy có thể trở thành nhận biết về Web Socket). Do đó, các kết nối WebSocket không được mã hóa chỉ nên được sử dụng trong các cấu trúc liên kết đơn giản nhất.

Nếu kết nối WebSocket được mã hóa được sử dụng, khi đó việc sử dụng bảo mật lớp truyền tải (TLS) trong ổ cắm web Kết nối an toàn đảm bảo rằng lệnh HTTP CONNECT được cấp khi trình duyệt được định cấu hình sử dụng máy chủ proxy rõ ràng. Điều này thiết lập một đường hầm, cung cấp giao tiếp TCP đầu cuối cấp thấp thông qua proxy HTTP, giữa máy khách Web Sockets Secure và máy chủ WebSocket. Trong trường hợp máy chủ proxy trong suốt, trình duyệt không biết máy chủ proxy, vì vậy không có HTTP CONNECT nào được gửi.Tuy nhiên, vì lưu lượng dây được mã hóa, các máy chủ proxy trung gian trong suốt có thể đơn giản cho phép lưu lượng được mã hóa, vì vậy sẽ có cơ hội tốt hơn nếu kết nối WebSocket thành công nếu sử dụng Web Sockets Secure. Sử dụng mã hóa, tất nhiên, không phải là miễn phí, nhưng thường cung cấp tỷ lệ thành công cao nhất. Một cách để xem nó hoạt động là tải xuống và cài đặt Cổng Web Kaocket Kaazing - cổng WebSocket được tối ưu hóa cao, nhận biết proxy, cung cấp hỗ trợ WebSocket nguyên bản cũng như mô phỏng đầy đủ tiêu chuẩn cho các trình duyệt cũ hơn.

+0

Peter, cảm ơn bình luận của bạn.Nhưng nó kiểu váy quanh câu hỏi. Bạn sắp xếp trả lời: các trình duyệt có cấu hình proxy rõ ràng sẽ phát hành HTTP CONNECT. Câu hỏi đặt ra là về các máy khách WS nói chung không chỉ là các trình duyệt. Một vài khách hàng mà tôi đã lấy mẫu không có bất kỳ hỗ trợ proxy rõ ràng nào. Tôi có thể suy ra từ câu trả lời của bạn rằng các khách hàng như vậy có được sự hỗ trợ như vậy (giống như một trình duyệt sẽ) và rằng họ chỉ đơn giản là không được thực hiện (chưa?). – z8000

+2

Xin lỗi tôi đã hiểu lầm câu hỏi của bạn - bạn nói đúng, những khách hàng đó không hỗ trợ proxy. –

+1

75% bài đăng của bạn được sao chép từ bài viết trên Wikipedia. Vui lòng tìm hiểu cách sử dụng dấu ngoặc kép và trích dẫn nguồn của bạn. –

0

Về khách hàng WebSocket và proxy trong suốt, Tôi nghĩ rằng kết nối WebSocket khách hàng sẽ thất bại hầu hết thời gian vì những lý do sau đây (không kiểm tra):

  • Nếu kết nối là rõ ràng, kể từ máy khách không biết nó đang liên lạc với máy chủ proxy http, nó sẽ không gửi lệnh "CONNECT TO" để biến proxy http thành proxy tcp (cần thiết cho máy khách sau khi bắt tay với websocket). Nó có thể hoạt động nếu proxy hỗ trợ websocket nguyên bản và xử lý URL với lược đồ ws khác với http.

  • Nếu kết nối bằng SSL, proxy trong suốt không thể biết máy chủ nào nên kết nối vì nó đã giải mã tên máy chủ trong yêu cầu https. Nó có thể bằng cách tạo ra một chứng chỉ tự ký trên bay (như cho SSLStrip) hoặc cung cấp chứng chỉ tĩnh của riêng nó và giải mã giao tiếp nhưng nếu máy khách xác nhận chứng chỉ máy chủ thì nó sẽ thất bại (xem https://serverfault.com/questions/369829/setting-up-a-transparent-ssl-proxy).

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