В настоящее время я разрабатываю клиентское приложение Java WebSocket, и я должен убедиться, что каждое сообщение с сервера получено клиентом. Возможно ли, что я теряю некоторые сообщения (после того, как они отправлены с сервера) из-за разрыва соединения? WebSocket основан на TCP, так что этого не должно быть, верно?
Могут ли сообщения веб-сокета потеряться или нет?
Ответы (4)
Это может случится. TCP гарантирует порядок пакетов, но это не означает, что все пакеты, отправленные с сервера, достигают клиента, даже если в базовой сети возникает неустранимая проблема. Представьте, что кто-то выдергивает кабель вашей локальной сети или отключает точку доступа Wi-Fi в самый неподходящий момент, пока ваше приложение обменивается данными с вашим сервером. TCP не преодолевает такую беду.
Чтобы гарантировать, что каждое сообщение WebSocket, отправленное с вашего сервера, достигнет вашего клиента, вы должны реализовать какой-то SYN/ACK на прикладном уровне.
TCP является гарантированным протоколом — пакеты будут получены в правильном порядке более высокими уровнями приложений на дальнем конце (в отличие от UDP, который является протоколом отправки и ожидания).
Вообще говоря, TCP следует использовать для соединений, где все данные должны правильно поступать на дальний конец. UDP используется там, где отсутствующий пакет может быть отброшен без существенных проблем (например, потоковые сервисы, обновления NTP).
В моей игре, чтобы противостоять пропущенным сообщениям веб-сокета, я добавил идентификатор int/long для каждого сообщения. Когда клиент обнаружит, что что-то не так в последовательности полученных им идентификаторов, он запросит новые данные с сервера, чтобы иметь возможность правильно восстановиться.
В протоколе TCP есть нечто, называемое Поток управления, что означает, что он обеспечивает надежную, упорядоченную доставку с проверкой ошибок. Другими словами, TCP — это протокол, который постоянно проверяет, пришли ли данные.
Этот протокол имеет различные механизмы для обеспечения этого. Вы можете увидеть разницу между TCP и UDP (у которого нет потока управления) по ссылке ниже.