Читайте про
вебсокеты. Почти вся информация, которая касается чата, ходит по сокетам. Если поймёте как работают вебсокеты, то поймёте принцип работы таких чатов.
Статус unread можно определять по-разному. Один из вариантов — показывать так сообщения, которые оставили после последней активности пользователи: пользователь разлогинился в 17:30, значит все сообщения после этого будут unread. Прочитанными их можно сделать, когда юзер снова подключится к чату и unread-сообщения будут в области видимости (прокручивает историю — сообщения помечаются как прочитанные). Таким же образом можно помечать сообщения, если пользовать между каналами переключается — фиксировать момент, когда он покинул канал.