Mengapa dikatakan bahwa "HTTP adalah protokol stateless"?

170

HTTP memiliki Cookie HTTP. Cookie memungkinkan server untuk melacak status pengguna, jumlah koneksi, koneksi terakhir, dll.

HTTP memiliki koneksi persisten (Keep-Alive) di mana beberapa permintaan dapat dikirim dari Koneksi TCP yang sama.

Jose Nobile
sumber
3
Area lain di mana saya tidak melihat "stateless-ness" ada di Otorisasi - khususnya Proxy-Otorisasi. Tampaknya itu stateful selama negosiasi. Untuk Otentikasi NTLM, klien perlu mengingat tipe Proxy-Authentication dan server harus stateful karena ada urutan ke Jenis Pesan NTLM. Jadi saya tidak yakin saya mengerti jawabannya.
Lindsay Morsillo
1
Haruskah saya menambahkan HTTP / 1.1 sekarang? Karena saya pikir HTTP / 2 memiliki status.
Jose Nobile
4
HTTP / 2 stateful. HTTP 1 tidak memiliki kewarganegaraan. Kemudian, penambahan yang dimaksudkan untuk HTTP 1, seperti cookie, ditambahkan status. Penambahan itu tidak terlepas dari spesifikasi "inti" HTTP 1. Inilah sebabnya mengapa HTTP 1 dikatakan sebagai protokol stateless meskipun dalam praktiknya tidak. HTTP / 2 di sisi lain dirancang dengan komponen stateful dipanggang. Tidak ada tambahan yang diperlukan untuk memenuhi persyaratan diberi label "stateful".
Zamicol

Jawaban:

130

Meskipun beberapa permintaan dapat dikirim melalui koneksi HTTP yang sama, server tidak melampirkan arti khusus pada kedatangan mereka melalui soket yang sama. Itu semata-mata hal kinerja, dimaksudkan untuk meminimalkan waktu / bandwidth yang seharusnya dihabiskan membangun kembali koneksi untuk setiap permintaan.

Sejauh menyangkut HTTP, semuanya masih merupakan permintaan yang terpisah dan harus berisi informasi yang cukup untuk memenuhi permintaan tersebut. Itulah esensi dari "kewarganegaraan". Permintaan tidak akan dikaitkan dengan satu sama lain jika tidak ada beberapa informasi bersama yang diketahui server, yang dalam kebanyakan kasus adalah ID sesi dalam cookie.

cao
sumber
1
Apa yang terjadi ketika server mengingat sesi (sisi server) dan menyesuaikan pengalaman pengguna sesuai dengan itu?
NurShomik
3
@NurShomik: Lihat stackoverflow.com/a/3521393/319403 untuk penjelasan tentang bagaimana sesi biasanya bekerja.
cao
12
@Andrew: HTTP bukan "dibangun di atas" TCP, dan status TCP bukan HTTP. Keduanya adalah protokol yang sepenuhnya terpisah di berbagai lapisan dalam tumpukan. Anda dapat menayangkan HTTP di atas pipa bernama jika Anda mau, atau bahkan dengan mengirim file, jika Anda punya cukup masokis untuk setuju melakukannya, dan itu akan bekerja dengan tepat karena HTTP adalah transport-protocol-agnostic. Pada level itu, itu semua hanya permintaan dan tanggapan. Itu membuat HTTP itu sendiri tanpa kewarganegaraan, terlepas dari status apa yang dapat digunakan / dipertahankan / diperlukan oleh protokol tingkat rendah atau lebih tinggi.
cHao
@ cao Oke, saya akan mengakui. Jika kita mendefinisikan statelessness sebagai "tidak selalu perlu memiliki negara untuk beroperasi" (lihat jawaban dimo414 di bawah ini daftar pilihan untuk negara dalam HTTP dikutip dari Wikipedia), dan jika kita melihat setiap protokol ketat dengan sendirinya dan tidak didasarkan pada lapisan di bawahnya , maka ya, saya bisa setuju bahwa HTTP "stateless".
Andrew
101

Dari Wikipedia :

HTTP adalah protokol tanpa kewarganegaraan. Protokol tanpa kewarganegaraan tidak mengharuskan server untuk menyimpan informasi atau status tentang setiap pengguna selama beberapa kali permintaan.

Tetapi beberapa aplikasi web mungkin harus melacak kemajuan pengguna dari halaman ke halaman, misalnya ketika server web diperlukan untuk menyesuaikan konten halaman web untuk pengguna. Solusi untuk kasus ini meliputi:

  • penggunaan cookie HTTP.
  • sesi sisi server,
  • variabel tersembunyi (saat halaman saat ini berisi formulir), dan
  • Penulisan ulang URL menggunakan parameter yang dikodekan URI, misalnya, /index.php?session_id=some_unique_session_code.

Apa yang membuat protokol tanpa kewarganegaraan adalah bahwa server tidak diharuskan untuk melacak status lebih dari satu permintaan, bukan bahwa itu tidak dapat melakukannya jika diinginkan. Ini menyederhanakan kontrak antara klien dan server, dan dalam banyak kasus (misalnya melayani data statis melalui CDN) meminimalkan jumlah data yang perlu ditransfer. Jika server diminta untuk mempertahankan keadaan kunjungan klien, struktur penerbitan dan tanggapan permintaan akan lebih kompleks. Karena itu, kesederhanaan model adalah salah satu fitur terbesarnya.

