У нас есть SPA, который запускает SockJ как на стороне клиента, так и на стороне сервера (NodeJs). Для рабочих станций Windows у нас нет проблем с поддержанием подключений через веб-сокеты к серверам, развернутым в Windows Azure. Но некоторые коллеги, использующие рабочие станции Mac OS X, в последние недели сталкиваются с частыми случайными отключениями веб-сокетов. Это происходит как в Chrome, так и в Firefox, поэтому похоже, что это происходит на более низком уровне ОС.
Насколько им известно, в OS X не было обновлений, которые могли бы повлиять на сетевой стек. Похоже, что на SockJs проблем нет. Какие-нибудь советы по устранению неполадок для OS X?
Так что мне удалось позаимствовать один из Macbook моего коллеги и установить на него Wireshark.
Наблюдая за HTTP-трафиком, я вижу, что происходят ожидаемые обмены обновлениями веб-сокетов, а потом, Я заметил пакеты сброса RST уровня TCP, отправленные с сервера. После этого клиентская рабочая станция должна снова инициировать совершенно новое HTTP-соединение и обновление веб-сокета. Что в конечном итоге заканчивается в другом RST с сервера.
Пытаясь сравнить ситуацию на моей рабочей станции Windows, я обнаружил, что сетевой стек автоматически отправляет на сервер пакеты keep-alive ACK каждые 3-5 секунд. Похоже, что сетевой стек Mac OS не понимает, что существующее HTTP-соединение обновлено до websocket, и поэтому не беспокоит доставку пакетов ACK, необходимых для информирования сервера о том, что он все еще жив.
Чтобы обойти эту проблему на Mac, мы написали наш клиент, который периодически отправляет данные «ping» для сохранения соединения с веб-сокетом.