http長輪詢&短輪詢

http 協議介紹:

http 協議是請求/響應範式的, 每個 http 響應都是由一個對應的 http 請求產生的; http 協議是無狀態的, 多個 http 請求之間是沒有關係的.html

http 長鏈接:

目前 http 協議廣泛使用的是 1.1 版本, 以前有個 1.0 版本, 二者之間的一個區別是 1.1 支持 http 長鏈接, 或者叫持久鏈接.1.0 不支持 http 長鏈接, 每次一個 http 請求響應後都關閉 tcp 鏈接, 下個 http 請求會從新創建 tcp 鏈接.web

所謂 http 長鏈接, 就是多個 http 請求共用一個 tcp 鏈接; 這樣能夠減小屢次臨近 http 請求致使 tcp 創建關閉所產生的時間消耗. http 1.1 中在請求頭和相應頭中用 connection字段標識是不是 http 長鏈接, connection: keep-alive, 代表是 http 長鏈接; connection:closed, 代表服務器關閉 tcp 鏈接瀏覽器

與 connection 對應的一個字段是 keep-live, http 響應頭中出現, 他的格式是 timeout=30, max=5, timeout 是兩次 http 請求保持的時間(s), , max 是這個 tcp 鏈接最多爲幾個 http 請求重用緩存

http 長輪詢:

http 長輪詢是服務器收到請求後若是有數據, 馬上響應請求; 若是沒有數據就會 hold 一段時間, 這段時間內若是有數據馬上響應請求; 若是時間到了尚未數據, 則響應 http 請求;瀏覽器受到 http 響應後立在發送一個一樣 http 請求查詢是否有數據;服務器

http 長輪詢的侷限:異步

  1. 瀏覽器端對統一服務器同時 http 鏈接有最大限制, 最好同一用戶只存在一個長輪詢;
  2. 服務器端沒有數據 hold 住鏈接時會形成浪費, 容易產生服務器瓶頸;

http 短輪詢:

http端輪詢是服務器收到請求無論是否有數據都直接響應 http 請求; 瀏覽器受到 http 響應隔一段時間在發送一樣的 http 請求查詢是否有數據;tcp

http 短輪詢的侷限是實時性低;htm

二者相同點:
能夠看出 http 長輪詢和 http 短輪詢的都會 hold 一段時間;blog

二者不一樣點
間隔發生在服務端仍是瀏覽器端: http 長輪詢在服務端會 hold 一段時間, http 短輪詢在瀏覽器端 「hold」 一段時間;get

應用:

長輪詢通常用在 web im, im 實時性要求高, http 長輪詢的控制權一直在服務器端, 而數據是在服務器端的, 所以實時性高;
像新浪微薄的im, 朋友網的 im 以及 webQQ 都是用 http 長輪詢實現的;
NodeJS 的異步機制貌似能夠很好的處理 http 長輪詢致使的服務器瓶頸問題, 這個有待研究.

http 短輪詢通常用在實時性要求不高的地方, 好比新浪微薄的未讀條數查詢就是瀏覽器端每隔一段時間查詢的.

其餘:

關於 http 長鏈接一個誤解就是服務器主動推送數據, 這個在 http 協議下是沒法實現的, 由於 http 請求/響應範式決定的, http 中服務器返回數據必需要有一個瀏覽器端的請求對應, 服務器沒法主動推送給瀏覽器數據.
無論 http 長輪詢仍是 http 短輪詢 保證同一個用戶在多 tab 下只存在一個定時查詢是有好處的, 這能夠經過在瀏覽器端緩存數據解決, 在 http 響應後在瀏覽器端緩存數據, 並設置一個有效期, 而後在每次發送 http 請求時檢查是否有有效數據, 沒有則發送請求獲取

 

轉自:http://blog.sina.com.cn/s/blog_70899b710101azb5.html

相關文章
相關標籤/搜索