2011-09-05 19 views
9

Tôi đang sử dụng Firefox, nhưng tôi muốn biết cách các trình duyệt quyết định điều này nói chung.Trong trường hợp nào trình duyệt của tôi sẽ cố gắng sử dụng lại kết nối TCP cho nhiều yêu cầu?

Dường như khi tôi truy cập cùng một URL hai lần trong một khoảng thời gian ngắn, trình duyệt của tôi sẽ cố gắng sử dụng lại kết nối TCP giống nhau cho cả hai yêu cầu (điều này được gọi là giữ nguyên). Tuy nhiên, khi tôi truy cập hai URL khác nhau (nhưng vẫn được phục vụ bởi cùng một máy chủ), trình duyệt đôi khi quyết định mở một kết nối mới cho từng yêu cầu. Rõ ràng, trình duyệt không sử dụng chính sách một kết nối cho mỗi URL.

Tôi hỏi điều này vì tôi đang cố triển khai dịch vụ web sử dụng phiếu thăm dò ý kiến ​​dài. Tôi có thể tưởng tượng rằng người dùng có thể muốn mở dịch vụ này trong nhiều tab trên cùng một trình duyệt. Tuy nhiên, với việc duy trì hoạt động, yêu cầu thăm dò ý kiến ​​thứ hai sẽ không được gửi cho đến khi yêu cầu đầu tiên hoàn thành (ít nhất là trong Firefox), bởi vì trình duyệt đang cố gắng đẩy cả hai vào cùng một socket mà tôi không mong đợi khi tôi đã thiết kế dịch vụ. Ngay cả khi trình duyệt cài đặt đường ống lót, không có cách nào để tôi có thể trả lời yêu cầu thứ hai trước khi tôi trả lời yêu cầu đầu tiên, vì HTTP ủy nhiệm rằng tôi hoàn thành các câu trả lời theo thứ tự.

Trả lời

6

Khi sử dụng HTTP/1.1, theo mặc định, các kết nối TCP được mở để sử dụng lại. Đây là hiệu suất tốt hơn so với bắt đầu kết nối mới theo yêu cầu. Kết nối có thể được sử dụng lại nhưng kết nối có thể đóng bất kỳ lúc nào bởi bất kỳ bên nào.

Bạn nên đọc HTTP1.1 và phần liên quan đến kết nối liên tục.

Trong trường hợp của bạn, nó thậm chí không sử dụng đường ống HTTP (không được hỗ trợ rộng rãi) vì yêu cầu tiếp theo được gửi sau câu trả lời đầu tiên.

Trình duyệt có hồ bơi kết nối và sử dụng lại nó trên mỗi tên máy chủ. Nói chung, một trình duyệt không nên sử dụng lại một kết nối duy nhất cho nhiều tên máy chủ, ngay cả khi các tên máy chủ đó thực sự giải quyết đến cùng một địa chỉ IP.

Hầu hết các trình duyệt cho phép người dùng định cấu hình hoặc ghi đè số lượng kết nối liên tục trên mỗi máy chủ; hầu hết các trình duyệt hiện đại mặc định là sáu. Nếu Firefox là thực sự yêu cầu chặn yêu cầu thứ hai vì đã có kết nối đang hoạt động, đây là lỗi trong Firefox và phải được lưu trong hệ thống theo dõi lỗi của họ. Nhưng nếu một lỗi như vậy tồn tại, tôi nghĩ bạn sẽ thấy nhiều trang web bị hỏng.

+0

Mặc dù tôi yêu cầu Firefox gửi yêu cầu đến máy chủ lần thứ hai, tôi tin rằng nó không thực sự gửi yêu cầu bởi vì nó muốn đợi yêu cầu đầu tiên kết thúc để có thể sử dụng lại kết nối. Đây là một tính năng, không phải là một lỗi, đúng không? – Mark

+0

Có lẽ đối với các URL giống nhau, nó cố gắng sử dụng cùng một kết nối nhưng đối với URL, nó cố gắng chọn một kết nối khác trong hồ bơi? – Mark

+0

Nếu thử nghiệm của bạn là gửi 2 yêu cầu HTTP đồng thời tới cùng một URL, bạn có thể xem chúng "được tuần tự hóa" hoặc gửi qua 2 kết nối TCP khác nhau. NHƯNG bạn KHÔNG nhìn thấy chúng pipelined.What sẽ xảy ra, bây giờ là thực hiện dependend.E.g. trình duyệt có thể chọn sử dụng lại kết nối từ hồ bơi hoặc gửi yêu cầu thứ hai qua kết nối mới. Các phương pháp tiếp cận là chính xác vì HTTP là giao thức 'stateless'.Nếu việc triển khai của bạn phụ thuộc vào các chi tiết như vậy, thì IMHO có lỗ hổng trong thiết kế của bạn. Có thể bạn nên viết thêm về những gì bạn muốn đạt được. – Cratylus