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ự.
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
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
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