Tại sao người ta nói rằng HTTP HTTP là một giao thức phi trạng thái?


170

HTTP có HTTP Cookies. Cookies cho phép máy chủ theo dõi trạng thái người dùng, số lượng kết nối, kết nối cuối cùng, v.v.

HTTP có các kết nối liên tục (Keep-Alive) trong đó một số yêu cầu có thể được gửi từ cùng một kết nối TCP.


3
Một lĩnh vực khác mà tôi không thấy "trạng thái không trạng thái" là trong Ủy quyền - đặc biệt là Ủy quyền ủy quyền. Có vẻ như đó là trạng thái trong quá trình đàm phán. Đối với Xác thực NTLM, khách hàng cần nhớ loại Xác thực Proxy và máy chủ cần phải ở trạng thái vì có một chuỗi các Loại Thông báo NTLM. Vì vậy, tôi không chắc chắn tôi hiểu câu trả lời.
Lindsay Morsillo

1
Bây giờ tôi có nên thêm HTTP / 1.1 không? Bởi vì tôi nghĩ HTTP / 2 có trạng thái.
Jose Nobile

4
HTTP / 2 là trạng thái. HTTP 1 không trạng thái. Các bổ sung sau này dành cho HTTP 1, như cookie, thêm trạng thái. Những bổ sung đó không nằm ngoài đặc tả HTTP "lõi". Đây là lý do tại sao HTTP 1 được cho là một giao thức phi trạng thái mặc dù trong thực tế thì không. Mặt khác, HTTP / 2 được thiết kế với các thành phần trạng thái được nướng. Không yêu cầu bổ sung để đáp ứng yêu cầu được dán nhãn "trạng thái".
Zamicol

Câu trả lời:


130

Mặc dù nhiều yêu cầu có thể được gửi qua cùng một kết nối HTTP, máy chủ không đính kèm bất kỳ ý nghĩa đặc biệt nào khi chúng đến trên cùng một ổ cắm. Đó chỉ là một thứ hiệu suất, nhằm giảm thiểu thời gian / băng thông mà nếu không được sử dụng để thiết lập lại kết nối cho mỗi yêu cầu.

Theo như HTTP có liên quan, tất cả chúng vẫn là các yêu cầu riêng biệt và phải chứa đủ thông tin riêng để thực hiện yêu cầu. Đó là bản chất của "trạng thái không quốc tịch". Các yêu cầu sẽ không được liên kết với nhau mà vắng mặt một số thông tin được chia sẻ mà máy chủ biết, trong hầu hết các trường hợp là ID phiên trong cookie.


1
Điều gì xảy ra khi máy chủ ghi nhớ một phiên (phía máy chủ) và tùy chỉnh trải nghiệm người dùng theo nó?
NurShomik

3
@NurShomik: Xem stackoverflow.com/a35321393/319403 để biết giải thích về cách các phiên thường hoạt động.
cHao

12
@Andrew: HTTP không được "xây dựng trên" TCP và trạng thái của TCP không phải là HTTP. Hai giao thức hoàn toàn riêng biệt ở các lớp khác nhau trong ngăn xếp. Bạn có thể phục vụ HTTP qua các đường dẫn được đặt tên nếu bạn muốn hoặc thậm chí bằng cách gửi các tệp xung quanh, nếu bạn có đủ masochists để đồng ý thực hiện và nó sẽ hoạt động chính xác vì HTTP là giao thức không theo giao thức. Ở cấp độ đó, tất cả chỉ là yêu cầu và phản hồi. Điều đó làm cho bản thân HTTP không trạng thái, bất kể trạng thái nào có thể được sử dụng / duy trì / yêu cầu bởi các giao thức cấp thấp hơn hoặc cao hơn.
cHao

@cHao Được rồi, tôi sẽ thừa nhận. Nếu chúng tôi xác định trạng thái không trạng thái là "không nhất thiết phải có trạng thái để hoạt động" (xem câu trả lời của dimo414 bên dưới các tùy chọn liệt kê cho trạng thái trong HTTP được trích dẫn từ Wikipedia) và nếu chúng tôi xem từng giao thức một cách nghiêm ngặt và không dựa trên các lớp bên dưới nó , vâng, tôi có thể đồng ý rằng HTTP là "không trạng thái".
Andrew

101

Từ Wikipedia :

HTTP là một giao thức phi trạng thái. Giao thức không trạng thái không yêu cầu máy chủ lưu giữ thông tin hoặc trạng thái về mỗi người dùng trong suốt thời gian của nhiều yêu cầu.

Nhưng một số ứng dụng web có thể phải theo dõi tiến trình của người dùng từ trang này sang trang khác, ví dụ khi máy chủ web được yêu cầu để tùy chỉnh nội dung của trang web cho người dùng. Giải pháp cho những trường hợp này bao gồm:

  • việc sử dụng cookie HTTP.
  • phiên phía máy chủ,
  • các biến ẩn (khi trang hiện tại chứa một biểu mẫu) và
  • Viết lại URL bằng các tham số được mã hóa URI, ví dụ: /index.php?session_id=some_unique_session_code.

Điều làm cho giao thức không trạng thái là máy chủ không bắt buộc phải theo dõi trạng thái qua nhiều yêu cầu, không phải là nó không thể làm như vậy nếu muốn. Điều này giúp đơn giản hóa hợp đồng giữa máy khách và máy chủ và trong nhiều trường hợp (ví dụ: phục vụ dữ liệu tĩnh qua CDN) sẽ giảm thiểu lượng dữ liệu cần truyền. Nếu các máy chủ được yêu cầu duy trì trạng thái truy cập của khách hàng, cấu trúc phát hành và đáp ứng yêu cầu sẽ phức tạp hơn. Vì nó là, sự đơn giản của mô hình là một trong những tính năng tuyệt vời nhất của nó.


