Bagaimana cara HTTP menjadi tanpa kewarganegaraan?

26

HTTP dikatakan tanpa kewarganegaraan. Artinya, tidak perlu menyimpan informasi untuk transmisi data.

Tetapi HTTP menggunakan TCP, yang berorientasi negara.

Jika demikian, bagaimana HTTP menjadi tanpa kewarganegaraan?

Semut
sumber
6
Bagaimana ini bukan duplikat 5 tahun setelah Super User diluncurkan?
Peter Mortensen
Karena sebagian besar dupes berada di StackOverflow? Saya hanya menebak-nebak.
trysis
8
Hanya karena dijalankan melalui kabel (antara lain), tidak menjadikannya protokol listrik juga
Hagen von Eitzen

Jawaban:

42

HTTP tidak peduli tentang — dan tidak tergantung pada — protokol tingkat bawah mana pun yang digunakan untuk mentransportasinya sendiri, meskipun ia sendiri tidak memiliki kewarganegaraan.

Teknologi transportasi dapat berupa TCP, atau SPX lama Novell, atau SCTP, atau apa pun yang Anda impikan, dan HTTP masih akan berfungsi sama. HTTP memang membutuhkan streaming atau protokol yang berorientasi koneksi — dan tergantung pada URL yang bisa diatasi — tetapi tidak peduli bagaimana hal itu dilakukan.

Ini adalah salah satu alasan mengapa model layered atau network stack ada: Lapisan aplikasi tidak perlu memperhatikan lapisan yang lebih rendah.

Hanya karena protokol tingkat rendah stateful tidak berarti apa pun di atasnya secara otomatis menjadi stateful atau diharuskan stateful.

HTTP itu sendiri adalah stateless. Jadi itu berarti aplikasi harus mengimplementasikan layer lain di atas HTTP untuk menetapkan status. Ini biasanya dilakukan dengan cookie sesi.

LawrenceC
sumber
1
Routing terjadi pada level tcp / ip.
Fiasco Labs
3
Gambar ini menjelaskannya dengan baik. vichargrave.com/wp-content/uploads/2013/01/…
JakeGould
2
Secara kebetulan, fakta bahwa HTTP mengabaikan status koneksi mendasar (yang hampir selalu berupa TCP) adalah salah satu kekurangan kinerja utama yang coba diatasi oleh berbagai pendekatan HTTP2 .
skolima
2
@ Kegagalan: Tegasnya, perutean terjadi pada tingkat IP. Routing didasarkan pada Alamat Internet, tidak ada informasi dari lapisan TCP yang digunakan dalam routing dasar.
RedGrittyBrick
1
@skolima: di sisi lain, kewarganegaraan adalah alasan mengapa HTTP adalah protokol yang paling dapat diukur dan dapat diandalkan dalam penggunaan luas. HTTP selalu secara eksplisit dirancang untuk skalabilitas daripada kinerja (ya, itu hal yang berbeda), jadi jika Anda berpikir Anda membutuhkan latensi rendah yang sulit daripada Anda menggunakan protokol yang salah atau Anda menggunakan protokol secara salah. Sementara HTTP2 bermaksud untuk meningkatkan kinerja, ia melakukannya dengan cara yang tetap sesuai dengan kewarganegaraan. Ketika digunakan untuk apa yang dimaksudkan untuk itu, saya belum pernah melihat kewarganegaraan menjadi hambatan dari aplikasi HTTP yang dirancang dengan baik.
Lie Ryan
10

"HTTP tidak memiliki kewarganegaraan" berarti bahwa setiap transaksi HTTP (pasangan permintaan-respons) dapat diproses secara independen dari negara mana pun dari pasangan permintaan-respons sebelumnya.

Untuk mengangkut pasangan permintaan-respons tertentu, Anda memerlukan protokol yang dapat membawa blok besar secara sewenang-wenang di sana dan blok besar secara sewenang-wenang, dan untuk melakukannya di atas lapisan dengan ukuran paket terbatas, TCP harus stateful.

Tetapi melintasi batas transaksi, tidak ada negara. Klien dapat menjatuhkan koneksi dan membuat yang baru untuk permintaan berikutnya. Bahkan itu adalah satu-satunya pilihan di versi awal dan masih berfungsi seperti itu jika klien tidak menyertakan Connection: keep-aliveheader.

Permintaan selanjutnya juga dapat dengan mudah ditangani oleh server yang berbeda dan klien tidak akan pernah tahu, karena server tidak perlu mempertahankan status apa pun (kecuali jika aplikasi menambahkan statusnya sendiri di atas HTTP, biasanya dalam bentuk sesi; konsekuensinya komplikasi dalam load-balancing adalah hukumannya untuk membangun protokol stateful pada HTTP). Itu dimanfaatkan dalam server sibuk load-balancing.

