Проблема рукопожатия

1

Я создал сервер websockets в Python (основанный на этом стиле), который работает в localhost, но не на рабочем сервере.

Например, в localhost у меня есть следующие сообщения Handshake:

//Message from webbrowser client

GET / HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: 127.0.0.1:8080
Origin: null
Sec-WebSocket-Key1: ]2 415       401   032v
Sec-WebSocket-Key2: 2y7   9Y2o 80049 5
Cookie: (...)

t��t'��


//Response of server

HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: null
WebSocket-Location: ws://127.0.0.1:8080/
Sec-Websocket-Origin: null
Sec-Websocket-Location: ws://127.0.0.1:8080/

�@2�J��3@5��ƶ

Когда я запускаю тот же сервер webssocket в производстве, соединение терпит неудачу. В консоли Chrome я получаю следующую ошибку: " Ошибка во время рукопожатия WebSocket: значение" Connection "не" Upgrade " " - но в сообщениях Handshake между сервером и клиентом соединение (с сервера) имеет правильное значение:

//Message from webbrowser client

GET / HTTP/1.0
Host: myserver.com
X-Forwarded-Host: myserver.com
X-Forwarded-Server: myserver.com
X-Forwarded-For: 189.6.133.224
Connection: close
Upgrade: WebSocket
Origin: http://myserver.com
Sec-WebSocket-Key1: 2 1)Gz 11919la 978
Sec-WebSocket-Key2: c94Q6b9^ef#'6 2v {652
Cookie: (...)


//Response of server

HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://myserver.com
WebSocket-Location: ws://myserver.com/websocket/server
Sec-Websocket-Origin: http://myserver.com
Sec-Websocket-Location: ws://myserver.com/websocket/server

yz�~�r}��+�4J

В производстве я получил несколько незнакомых значений в сообщении клиента:

  • Где сумасшедший код в конце сообщения?
  • Значение заголовка 'Connection' 'close'?!

Кто-то имеет представление о том, почему я получил эту ошибку и почему клиентское рукопожатие имеет эти значения?

Теги:
websocket

1 ответ

3
Лучший ответ
  • Что такое сумасшедший код в конце сообщений?

8 необработанных байтов в конце клиентского рукопожатия по сути являются третьим ключевым значением. 16 необработанных байтов, отправленных сервером, являются дайджестом, который был сгенерирован из трех ключевых значений в квитировании клиента. Вот как дайджест работает в текущей версии протокола Hixie-76. В новых версиях протокола IETF/HyBi (которые скоро будут выпущены в браузерах) механизм дайджеста больше не использует специальные необработанные байты.

  • Почему значение заголовка "Connection" установлено на "close"?

Мне кажется, что есть посредник (т.е. Веб-прокси или прозрачный прокси), который модифицирует рукопожатие от клиента до того, как он достигнет сервера. Это не только заголовок Connection, но и клиентское рукопожатие также пропускает третье значение ключа. На самом деле, одна из причин того, что версии протокола HyBi используют другой механизм дайджеста, должна быть более совместима с посредниками.

Предложения:

Если клиент и сервер находятся в одной сети, и у вас есть настройки прокси в Chrome, попробуйте временно отключить прокси-сервер и посмотрите, работает ли это.

Если клиент и сервер не находятся в одной сети, и у вас есть контроль над двумя компьютерами в одной сети, попробуйте запустить клиент на одном и сервере на другом (и по-прежнему убедитесь, что у вас нет настроек прокси-сервера в Chrome). Это должно исключить возможность прозрачного посредничества/посредничества с рукопожатием.

Если вы уверены, что Chrome виноват, а не посредник, вы можете убедиться в этом, запустив wirechark на клиенте во время соединения, и вы сможете проверить фактические пакеты. Если Chrome действительно отправляет это точное рукопожатие, возможно, что что-то о вашей конфигурации вызывает ошибку Chrome.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню