Tối đa kết nối http song song trong một trình duyệt?


465

Tôi đang tạo một số kết nối bị treo đến máy chủ HTTP (sao chổi, đảo ngược ajax, v.v.). Nó hoạt động tốt, nhưng tôi thấy trình duyệt chỉ cho phép hai kết nối bị treo đến một miền nhất định. Vì vậy, nếu người dùng đang xem trang web của tôi trong Tab1 trên trình duyệt của họ, thì họ cũng thử tải nó trong Tab2, họ đã sử dụng hết hai kết nối được phép vào trang web của tôi.

Tôi nghĩ rằng tôi có thể thực hiện một số điều tên miền ký tự đại diện, nơi tôi có máy chủ http của tôi giải quyết bất kỳ địa chỉ nào cho trang web của tôi như:

*.example.com/webapp  -> 192.0.2.1 (the actual ip of my server)

vì thế:

a.example.com/webapp
b.example.com/webapp
c.example.com/webapp

tất cả vẫn trỏ đến ( www.example.com/webapp) nhưng trình duyệt coi chúng là các miền khác nhau, vì vậy tôi không chạy vào giới hạn kết nối 2. Điều này có đúng không?

Ngay cả khi điều đó đúng - có giới hạn nào về số lượng kết nối hoạt động trên mỗi trình duyệt, trên tất cả các miền không? Giả sử tôi sử dụng sơ đồ trên - ví dụ Firefox có chỉ cho phép 24 kết nối song song tại bất kỳ thời điểm nào không? Cái gì đó như:

1) a.example.com/webapp
2) www.download.example/hugefile.zip
3) b.example.com/webapp
4) c.example.com/webapp
...
24) x.example.com/webapp
25) // Error - all 24 possible connections currently in use!

Tôi chỉ chọn 24 kết nối / Firefox làm ví dụ.



3
vâng, nó được gọi là shending domain , một chiến lược lỗi thời trong thời đại HTTP / 2
Jeff Puckett

Giải pháp ở đây là chỉ có một kết nối bị treo cho tất cả các cập nhật tab của bạn. Khi một tab được mở, một yêu cầu cập nhật cho tab đó được gửi đến máy chủ và tab lắng nghe kết nối bị treo chính cho bất kỳ bản cập nhật nào và chỉ chọn ra những gì nó quan tâm. Tôi biết đây không phải là điều bạn quan tâm. Tôi đang hỏi, nhưng nghĩ rằng nó có thể hữu ích cho ai đó. :-)
Craigo

Câu trả lời:


418

Số lượng kết nối liên tục mặc định đồng thời trên mỗi máy chủ / proxy:

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

Giới hạn là trên mỗi máy chủ / proxy, vì vậy lược đồ ký tự đại diện của bạn sẽ hoạt động.

FYI: điều này đặc biệt liên quan đến HTTP 1.1; các giao thức khác có mối quan tâm và hạn chế riêng biệt (ví dụ: SPDY, TLS, HTTP 2).


41
Tôi ngạc nhiên. Không phải HTTP 1.1 RFC nói sẽ giới hạn các kết nối liên tục ở mức 2 trên mỗi máy chủ?
Adrian McCarthy

53
Có nó làm. Các trình duyệt gần đây không tuân thủ nữa.
Alsciende

38
Trích dẫn cho những giới hạn này?
AJ.

19
Có bất kỳ giới hạn nào đối với các kết nối WebSockets trên mỗi nguồn gốc không?
Mitar

13
Giới hạn 2 kết nối trên mỗi máy chủ đã bị xóa khỏi HTTP 1.1 RFC: evertpot.com/http-11-updated
Florian Winter

195

HTTP / 1.1

IE 6 and 7:      2
IE 8:            6
IE 9:            6
IE 10:           8
IE 11:           8
Firefox 2:       2
Firefox 3:       6
Firefox 4 to 46: 6
Opera 9.63:      4
Opera 10:        8
Opera 11 and 12: 6
Chrome 1 and 2:  6
Chrome 3:        4
Chrome 4 to 23:  6
Safari 3 and 4:  4

nguồn: http://p2p.wrox.com/book-prof Professional-website-performance-optimizing-front-end-back-end-707 /

HTTP / 2 (SPDY)

Multiplexed support(one single TCP connection for all requests)

Một bảng tương tự có thể được tìm thấy tại http://sgdev-blog.blogspot.com/2014/01/maximum-conciverse-connection-to-same.html
Jo.

1
Trình duyệt có thể thực sự sử dụng các giá trị cao này nếu nó bị giới hạn ở giá trị thấp hơn ở cấp hệ điều hành? Trình duyệt có thể ghi đè cài đặt hệ điều hành không? Giống như trong Windows, bạn có một vài cài đặt đăng ký (MaxConnectionsPerServer và MaxConnectionsPer1_0Server) kiểm soát các kết nối tối đa trên mỗi máy chủ như được đề cập trong bài đăng này: stackoverflow.com/questions/2960056/,
RBT

Điều đó hóa ra là một vấn đề cụ thể về lập trình .NET. Ở mọi mức độ, các trình duyệt bên thứ ba thực hiện hỗ trợ HTTP của riêng họ để không bị ảnh hưởng bởi các giới hạn của Windows.
thomasrutter

Vì vậy, thông thường, Trình duyệt web sẽ mở một số kết nối TCP (~ 6 song song) trên mỗi máy chủ để tải các tài nguyên khác nhau nhanh hơn với HTTP 1.1, điều này không còn xảy ra nữa đối với HTTP / 2 vì việc ghép kênh tăng tốc độ tương tự trên một TCP kết nối?
Stefan

118
 BrowserVersion | ConnectionsPerHostname | MaxConnections
----------------------------------------------------------
 Chrome34/32    | 6                      | 10
 IE9            | 6                      | 35
 IE10           | 8                      | 17
 IE11           | 13                     | 17
 Firefox27/26   | 6                      | 17
 Safari7.0.1    | 6                      | 17
 Android4       | 6                      | 17
 ChromeMobile18 | 6                      | 16
 IE Mobile9     | 6                      | 60

Giá trị đầu tiên là ConnectionsPerhostname và giá trị thứ hai là MaxConnections .

Nguồn: http://www.browserscope.org/?carget=network&v=top

Lưu ý: ConnectionsPerhostname là số lượng yêu cầu http đồng thời tối đa mà các trình duyệt sẽ thực hiện cho cùng một tên miền. Để tăng số lượng kết nối đồng thời, người ta có thể lưu trữ tài nguyên (ví dụ: hình ảnh) trong các miền khác nhau. Tuy nhiên, bạn không thể vượt quá MaxConnections , tổng số kết nối tối đa mà trình duyệt sẽ mở tổng cộng - trên tất cả các miền.

Cập nhật 2020

Số lượng kết nối song song trên mỗi trình duyệt

| Browser              | Connections per Domain         | Max Connections                |
| -------------------- | ------------------------------ | ------------------------------ |
| Chrome 81            | 6 [^note1]                     | 256[^note2]                    |
| Edge 18              | *same as Internet Explorer 11* | *same as Internet Explorer 11* |
| Firefox 68           | 9 [^note1] or 6 [^note3]       | 1000+[^note2]                  |
| Internet Explorer 11 | 12 [^note4]                    | 1000+[^note2]                  |
| Safari 13            | 6 [^note1]                     | 1000+[^note2]                  |
  • [^ note1]: đã thử nghiệm với 72 yêu cầu, 1 tên miền (127.0.0.1)
  • [^ note2]: đã thử nghiệm với 1002 yêu cầu, 6 yêu cầu cho mỗi tên miền * 167 tên miền (127.0.0. *)
  • [^ note3]: khi được gọi trong ngữ cảnh không đồng bộ, ví dụ như trong cuộc gọi lại của setTimeout, + requestAnimationFrame, then...
  • [^ note4]: trong đó 6 người cuối cùng là người theo dõi (2,4,6 có sẵn ở mức 0,5 giây, 1 giây, 1,5 giây)

11
Kể từ phiên bản 50+, Chrome hiện hỗ trợ tối đa 17 Kết nối tối đa, đưa nó ngang tầm với Firefox và Safari.
Zhaph - Ben Duguid

Tôi nghĩ rằng câu trả lời này là một chút sai lệch. Máy chủ và tên miền là hoàn toàn khác nhau. ConnectionsPerhostname có nghĩa là mỗi tên miền phụ. Vì vậy, nếu có 2 tên miền phụ, nó sử dụng các kết nối bổ sung. Nếu không có tên miền phụ thì có nghĩa là mỗi tên miền.
Don Dilanga

14
Là giới hạn cho mỗi tab chrome? Hoặc Tất cả các tab trong một phiên bản Chrome? Hoặc tất cả các tab trên tất cả các phiên bản của Chrome?
AshD


14

Firefox lưu số đó trong cài đặt này (bạn tìm thấy nó about:config):network.http.max-connections-per-server

Đối với các kết nối tối đa, Firefox lưu trữ trong cài đặt này: network.http.max-connections


network.http.max-connectionslà 900 theo mặc định, không liên quan đến số lượng kết nối song song tối đa mà qua thử nghiệm phiên bản 52 vẫn là 17.
user2867288

3
network.http.max-persistent-connections-per-serverthực sự
Lech Osiński

9

Thực hiện kiểm tra trên một trang tôi thấy hành vi này:

Safari 4: 6  
Chrome 6: 7  
FF 4: 6

Chỉnh sửa: Có vẻ như firefox 4 có thể thực hiện 15 kết nối nhưng đó không phải là hành vi tôi quan sát được.


Phiên bản Chrome nào? 6 hay 5?
Husky

Tôi nghĩ đó là 6 nhưng tôi đang ở trên kênh dev và cách đây ít lâu. Các cập nhật im lặng có nghĩa là tôi phải kiểm tra tất cả các thời gian.
Jethro Larson

5

2 yêu cầu đồng thời là một phần có chủ ý trong thiết kế của nhiều trình duyệt. Có một tiêu chuẩn ngoài kia là "khách hàng http tốt" tuân thủ mục đích. Kiểm tra RFC này để xem tại sao.


Tôi đồng ý, có lẽ tốt nhất là tuân theo tiêu chuẩn.
palswim

13
Theo các tiêu chuẩn là tốt, nhưng cũng đang áp dụng lẽ thường và tham gia sửa đổi những điều đó: xem trac.tools.ietf.org/wg/httpbis/trac/ticket/131
Julian Reschke

1
Điểm hay @JulianReschke, nhưng với HTTP / 2 thì không cần phải có số lượng kết nối cao trên mỗi máy chủ nữa. Xem: http2.github.io/faq/#why-just-one-tcp-connection
David

5

Nhìn about:configvào Firefox 33 trên GNU / Linux (Ubuntu) và tìm kiếm connectionstôi thấy:

mạng.http.max-kết nối: 256

Điều đó có khả năng trả lời một phần là có giới hạn số lượng kết nối hoạt động trên mỗi trình duyệt, trên tất cả các miền

mạng.http.max-continent-results-per-proxy: 32

mạng.http.max-continent-results-per-server: 6

bỏ qua hai thuộc tính ...

mạng.websocket.max-kết nối: 200

(thú vị, có vẻ như chúng không bị giới hạn trên mỗi máy chủ nhưng có giá trị mặc định thấp hơn kết nối http toàn cầu)


2

Lưu ý rằng việc tăng kết nối tối đa của trình duyệt trên mỗi máy chủ lên số lượng quá mức (như một số trang web gợi ý) có thể và khóa những người dùng khác khỏi các trang web nhỏ với các gói lưu trữ giới hạn tổng số kết nối đồng thời trên máy chủ.


2

Hiểu biết của tôi là giới hạn kết nối không thể thay đổi ở phía khách hàng. Giới hạn kết nối phải được thay đổi trên máy chủ để có bất kỳ ảnh hưởng nào. Theo mặc định, nhiều máy chủ sẽ chỉ cho phép 2 kết nối cho mỗi máy khách.

Máy khách không phải là trình duyệt, nó là máy khách phát hành các yêu cầu TCP / IP.

Để thấy rõ hiệu quả, hãy sử dụng một cái gì đó như JMeter để thực hiện một loạt các cuộc gọi dịch vụ web đến máy chủ của bạn - nó sẽ chấp nhận hai cuộc gọi đầu tiên và sẽ không chấp nhận cuộc gọi khác cho đến khi một trong hai hoàn thành. Điều tuyệt vời về điều này là đối với một cửa hàng SOA, điều này rất quan trọng, nhưng hầu như không ai thực sự biết về nó.


1

Không có câu trả lời dứt khoát cho điều này, vì mỗi trình duyệt có cấu hình riêng cho việc này và cấu hình này có thể được thay đổi. Nếu bạn tìm kiếm trên internet, bạn có thể tìm cách thay đổi giới hạn này (thông thường chúng được gắn nhãn là "phương pháp nâng cao hiệu suất.") Có thể đáng để khuyên người dùng của bạn làm như vậy nếu trang web của bạn yêu cầu.


Tôi nhắc lại, đây không phải là cấu hình trên trình duyệt - hoặc có thể, nhưng vẫn không có tác dụng. Đó là máy chủ đang thực thi 2 kết nối cho mỗi máy khách, không phải máy khách cũng như trình duyệt trên máy khách. Việc tăng các kết nối trên trình duyệt sẽ cho phép bạn có 2 kết nối đến các máy chủ khác biệt hơn (tức là bạn có thể tải xuống từ nhiều máy chủ cùng một lúc, không vấn đề gì). Tuy nhiên, bạn không thể tải xuống hơn 2 tệp từ bất kỳ máy chủ nào cùng một lúc. Để làm điều đó, máy chủ phải được sửa đổi.
Rodney P. Barbati

2
Cho rằng câu trả lời này đã lỗi thời, nhưng nó chính xác kể từ thời điểm nó được viết. Đầu tiên, các máy chủ hiếm khi giới hạn đáng kể các kết nối trên mỗi IP, vì vậy tôi nghĩ rằng bạn đã sai ở đó. Thứ hai, vào năm 2009, IE 7 vẫn còn tồn tại và nó có tối đa hai kết nối cho mỗi tên máy chủ. Đây là cấu hình thông qua đăng ký hệ thống. Ngay cả ngày nay, các trình duyệt có giới hạn và chúng thường có thể cấu hình được, nhưng những giới hạn đó cao hơn nhiều so với trước đây. Dù sao, với sự ra đời của SPDY / HTTP2, điều này đã trở thành một vấn đề nhỏ hơn đáng kể khi các máy chủ và trình duyệt thực hiện giao thức mới.
Blixt

1
  1. Có, tên miền ký tự đại diện sẽ làm việc cho bạn.
  2. Không nhận thấy bất kỳ giới hạn về kết nối. Giới hạn nếu có sẽ là trình duyệt cụ thể.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.