Jan Hudec
sumber
can also easily be handled by different server and the client will never knowMeskipun secara teknis benar, ini menyesatkan karena banyak aplikasi web menggunakan sesi sticky, membutuhkan penyeimbang beban untuk merutekan permintaan di masa mendatang dari sesi penjelajahan yang sama ke server yang sama. Dari perspektif HTTP, sesi tidak relevan, tetapi kalimat terakhir Anda menyiratkan bahwa pengalaman pengguna akhir tidak akan terpengaruh, yang akan salah dengan sesi lengket.
Brandon
1
@Brandon: Aplikasi semacam itu membangun protokol stateful di atas HTTP dan ini adalah hukuman mereka untuk itu!
Jan Hudec
@Brandon: Banyak server yang memuat beban, seperti gmail, jangan mengirim permintaan kembali ke server yang sama. Sebagai gantinya sesi disimpan dalam database bersama yang dapat diakses oleh semua server di kluster. Karena itu negara tidak ditangani oleh server tetapi oleh database.
slebetman
@slebetman: Ya, terserahlah. HTTP itu sendiri tidak memiliki keadaan seperti itu, jadi untuk HTTP itu sederhana. Jika aplikasi menambahkan beberapa keadaan itu sendiri, ini pertarungannya.
Jan Hudec
Benar, saya tidak mengatakan semuanya. Saya mengatakan beberapa. Saya pribadi lebih suka menghindari sesi yang lengket, dan jika mungkin, hindari sesi sama sekali. Namun demikian, ada perangkat lunak yang tidak memenuhi harapan semua orang.
Brandon
2

Sifat "stateless" dari HTTP berarti bahwa pada lapisan ini , tidak ada informasi status yang dibuat atau digunakan.

Anda dapat melihat ini dalam beberapa contoh, misalnya dalam otentikasi HTTP, kredensial dikirim dengan setiap permintaan, dan koneksi persisten benar-benar hanya sebuah optimasi (yaitu jika saya mengirim kredensial, server lupa ini setelah permintaan, bahkan jika ia meninggalkan koneksi terbuka).

Sebaliknya, mekanisme login berbasis cookie adalah stateful, tetapi bukan bagian dari HTTP.

Simon Richter
sumber
1

Anda harus memahaminya sebagai satu set boneka Rusia (atau kotak jika Anda mau) masing-masing membawa yang lain di dalam, itu adalah cara kerjanya: TCP membawa HTTP "di dalam" tetapi tidak peduli tentang itu atau fitur-fiturnya.

Untuk mendapatkan seluruh gambar, saya sarankan membaca tentang Model OSI karena membuatnya lebih jelas.

TCP duduk beberapa lapisan di bawah HTTP dalam model OSI, setiap lapisan sebenarnya sesuai dengan protokol yang berbeda.

Dalam kasus kami HTTP duduk di lapisan presentasi dan aplikasi dan TCP di lapisan transportasi. Atau jika Anda menggunakan Model TCP / IP baik TCP dan protokol IP duduk di lapisan Network Link dan HTTP di lapisan aplikasi dan presentasi.

runlevel0
sumber
1
Masalah dengan model OSI adalah bahwa itu sekarang teoritis (ada upaya nyata untuk mengimplementasikannya, tetapi mereka gagal di pasar karena kompleksitasnya). Pada kenyataannya, tidak ada lapisan antara TCP dan HTTP. Selain itu, lapisan presentasi adalah HTML, bukan HTTP.
MSalters
Dalam model TCP / IP, TCP tidak hidup di lapisan jaringan. Ia tinggal di lapisan transport di atas IP, yang ada di jaringan nanti. Hit google pertama untuk "model TCP" menunjukkan ini: technet.microsoft.com/en-us/library/cc786900(v=ws.10).aspx
Brandon
@MSalters: Apakah TLS bukan layer?
grawity
1
@ MSalters: Anda menyadari bahwa HTTPS hanyalah nama yang diberikan oleh HTTP yang disalurkan oleh TLS? Karena TLS adalah lapisan di bawah HTTP dan di atas TCP dan TLS / SSL + HTTP combo disebut HTTPS.
slebetman
1
Juga, ada nama baru lain untuk kombo TLS / HTTP. Jika TLS yang membawa traffic HTTP mengimplementasikan virtual socket / stream multiplexing itu disebut SPDY (tetapi url di browser Anda masih HTTPS).
slebetman