2011-02-06 7 views
31

Tôi đang nghiên cứu java cho web và đề cập đến http là không trạng thái. Điều đó có nghĩa là gì và nó ảnh hưởng như thế nào đến việc lập trìnhĐiều đó có nghĩa là gì khi họ nói http là không quốc tịch

Tôi cũng đang nghiên cứu khung mùa xuân và ở đó nó đề cập đến một số loại đậu. Điều đó có nghĩa là gì?

+4

Hãy cho chúng tôi một số tài liệu tham khảo để đặt/giấy bạn đang học. Tôi không hiểu tại sao bạn lại kết hợp trạng thái của một giao thức mạng với trạng thái của một đối tượng trong một câu hỏi? Chúng ta có thể tìm thấy thông tin về hạt đậu mùa xuân mà bạn đã đề cập ở đâu? – Ritesh

Trả lời

56

HTTP - đó là giao thức vận chuyển thực tế giữa máy chủ và máy khách - là "quốc tịch" bởi vì nó không nhớ gì giữa lời gọi. MỌI tài nguyên được truy cập qua HTTP là một yêu cầu duy nhất không có kết nối luồng giữa chúng.Nếu bạn tải một trang web có tệp HTML nằm trong đó có ba thẻ <img> nhấn cùng một máy chủ, sẽ có bốn kết nối TCP được thương lượng và mở, bốn lần truyền dữ liệu, bốn kết nối đã đóng. Đơn giản là không một quốc gia lưu giữ tại máy chủ tại giao thức mức mà sẽ có máy chủ biết gì về bạn khi bạn đi vào.

(Vâng, đó là sự thật cho HTTP lên đến 1.0 ở mức nào. HTTP 1.1 sẽ bổ sung thêm các cơ chế kết nối liên tục của các loại khác nhau vì các vấn đề hiệu suất không thể tránh khỏi mà một giao thức thực sự không trạng thái sẽ sinh ra. không có quốc tịch.)

Để giúp bạn hiểu sự khác biệt, hãy tưởng tượng rằng một giao thức như Telnet hoặc SSH là không quốc tịch. Nếu bạn muốn có một danh sách thư mục của một tập tin từ xa, bạn sẽ phải, như là một hoạt động nguyên tử, kết nối, đăng nhập, thay đổi thư mục và đưa ra lệnh ls. Khi lệnh ls hiển thị xong nội dung thư mục, kết nối sẽ đóng lại. Nếu sau đó bạn muốn hiển thị nội dung của một tệp cụ thể, bạn sẽ phải kết nối lại, đăng nhập, thay đổi thư mục và hiện ra lệnh cat. Khi lệnh hiển thị tệp kết thúc, kết nối sẽ lại đóng lại.

Khi bạn nhìn vào nó theo cách đó, mặc dù ống kính của Telnet/SSH, nghe có vẻ khá ngu ngốc, phải không? Vâng, trong một số cách nó là và trong một số cách nó không phải là. Khi một giao thức là không trạng thái, máy chủ có thể thực hiện một số tối ưu hóa khá tốt và dữ liệu có thể được lan truyền dễ dàng. Các máy chủ sử dụng các giao thức không trạng thái có thể mở rộng rất hiệu quả, vì vậy trong khi việc truyền dữ liệu cá nhân thực tế có thể rất chậm (việc mở và đóng các kết nối TCP là KHÔNG rẻ!) Một hệ thống tổng thể có thể rất, rất hiệu quả và có thể mở rộng đến bất kỳ số lượng người dùng nào.

Nhưng ...

Hầu hết mọi thứ bạn muốn làm ngoài việc xem các trang web tĩnh sẽ liên quan đến phiên và trạng thái. Khi HTTP được sử dụng cho mục đích ban đầu của nó (chia sẻ thông tin tĩnh như các bài báo khoa học) giao thức không trạng thái làm cho rất nhiều ý nghĩa. Khi bạn bắt đầu sử dụng nó cho những thứ như các ứng dụng web, các cửa hàng trực tuyến, vv thì tình trạng không quốc tịch bắt đầu trở nên phiền toái bởi vì đây là những hoạt động vốn có của nhà nước. Kết quả là mọi người rất nhanh chóng tìm ra cách để thu thập trạng thái trên đỉnh của giao thức không quốc tịch. Các cơ chế này bao gồm những thứ như cookie, như trạng thái mã hóa trong URL và máy chủ tự động kích hoạt dữ liệu dựa trên những dữ liệu đó, như yêu cầu trạng thái ẩn, như ... tốt, giống như toàn bộ các thứ và bao gồm cả hiện đại hơn những thứ như Web Sockets.

