Как работают WebSockets?
WebSocket - постоянное соединение поверх http(s)
При установлении соединения происходит рукопожатие с помощью специальных http заголовков, после любая сторона в любой момент времени (пока соединение не прервется) может писать в тело запроса сообщения. Каждое такое сообщение представляет из себя передаваемые данные + мета-данные
1. Можно найти сходство с tcp, только вместо пакета у нас сообщение. Так как ws работают поверх http, который в свою очередь работает поверх tcp, то формально одно сообщение может быть разбито на несколько tcp пакетов, а в одном пакете может содержаться несколько сообщений, однако единицей данных для ws является именно сообщение
2. ws - это постоянное соединение, которое будет висеть пока любая из сторон не закроет его либо пока не оборвется связь. Так как сокет формально может простаивать (когда нет обмена данными), то tcp соединение для него нужно открывать с опцией keep-alive, а так же желательно отправлять http заголовки для keep-alive в рукопожатии.
3. Любая сторона может в любой момент времени может отправить любое количество сообщений. Получающая сторона получит данные, когда до нее дойдут все tcp пакеты самого раннего из сообщений (это гарантирует, что сообщения придут в том же порядке, в котором они были отправлены)
Вкратце:Ответы
1. Не совсем, но, думаю, скоро будет понятно
2. Соединение всегда открыто, если одна из сторон его не закроет или не прервется связь
3. Клиент отправляет - сервер тут же получает. Сервер отправляет - клиент тут же получает.На примере чата
1. Устанавливается соединение между сервером и клиентом 1 (handshake)
2. Сервер -> клиент1: Вы присоединились к чату
3. Сервер -> клиент1: Сейчас у нас 1 пользователь: клиент1
4. Устанавливается соединение между сервером и клиентом 2 (handshake)
5. Сервер -> клиент2: Вы присоединились к чату
6. Сервер -> клиент2: Сейчас у нас 2 пользователя: клиент1 и клиент2
7. Сервер -> клиент1: Присоединился клиент2
8. Клиент1 -> сервер: Скажи клиент2 "Привет!"
9. Сервер -> клиент2: Клиент1 сказал "Привет!"
10. Клиент2 -> сервер: Скажи клиент1 "Здасте!"
11. Сервер -> клиент1: Клиент2 сказал "Здасте!"
То есть клиенты могут когда угодно посылать сообщение серверу, он сразу же его прочитает, но не другим клиентам (минус сокетов). Сервер может послать сообщение любому клиенту, они сразу же его прочитают.