Проблема рукопожатия - PullRequest
1 голос
/ 21 июля 2011

Я создал сервер веб-сокетов в Python (, основанный на этой сущности ), который работает на локальном хосте, но не на рабочем сервере.

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

//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: значение заголовка« Соединение »не является« Обновлением »» - но в сообщениях рукопожатия между сервером и клиентом соединение (с сервера) имеет правильное значение:

//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

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

  • Где находится сумасшедший код в конце сообщения?
  • ЗначениеЗаголовок «Соединение» имеет значение «закрыть»?!

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

1 Ответ

3 голосов
/ 21 июля 2011
  • Что за сумасшедший код в конце сообщений?

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

  • Почему значение 'В заголовке соединения установлено значение «закрыть»?

Мне кажется, что существует посредник (то есть веб-прокси или прозрачный прокси), который изменяет рукопожатие от клиента до того, как оно достигаетсервер.Это не только заголовок Соединения, который является неправильным, но клиентское рукопожатие также пропускает третье значение ключа.Фактически, одна из причин, по которой версии протокола HyBi используют другой механизм дайджеста, заключается в большей совместимости с посредниками.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...