HTTP được cho là không trạng thái. Có nghĩa là, nó không cần lưu trữ thông tin để truyền dữ liệu.
Nhưng HTTP sử dụng TCP, được định hướng theo trạng thái.
Nếu đó là trường hợp, làm thế nào để HTTP trở nên không trạng thái?
HTTP được cho là không trạng thái. Có nghĩa là, nó không cần lưu trữ thông tin để truyền dữ liệu.
Nhưng HTTP sử dụng TCP, được định hướng theo trạng thái.
Nếu đó là trường hợp, làm thế nào để HTTP trở nên không trạng thái?
Câu trả lời:
HTTP không quan tâm đến tập tin và không phụ thuộc vào bất kỳ giao thức cấp thấp nào được sử dụng để tự vận chuyển, mặc dù bản thân nó không trạng thái.
Công nghệ vận chuyển có thể là TCP, hoặc SPX cũ của Novell hoặc SCTP hoặc bất cứ điều gì khác mà bạn có thể mơ ước và HTTP vẫn sẽ hoạt động như nhau. HTTP không yêu cầu giao thức truyền phát trực tiếp hoặc hướng kết nối, và phụ thuộc vào các URL có thể phân giải được nhưng không quan tâm đến việc đó được thực hiện như thế nào.
Đây là một trong những lý do tại sao mô hình lớp hoặc ngăn xếp mạng tồn tại: Lớp ứng dụng không cần phải quan tâm đến các lớp thấp hơn.
Chỉ vì một giao thức cấp thấp hơn là trạng thái không có nghĩa là bất cứ thứ gì trên đầu nó tự động trở thành trạng thái hoặc được yêu cầu phải có trạng thái.
Bản thân HTTP là không trạng thái. Vì vậy, điều đó có nghĩa là các ứng dụng phải triển khai một lớp khác trên HTTP để thiết lập trạng thái. Điều này thường được thực hiện với cookie phiên.
"HTTP là không trạng thái" có nghĩa là mỗi giao dịch HTTP (cặp phản hồi yêu cầu) có thể được xử lý độc lập với bất kỳ trạng thái nào từ cặp phản hồi yêu cầu trước đó.
Để vận chuyển cặp đáp ứng yêu cầu cụ thể, bạn cần một giao thức có thể mang khối lớn tùy ý ở đó và khối lớn tùy ý trở lại, và để thực hiện điều đó trên một lớp có kích thước gói hạn chế, TCP phải có trạng thái.
Nhưng qua ranh giới giao dịch, không có nhà nước. Máy khách có thể hủy kết nối và thiết lập kết nối mới cho yêu cầu tiếp theo. Trong thực tế, đó là tùy chọn duy nhất trong các phiên bản đầu và nó vẫn hoạt động như vậy nếu máy khách không bao gồm Connection: keep-alive
tiêu đề.
Yêu cầu tiếp theo cũng có thể dễ dàng được xử lý bởi các máy chủ khác nhau và khách hàng sẽ không bao giờ biết, bởi vì máy chủ không cần duy trì bất kỳ trạng thái nào (trừ khi ứng dụng thêm trạng thái riêng của mình lên trên HTTP, thường là dưới dạng phiên; trong cân bằng tải là hình phạt của nó đối với việc xây dựng giao thức trạng thái trên HTTP). Điều đó được tận dụng trong các máy chủ bận rộn cân bằng tải.
can also easily be handled by different server and the client will never know
Mặc dù về mặt kỹ thuật, điều này là sai lệch vì nhiều ứng dụng web sử dụng các phiên dính, yêu cầu bộ cân bằng tải để định tuyến các yêu cầu trong tương lai từ cùng một phiên duyệt đến cùng một máy chủ. Từ góc độ HTTP, các phiên không liên quan, nhưng loại câu cuối cùng của bạn ngụ ý rằng trải nghiệm của người dùng cuối sẽ không bị ảnh hưởng, điều này sẽ sai với các phiên dính.
Bản chất "không trạng thái" của HTTP có nghĩa là trên lớp này , không có thông tin trạng thái nào được tạo hoặc sử dụng.
Bạn có thể thấy điều này trong một vài trường hợp, ví dụ như trong xác thực HTTP, thông tin đăng nhập được gửi với mọi yêu cầu và các kết nối liên tục thực sự chỉ là một tối ưu hóa (tức là nếu tôi gửi thông tin đăng nhập, máy chủ sẽ quên những thông tin này sau khi yêu cầu, ngay cả khi nó rời đi kết nối mở).
Ngược lại, các cơ chế đăng nhập dựa trên cookie là trạng thái, nhưng không phải là một phần của HTTP.
Bạn phải hiểu nó như một bộ búp bê Nga (hoặc hộp nếu bạn muốn) mỗi con mang một cái khác bên trong, đó là cách thức hoạt động của nó: TCP mang HTTP "bên trong" nhưng nó không quan tâm đến nó hoặc đó là các tính năng.
Để có được toàn bộ hình ảnh, tôi khuyên bạn nên đọc về Mô hình OSI vì nó làm cho nó rõ ràng hơn.
TCP nằm một vài lớp bên dưới HTTP trong mô hình OSI, mỗi lớp thực tế tương ứng với một giao thức khác nhau.
Trong trường hợp của chúng tôi, HTTP nằm trong lớp trình bày và ứng dụng và TCP trong lớp vận chuyển. Hoặc nếu bạn sử dụng Mô hình TCP / IP, cả giao thức TCP và IP đều nằm trong lớp Liên kết mạng và HTTP trong các lớp trình bày và ứng dụng.