web進化史
在介紹 websocket 之前, 必須了解 web 通訊技術的進化史, 我們常常在說的 “WEB” 就是由 提姆·柏內茲-李爵士 (Sir Tim Berners-Lee) 在1989年發明的 "WWW" (World Wild Web), 包括這兩個重點技術, 造就了今天的科技網路
那為什麼我們已經有了 HTTP, 還會需要別的協議? 因為 HTTP 是“單向通訊“的協議, 使用者請求資源必須發出一個 request, 再由伺服器回應一個 response, 若要即時的更新資料必須不斷重新整理, 或是藉由event動作發出request 重新要求資料, 伺服器沒有辦法主動 push 資源到client端, 於是後來有了 ”Polling、Long-Polling、Streaming“ 這類技術相應出現
輪詢(polling)的做法是讓瀏覽器每隔一段時間就自動送出一個 HTTP 請求給伺服器,獲取最新的網頁資料,這個做法是最老舊的方式,如果你已經事先知道伺服器上資料更新的頻率或時間,那麼就可以使用這樣的方式讓瀏覽器上的資料同步更新,但是在許多即時性的網頁應用程式上,情況並不是這樣,你通常不會知道伺服器上的資料何時會更新,在伺服器沒有新資料時,瀏覽器如果也送出 HTTP 請求,就會造成浪費網路資源的狀況。
長時間輪詢(long-polling)則是讓伺服器在接收到瀏覽器所送出 HTTP 請求後,伺服器會等待一段時間,若在這段時間裡面伺服器有新的資料,它就會把最新的資料傳回給瀏覽器,如果等待的時間到了之後也沒有新資料的話,就會送一個回應給瀏覽器,告知瀏覽器資料沒有更新。
雖然長時間輪詢可以減少產生原本輪詢(polling)造成網路頻寬浪費的狀況,但是如果在資料更新很頻繁的狀況下,長時間輪詢並不會比傳統的輪詢有效率,而且有時候資料量很大時,會造成連續的 polls 不斷產生,反而會更糟糕。
串流(streaming)是讓伺服器在接收到瀏覽器所送出 HTTP 請求後,立即產生一個回應瀏覽器的連線,並且讓這個連線持續一段時間不要中斷,而伺服器在這段時間內如果有新的資料,就可以透過這個連線將資料馬上傳送給瀏覽器。
這個方式雖然不錯,但是由於他是建立在 HTTP 協定上的一種傳輸機制,所以有可能會因為代理伺服器(proxy)或防火牆(firewall)將其中的資料存放在緩衝區中,造成資料回應上的延遲,因此許多使用串流的 Comet 實作會在偵測到有代理伺服器的狀況時,改用長時間輪詢的方式處理。另外透過 TLS(SSL)的連線也可以避免緩衝區的問題,但是這個方式除了設定麻煩之外,也會造成伺服器額外的負擔。
以上這些即時性更新網頁的技術都有使用到 HTTP 的請求與回應,所以在網路上傳輸的資料中,一定會包含 HTTP 的表頭資訊,而這些資料其實不是必要的,多傳輸這些資料反而會造成網路延遲上升。
某知名拍賣網站使用的即時通訊技術為 long-polling ,實測等待時間約為23分
參考資料 G. T. Wang