瀏覽器向同一域名同時發送兩個 HTTP (ajax)請求,究竟是共用了一個 TCP 連接還是兩個?
之前答題時漏看了"同時「,所以做下補充。
HTTP1.1里大概規範了幾項提高性能的手段:
- 持久連接 (keep-alive/persistent connection)
- 並行連接
- Pipelining
第一點之前已經說過了,所以不表。
第二點,由於現代網頁通常包含了複數個(&>=10)資源,而按照默認設定,一個連接中的每一個請求必須等待收到響應後才能發送下一個請求,所以如果複數的資源請求全部在一個連接one by one發送給伺服器顯然會很慢,而為了彌補這一缺陷,瀏覽器通常會默認開啟多個TCP連接,然後再根據每個連接的狀態在其中依次發送數據請求,而且客戶端有權任意關閉超發的連接。各個瀏覽器允許的並行連接數大致是這樣的(From SO):
Firefox 2: 2
Firefox 3+: 6
Opera 9.26: 4
Opera 12: 6
Safari 3: 4
Safari 5: 6
IE 7: 2
IE 8: 6
IE 10: 8
Chrome: 6
由於TCP協議本身有慢啟動的特徵,會隨著時間調諧連接的最大速度,因此在現代瀏覽器中持久連接和並行連接通常是搭配在一起使用的—— 一方面由於持久連接的存在,每個TCP連接已經處於調諧後的狀態,另一方面持久連接可以避免重新三次握手的開銷。
關於第三點,
按照HTTP1.1的描述,還有種可以提升性能的方案是管道化,可以在一個連接中發送多個請求不必等待前一個請求返回。但這項技術比較容易踩坑,所以主流面向用戶的瀏覽器,這項技術是被默認關閉。管道化的具體情形如下圖:
關於HTTP2:
HTTP2為了性能做了不少努力,比如提供了規範以支持連接的多路復用。
--------------------------------------------------------------------------------------------------------------------------------------------
HTTP1.0需要加上keep-alive的請求首部,否則默認一個請求一個連接。
HTTP1.1之後keep-alive(持久連接)被默認啟用,除非在響應中指定connection:close,否則webserver會假定所有連接都是持久的。
瀉藥
這種問題太含糊了
1、同一個域名不一定是同一台機器
所以對於服務端來說
是1個還是2個基本上無法確定
2、同時發送還是先後發送
同時發送,並且假定都落到同一個節點上
那麼很可能是2個
如果先後發送,並且假定都落到同一個節點上
則不一定
這要看服務端keep-alive的設置時間間隔了
這個時間和先後發送的時間間隔是否匹配
否則還會是2個吧
=== 補充 ===
謝謝提醒
說是瀏覽器會用幾個
還是同時發的
那顯然是有幾個用幾個啊
又不會復用
@Saviio沒有正面回答這個問題,不過關於HTTP中的持久連接理解得不錯。
關於樓主的問題:如果第一個請求完成後,再開始發送的第二個請求,就是1個tcp連接,如果是兩個請求同時開始,或者第一個請求還未結束就開始第二個請求,就是兩個tcp連接。
因為HTTP協議是同步的沒有多路復用支持。一個管道同時只能做一件事。
不過幸好現代計算機已經完全不用在乎幾個tcp連接了,協議簡單其實挺好的。
推薦閱讀:
※單頁應用如何解決 SEO ?
※在做 iOS 和 Android 的 HTML5 開發時,你都掉到過哪些坑裡?
※<body/onload=alert(1)> 是什麼寫法?
※一個前端菜鳥的艱苦尋找實習歷程?
※CoffeeScript 需要怎樣進入瀏覽器?
TAG:JavaScript | HTTP | TCP |