Dưới đây là một số liên kết bạn có thể làm theo để có được một sự hiểu biết sâu sắc hơn về các khái niệm:

+0

cảm ơn những thứ hữu ích, nhưng giả sử nếu http2.1 trở thành stateful sau đó làm thế nào kịch bản hiện tại chnage đối với hiển thị trang web. tôi có nghĩa là tôi muốn xem các diff bây giờ và sau đó –

+0

1,1, không 2.1. ;) Và như tôi đã nói, HTTP 1.1 không thực sự đi nhà nước. Từ góc độ trình duyệt web, điều đó có nghĩa là các trang web của bạn tải nhanh hơn vì bạn chỉ phải thương lượng kết nối TCP một lần cho các tệp HTML + 3 hình ảnh đó (để sử dụng của tôi) ví dụ) thay vì 4 lần. –

+1

tại sao họ không thể làm cho nó có trạng thái. có vấn đề lập trình nào hay không thể thực hiện được –

4

HTTP được gọi là giao thức không trạng thái vì mỗi lệnh được thực thi độc lập, không có bất kỳ kiến ​​thức nào về các lệnh đến trước nó.

Lỗi này của HTTP đang được giải quyết trong một số công nghệ mới, bao gồm cookies.

+0

ActiveX, Java và Javascript không giải quyết thực tế rằng http là không trạng thái, chúng tận dụng cookie, ghi đè url, v.v. để duy trì trạng thái – Luis

10

HTTP là không trạng thái - điều này có nghĩa là khi sử dụng HTTP, điểm kết thúc không "ghi nhớ" mọi thứ (chẳng hạn như bạn là ai). Nó không có trạng thái. Điều này trái ngược với ứng dụng máy tính để bàn - nếu bạn có biểu mẫu và bạn chuyển sang một biểu mẫu khác, sau đó quay lại, trạng thái đã được giữ lại (miễn là bạn chưa tắt ứng dụng).

Thông thường, để duy trì trạng thái trong ứng dụng web, một ứng dụng sử dụng cookie.

+1

bạn có thể đưa ra ví dụ về giao thức nhớ trạng thái để tôi có thể so sánh –

+1

@Name - [TCP] (http://en.wikipedia.org/wiki/Transmission_Control_Protocol) là một giao thức duy trì một số trạng thái. – Oded

+1

mặc dù không có ý định sử dụng mạng gia đình XYZModem của giao thức (XModem, YModem, và con trai) là stateful – alvaroc

3

Khi người ta nói rằng có điều gì đó không quốc tịch, điều đó thường có nghĩa là bạn không thể cho rằng máy chủ theo dõi bất kỳ trạng thái nào giữa các lần tương tác.

Theo mặc định, giao thức HTTP giả định một máy chủ thực sự không trạng thái. Mọi yêu cầu đều được coi là yêu cầu độc lập.

Thực tế đây là fixed bởi một số máy chủ (hầu hết trong số họ) sử dụng cookie theo dõi trong yêu cầu để khớp với một số trạng thái trên máy chủ với một ứng dụng cụ thể. Điều này hoạt động vì cách thức hoạt động của cookie (chúng được đăng lên máy chủ trên mỗi yêu cầu tiếp theo sau khi chúng được đặt trên máy khách).

Về cơ bản, máy chủ không có quốc tịch là một trở ngại để mở rộng quy mô. Bạn cần đảm bảo rằng bạn định tuyến tất cả các yêu cầu từ một trình duyệt cụ thể đến cùng một cá thể hoặc để thực hiện sao chép phụ của các trạng thái. Điều này thường là một yếu tố hạn chế khi cố gắng mở rộng một ứng dụng.

Có một số giải pháp khác để theo dõi trạng thái (xem cookie trạng thái được mã hóa của đường ray) nhưng về cơ bản nếu bạn muốn phát triển, bạn cần tìm cách tránh trạng thái theo dõi trên máy chủ :).

5

Giao thức không trạng thái không yêu cầu máy chủ giữ lại thông tin hoặc trạng thái về từng người dùng trong thời gian nhiều yêu cầu. Ví dụ: khi máy chủ web bắt buộc phải tùy chỉnh nội dung của trang web cho người dùng, ứng dụng web có thể phải theo dõi tiến độ của người dùng từ trang này sang trang khác.

Một giải pháp phổ biến là sử dụng cookie HTTP. Các phương pháp khác bao gồm phiên phía máy chủ, biến ẩn (khi trang hiện tại là biểu mẫu) và viết lại URL bằng cách sử dụng thông số được mã hóa URI, ví dụ: /index.php?session_id=some_unique_session_code.

here