2013-06-25 29 views
5

Tôi đang cố gắng hiểu các kết nối HTTP pipelining và HTTP keep-alive là gì, và cố gắng thiết lập kết nối giữa hai chủ đề này và công nghệ sự kiện Server Sent.HTTP: mối quan hệ giữa pipelining, keep-alive và Server Sent Events là gì?

Theo như tôi hiểu, Kết nối HTTP giữ lại là mặc định trong HTTP 1.1 cách sử dụng TCP khi kết nối TCP được thiết lập một lần được sử dụng để gửi một số yêu cầu HTTP. HTTP pipelining là khả năng của khách hàng gửi yêu cầu đến máy chủ trong khi phản hồi cho các yêu cầu trước chưa được nhận bằng cách sử dụng cùng một kết nối TCP, thường không được sử dụng như một cách mặc định trong trình duyệt.

Câu hỏi của tôi:

1) nếu nó có thể gửi nhiều yêu cầu đến máy chủ một sau khi một sử dụng một kết nối TCP - làm thế nào khách hàng có thể phân biệt giữa các câu trả lời? Tôi đoán khách hàng đang sử dụng thứ tự FIFO gửi phản hồi bằng máy chủ?

2) Tại sao các yêu cầu không phải idempotent như yêu cầu POST không được pipelined (theo wikipedia)?

3) Điều gì về các giới hạn của máy chủ web: số lượng kết nối TCP có thể mở có hạn chế không? Nếu có, thì nếu một số khách hàng giữ các kết nối liên tục, những người khác không thể thiết lập các kết nối, và điều này có thể dẫn đến một vấn đề, đúng không?

4) Sự kiện được gửi của máy chủ đang sử dụng kết nối tiếp tục nhưng theo như tôi hiểu, SSE không sử dụng pipelining. Thay vào đó, họ quản lý để xử lý một số phản hồi cho một yêu cầu hoặc có thể họ chỉ gửi một yêu cầu khác khi phản hồi tiếp theo với sự kiện đã đến. Dự đoán nào là đúng?

5) Một kết nối TCP có nghĩa là một ổ cắm? Một socket có nghĩa là một kết nối TCP? Đóng/mở ổ cắm có nghĩa là đóng/mở kết nối TCP?

Trả lời

4
  1. Có, FIFO. TCP/IP đảm bảo cung cấp dữ liệu theo thứ tự, do đó phản hồi không thể đến theo thứ tự khác (nếu máy chủ/proxy bị lỗi và gửi phản hồi theo thứ tự sai thì bạn hoàn toàn bị lỗi).

  2. Tôi không nhớ bất kỳ lý do nào cho mỗi thông số HTTP. Nó có thể chỉ là thận trọng, bởi vì pipelining được thực hiện kém trong một số proxy/máy chủ.

  3. Thông số HTTP đề xuất 2 kết nối cho mỗi máy chủ, trình duyệt đã giải quyết trên 6-8 kết nối trên mỗi máy chủ, nhưng không có giới hạn cố định. Chạy ra khỏi các kết nối là một vấn đề thực sự đối với Apache, và đối với các tình huống tải cao, nên tắt KeepAlive trong Apache và sử dụng proxy (ví dụ: HAProxy) có thể cung cấp chức năng Keep-Alive giá rẻ cho khách hàng.
    Lợi ích của proxy là một proxy có thể phân phối kết nối tới một số máy chủ (giúp mở rộng quy mô) hoặc có thể sửa đổi lưu lượng truy cập (ví dụ: gzip nén mọi thứ ngay cả khi phần mềm phía máy chủ không).

  4. SSE không dựa vào Keep-Alive. Nó không sử dụng nhiều câu trả lời. Đó là một câu trả lời duy nhất mất mãi mãi để "tải xuống", do đó việc pipelining hoặc keep-alive không liên quan đến SSE. Kết nối TCP/IP không thể trả lại bất kỳ phản hồi nào khác trong khi phản hồi SSE đang được gửi.
    SSE sẽ giữ cho máy chủ bận miễn là kết nối được mở (vì vậy hãy gõ mọi lúc cho mọi người dùng). Đó là lý do tại sao tốt nhất nên sử dụng SSE với Node.js/Tornado có thể xử lý hàng trăm nghìn kết nối thay vì PHP/Apache được thiết kế cho vài kết nối tại một thời điểm.

  5. Ổ cắm là giao diện lập trình cho kết nối TCP/IP. Nói chung có, một ổ cắm là một kết nối.

+0

Cảm ơn porneL! 1) Nhưng nếu một số phản ứng đã đến sai thứ tự liên quan đến thứ tự đã gửi? 3) Lợi ích của việc sử dụng proxy là gì? nó phải thiết lập các kết nối tương tự với máy chủ không? 4) Vì vậy, bằng cách sử dụng SSE ngụ ý kết nối +1 do đó nâng cao tải máy chủ? – KutaBeach

+0

@KutaBeach Tôi đã mở rộng câu trả lời của mình – Kornel

Các vấn đề liên quan