21

Bởi vì một giao thức không trạng thái không yêu cầu máy chủ lưu giữ thông tin phiên hoặc trạng thái về từng đối tác truyền thông trong suốt thời gian của nhiều yêu cầu.

HTTP là một giao thức không trạng thái, có nghĩa là kết nối giữa trình duyệt và máy chủ bị mất sau khi giao dịch kết thúc.


2
Nhưng, HTTP có thể lưu thông tin trong máy chủ, sử dụng cookie. HTTP wih keep-live không kết nối chặt chẽ trên mỗi yêu cầu.
Jose Nobile


18
Lưu thông tin trên máy chủ không có nghĩa là kết nối vẫn hoạt động liên tục.
srijan

1
@srijan Vâng, không. Vì thế? Không ai được yêu cầu khác.
Mark Amery

10

HTTP được gọi là stateless protocolvì mỗi yêu cầu được thực thi độc lập, không có bất kỳ kiến ​​thức nào về các yêu cầu được thực hiện trước nó, có nghĩa là một khi giao dịch kết thúc kết nối giữa trình duyệt và máy chủ cũng bị mất.

Điều tạo nên giao thức statelesslà trong thiết kế ban đầu của nó, HTTP tương đối đơn giản file transfer protocol:

  1. yêu cầu một tệp có tên URL
  2. nhận được các tập tin trong phản ứng,
  3. ngắt kết nối

Không có mối quan hệ nào được duy trì giữa kết nối này và kết nối khác, ngay cả từ cùng một khách hàng. Điều này giúp đơn giản hóa hợp đồng giữa máy khách và máy chủ và trong nhiều trường hợp sẽ giảm thiểu lượng dữ liệu cần truyền.


3

Nếu giao thức HTTP được cung cấp dưới dạng giao thức toàn trạng thái, cửa sổ trình duyệt sử dụng kết nối duy nhất để liên lạc với máy chủ web cho nhiều yêu cầu được cung cấp cho ứng dụng web. Điều này tạo cơ hội cho cửa sổ trình duyệt tham gia kết nối giữa cửa sổ trình duyệt và máy chủ web trong thời gian dài và để giữ chúng ở trạng thái không hoạt động trong thời gian dài. Điều này có thể tạo ra tình huống tiếp cận tối đa các kết nối của máy chủ web mặc dù hầu hết các kết nối trong máy khách đều không hoạt động.


1
HTTP đã được duy trì, điều này có nghĩa là máy chủ không đóng kết nối và máy khách có thể thực hiện nhiều yêu cầu trên cùng một kết nối.
Jose Nobile

3

HTTP là một kết nối không có kết nối và đây là kết quả trực tiếp rằng HTTP là một giao thức không trạng thái. Máy chủ và máy khách chỉ biết nhau trong một yêu cầu hiện tại. Sau đó, cả hai quên mất nhau. Do tính chất này của giao thức, cả máy khách và trình duyệt đều không thể lưu giữ thông tin giữa các yêu cầu khác nhau trên các trang web.


1

Không quốc tịch là gì ??

Khi yêu cầu được thực hiện và phản hồi được trả lại cho máy khách, kết nối sẽ bị hủy hoặc chấm dứt. Máy chủ sẽ quên tất cả về người yêu cầu.

Tại sao không quốc tịch ??

Các trang web chọn để đi cho giao thức phi trạng thái. Đó là một sự lựa chọn thiên tài bởi vì mục tiêu ban đầu của web là cho phép các tài liệu (trang web) được phục vụ với số lượng cực lớn. của những người sử dụng phần cứng rất cơ bản cho máy chủ.

Duy trì kết nối lâu dài sẽ cực kỳ tốn tài nguyên.

Nếu web được chọn giao thức trạng thái thì tải trên máy chủ sẽ được tăng lên để duy trì kết nối của khách truy cập.


1

HTTPlà không quốc tịch TCPlà trạng thái. Không có cái gọi là HTTP connection, nhưng chỉ HTTP requestHTTP response. Chúng tôi không cần bất cứ điều gì để duy trì để làm cho người khác HTTP request. Một tiêu đề kết nối "duy trì sự sống" có nghĩa là TCPsẽ được sử dụng lại bởi các HTTPyêu cầu và phản hồi tiếp theo , thay vì ngắt kết nối và thiết lập lại TCPkết nối mọi lúc.


0

Tôi nghĩ ai đó đã chọn cái tên rất đáng tiếc cho khái niệm TÌNH TRẠNG và đó là lý do tại sao toàn bộ sự hiểu lầm được gây ra. Đây không phải là về việc lưu trữ bất kỳ loại tài nguyên nào, mà là về mối quan hệ giữa máy khách và máy chủ.

Khách hàng: Tôi đang giữ tất cả các tài nguyên về phía tôi và gửi cho bạn "danh sách" tất cả các mục quan trọng cần xử lý. Làm việc của bạn đi.

Máy chủ: Được rồi .. hãy để tôi chịu trách nhiệm lọc những gì quan trọng để cung cấp cho bạn phản hồi thích hợp.

Điều đó có nghĩa là máy chủ là "nô lệ" của máy khách và phải quên đi "chủ nhân" của mình sau mỗi yêu cầu. Trên thực tế, STATELESS chỉ đề cập đến trạng thái của máy chủ.

https://www.ics.uci.edu/~fielding/pub/dissertation/rest_arch_style.htmlm#sec_5_1_3

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.