Могут ли сообщения веб-сокета потеряться или нет?

В настоящее время я разрабатываю клиентское приложение Java WebSocket, и я должен убедиться, что каждое сообщение с сервера получено клиентом. Возможно ли, что я теряю некоторые сообщения (после того, как они отправлены с сервера) из-за разрыва соединения? WebSocket основан на TCP, так что этого не должно быть, верно?


person Adrian Krebs    schedule 09.09.2015    source источник
comment
Либо вы получаете сообщение, либо полностью теряете соединение.   -  person user253751    schedule 09.09.2015
comment
Но после того, как я полностью потерял соединение, клиентская конечная точка веб-сокета больше не будет работать, верно? Вот почему я создал обработчик повторного подключения, который отправляет сообщение ping/pong каждые 30 секунд, чтобы проверить, работает ли соединение, и если нет, он пытается создать новое соединение с сервером.   -  person Adrian Krebs    schedule 09.09.2015
comment
получено не значит, что прочитано   -  person symbiont    schedule 09.06.2019


Ответы (4)


Это может случится. TCP гарантирует порядок пакетов, но это не означает, что все пакеты, отправленные с сервера, достигают клиента, даже если в базовой сети возникает неустранимая проблема. Представьте, что кто-то выдергивает кабель вашей локальной сети или отключает точку доступа Wi-Fi в самый неподходящий момент, пока ваше приложение обменивается данными с вашим сервером. TCP не преодолевает такую ​​беду.

Чтобы гарантировать, что каждое сообщение WebSocket, отправленное с вашего сервера, достигнет вашего клиента, вы должны реализовать какой-то SYN/ACK на прикладном уровне.

person Takahiko Kawasaki    schedule 09.09.2015
comment
похоже, вы предполагаете, что недошедшие TCP-пакеты могут остаться незамеченными. не проблема ли на прикладном уровне, где оборудование уже отправило ACK, но приложение вылетает до того, как прочитает полученное сообщение? - person symbiont; 09.06.2019
comment
Достаточно ли ACK прикладного уровня, чтобы гарантировать ровно 0% потерянных пакетов? Мы разрабатываем приложение, в котором потеря даже 0,001% вызовет серьезные проблемы. Спасибо! - person ch271828n; 13.04.2020

TCP является гарантированным протоколом — пакеты будут получены в правильном порядке более высокими уровнями приложений на дальнем конце (в отличие от UDP, который является протоколом отправки и ожидания).

Вообще говоря, TCP следует использовать для соединений, где все данные должны правильно поступать на дальний конец. UDP используется там, где отсутствующий пакет может быть отброшен без существенных проблем (например, потоковые сервисы, обновления NTP).

person Stephen    schedule 09.09.2015

В моей игре, чтобы противостоять пропущенным сообщениям веб-сокета, я добавил идентификатор int/long для каждого сообщения. Когда клиент обнаружит, что что-то не так в последовательности полученных им идентификаторов, он запросит новые данные с сервера, чтобы иметь возможность правильно восстановиться.

person carldevelopsforcoffee    schedule 27.09.2018
comment
Вы думаете о веб-RTC? веб-сокеты должны доставлять сообщения по порядку внутри сокета. - person Jayen; 16.12.2019

В протоколе TCP есть нечто, называемое Поток управления, что означает, что он обеспечивает надежную, упорядоченную доставку с проверкой ошибок. Другими словами, TCP — это протокол, который постоянно проверяет, пришли ли данные.

Этот протокол имеет различные механизмы для обеспечения этого. Вы можете увидеть разницу между TCP и UDP (у которого нет потока управления) по ссылке ниже.

Разница между tcp и udp

person Yaron Raznik    schedule 09.09.2015