瀏覽器向同一網域名稱同時傳送兩個 HTTP ajax 請求,究竟是共用了乙個 TCP 連線還是兩個?

時間 2021-06-03 14:11:03

1樓:Saviio

之前答題時漏看了"同時「,所以做下補充。

HTTP1.1裡大概規範了幾項提高效能的手段:

持久連線 (keep-alive/persistent connection)

並行連線

Pipelining

第一點之前已經說過了,所以不表。

第二點,由於現代網頁通常包含了複數個(>=10)資源,而按照預設設定,乙個連線中的每乙個請求必須等待收到響應後才能傳送下乙個請求,所以如果複數的資源請求全部在乙個連線one by one傳送給伺服器顯然會很慢,而為了彌補這一缺陷,瀏覽器通常會預設開啟多個TCP連線,然後再根據每個連線的狀態在其中依次傳送資料請求,而且客戶端有權任意關閉超發的連線。各個瀏覽器允許的並行連線數大致是這樣的(From SO):

Firefox2:

2Firefox3+:

6Opera

9.26:4

Opera12:

6Safari3:

4Safari5:

6IE7:

2IE8:

6IE10:

8Chrome:6

由於TCP協議本身有慢啟動的特徵,會隨著時間調諧連線的最大速度,因此在現代瀏覽器中持久連線和並行連線通常是搭配在一起使用的—— 一方面由於持久連線的存在,每個TCP連線已經處於調諧後的狀態,另一方面持久連線可以避免重新三次握手的開銷。

關於第三點,

按照HTTP1.1的描述,還有種可以提公升效能的方案是管道化,可以在乙個連線中傳送多個請求不必等待前乙個請求返回。但這項技術比較容易踩坑,所以主流面向使用者的瀏覽器,這項技術是被預設關閉。

管道化的具體情形如下圖:

關於HTTP2:

HTTP2為了效能做了不少努力,比如提供了規範以支援連線的多路復用。

HTTP1.0需要加上keep-alive的請求首部,否則預設乙個請求乙個連線。

HTTP1.1之後keep-alive(持久連線)被預設啟用,除非在響應中指定connection:close,否則webserver會假定所有連線都是持久的。

使用同乙個核心得瀏覽器就不用考慮兩者得相容性了嗎?

雪見仙尊 需要考慮,但實際上遇到問題的可能性很小。這是因為核心版本的問題。比如說中國產的套殼瀏覽器 360瀏覽器,QQ瀏覽器,搜狗瀏覽器,極速瀏覽器 獵豹瀏覽器 它們的核心雖然也是 chromium,但可能落後 Chrome 穩定版數個版本,一些新特性的支援沒有及時跟進。不過既然是 新特性 那麼一般...

java如何實現同乙個瀏覽器同的乙個系統只能登入乙個賬號,如果登入了第二個,第乙個賬號自動登出?

zhangs1314 樓主的意思可能是在同乙個瀏覽器裡面的不同的標籤頁,訪問了同乙個專案,後面登入進去的賬號,把前面登入進去的賬號踢掉.以前俺的做法,一般是用ws協議做長連線.每乙個長連線的唯一標記是乙個sessionId.登入的時候,先判斷是否有sessionId被儲存過.如果有,伺服器向這個se...

如何讓同乙個網域名稱解析兩台伺服器?

柴健翌 這是可以做到的,但沒有卵用。加DNS記錄的時候可以加多條A或者CNAME記錄,解析的時候也會返回多條。但大多數客戶端只認先來的一條。這也是我們骨幹網上出現的特製DNS汙染的實現原理。正確的資料報會返回,不會被丟棄,但汙染包距離近永遠比正確的要來的快。這種場景下更常見的處理方案是設定乙個geo...