dimo414
sumber
21

Karena protokol stateless tidak memerlukan server untuk menyimpan informasi sesi atau status tentang masing-masing mitra komunikasi selama beberapa permintaan.

HTTP adalah protokol stateless, yang berarti koneksi antara browser dan server terputus begitu transaksi berakhir.

Rahul Tripathi
sumber
2
Tetapi, HTTP dapat menyimpan informasi di server, menggunakan cookie. HTTP dengan tetap-hidup tidak menutup koneksi pada setiap permintaan.
Jose Nobile
3
Lihatlah artikel ini: - ecst.csuchico.edu/~amk/foo/advjava/notes/servlets/Cookies.html
Rahul Tripathi
18
Menyimpan informasi di server tidak berarti koneksi itu hidup terus-menerus.
srijan
1
@srijan Yah, tidak. Begitu? Tidak ada yang mengklaim sebaliknya.
Mark Amery
10

HTTP disebut sebagai stateless protocolkarena setiap permintaan dieksekusi secara independen, tanpa sepengetahuan tentang permintaan yang dieksekusi sebelumnya, yang berarti begitu transaksi mengakhiri koneksi antara browser dan server juga hilang.

Apa yang membuat protokol statelessadalah bahwa dalam desain aslinya, HTTP adalah yang relatif sederhana file transfer protocol:

  1. membuat permintaan untuk file yang dinamai dengan URL,
  2. dapatkan file sebagai tanggapan,
  3. memutuskan.

Tidak ada hubungan yang dipertahankan antara satu koneksi dan yang lain, bahkan dari klien yang sama. Ini menyederhanakan kontrak antara klien dan server, dan dalam banyak kasus meminimalkan jumlah data yang perlu ditransfer.

Mobeen Sarwar
sumber
3

Jika protokol HTTP diberikan sebagai protokol lengkap Negara, jendela browser menggunakan koneksi tunggal untuk berkomunikasi dengan server web untuk beberapa permintaan yang diberikan ke aplikasi web. Ini memberikan kesempatan ke jendela browser untuk menggunakan koneksi antara jendela browser dan server web untuk waktu yang lama dan untuk menjaga mereka dalam keadaan siaga untuk waktu yang lama. Ini dapat membuat situasi mencapai koneksi maksimum server web meskipun sebagian besar koneksi di klien idle.

Rajasekhar reddy
sumber
1
HTTP sudah tetap-hidup, ini berarti server tidak menutup koneksi, dan klien dapat membuat banyak permintaan pada koneksi yang sama.
Jose Nobile
3

HTTP adalah tanpa sambungan dan ini adalah hasil langsung bahwa HTTP adalah protokol tanpa negara. Server dan klien saling mengetahui hanya selama permintaan saat ini. Setelah itu, keduanya saling melupakan. Karena sifat protokol ini, baik klien maupun browser tidak dapat menyimpan informasi antara permintaan yang berbeda di seluruh halaman web.

pengguna3496740
sumber
1

Apa itu stateless ??

Setelah permintaan dibuat dan respons diberikan kembali ke klien, koneksi akan terputus atau dihentikan. Server akan melupakan semua tentang pemohon.

Kenapa stateless ??

Web memilih untuk menggunakan protokol stateless. Itu adalah pilihan jenius karena tujuan asli dari web adalah untuk memungkinkan dokumen (halaman web) dilayani dengan sangat besar. orang yang menggunakan perangkat keras yang sangat dasar untuk server.

Mempertahankan koneksi yang sudah berjalan lama akan menjadi sumber daya yang sangat intensif.

Jika web dipilih protokol stateful maka beban di server akan ditingkatkan untuk menjaga koneksi pengunjung.

chirag soni
sumber
1

HTTPtidak bernegara. TCPadalah negara. Tidak ada yang disebut HTTP connection, tetapi hanya HTTP requestdan HTTP response. Kita tidak perlu apa pun untuk dipertahankan untuk membuat yang lain HTTP request. Header koneksi yang "tetap-hidup" berarti TCPakan digunakan kembali oleh HTTPpermintaan dan respons berikutnya , alih-alih memutuskan dan membangun kembali TCPkoneksi setiap saat.

Xing
sumber
0

Saya pikir seseorang memilih nama yang sangat disayangkan untuk konsep NEGARA dan itulah sebabnya seluruh kesalahpahaman ini disebabkan. Ini bukan tentang menyimpan segala jenis sumber daya, tetapi tentang hubungan antara klien dan server.

Klien: Saya menyimpan semua sumber daya di pihak saya dan mengirimkan kepada Anda "daftar" semua item penting yang perlu diproses. Lakukan pekerjaanmu.

Server: Baiklah .. biarkan saya mengambil tanggung jawab untuk memfilter apa yang penting untuk memberi Anda respons yang tepat.

Yang berarti bahwa server adalah "budak" dari klien dan harus melupakan "tuannya" setelah setiap permintaan. Sebenarnya, STATELESS hanya merujuk pada status server.

https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_3

JacobTheKnitter
sumber