Effectivement, les WebSockets sont le mieux pour ça... mais en fait pas forcément :
À la suite de ton message, j'étais en train de regarder les échanges réseaux de facebook lors d'un chat, et eux, il n'utilisent pas les sockets, ce qui est quand même un peu intéressant, puisque, dans les moments où j'ai eu à faire ce genre de trucs, j'ai plutôt regardé du côté des sockets.
Du coup, j'ai continué mes recherches et en fait, Facebook fonctionne autrement, via AJAX.
Plutôt que de faire une requête AJAX tous les x temps (disons par exemple toutes les secondes), facebook fait une requête AJAX avec un très long timeout, et cette requête, côté serveur, ne répondra rien tant que rien ne se passe. Si la requête arrive à son timeout, une autre requête aussi longue est faite dans la foulée. Et si quelque chose se passe côté serveur, la requête en cours est utilisée pour retourner les données (et une autre longue requête est lancée directement).
Cette méthode a l'avantage d'être moins lourde à mettre en place que les sockets et moins gourmande qu'une requête qui tourne en boucle toutes les secondes ou moins pour rien.
Bref, c'est intéressant et je suis content d'avoir creusé la question, pasque je vais du coup implémenter le même système dans un projet sur lequel je bosse. 