HTTP (singkatan bagi Hypertext Transfer Protocol, bahasa Melayu: Protokol Pemindahan Hiperteks) ialah suatu protokol perisian yang digunakan untuk memindahkan maklumat melalui Jaringan Sejagat dan intranet. HTTP dibangunkan secara bersama oleh Konsortium Jaringan Sejagat (W3C) dan Pasukan Petugas Kejuruteraan Internet (IETF). Versi terkini bagi HTTP ialah HTTP/1.1.
Sesi HTTP ialah sejujukan urus niaga permintaan-sambutan rangkaian. Sebuah klien HTTP memulakan permintaan, dan membuat sambungan Protokol Kawalan Penghantaran (TCP) kepada sesebuah port tertentu pada sesebuah hos (biasanya port 80; lihat Senarai nombor port TCP dan UDP). Sebuah pelayan HTTP yang mendengari port itu menunggu mesej permintaan klien. Setelah menerima permintaan itu, pelayan itu menghantar balik baris status seperti "HTTP/1.1 200 OK", serta mesej tersendiri yang berisi sumber yang diminta, mesej ralat, atau macam-macam lagi maklumat.
Mesej permintaan terdiri daripada yang berikut:
Baris permintaan dan pengepala mesti berakhir dengan <CR><LF> (iaitu kembali pembawa diikuti suap baris). Baris kosong hanya terdiri daripada <CR><LF> tanpa apa-apa ruang putih. Dalam protokol HTTP/1.1, semua pengepala kecuali Host tidak diwajibkan.
Baris permintaan yang mengandungi nama laluan sahaja diterima oleh pelayan untuk memastikan keserasian dengan klien HTTP sebelum spesifikasi HTTP/1.0 dalam RFC1945[1].
HTTP mentakrifkan lapan cara (atau "verb") yang menandakan tindakan yang hendak dilakukan pada sumber yang dikenal pasti. Apa yang diwakili oleh sumber ini, sama ada data yang sudah sedia ada atau data yang dijana secara dinamik, tertakluk pada pelaksanaan pelayan. Selalunya, sumber berhubung dengan fail atau output boleh laku yang terletak dalam pelayan.
Pelayan HTTP diperlukan untuk melaksanakan sekurang-kurangnya kaedah GET dan HEAD,[3] dan juga kaedah OPTIONS jika boleh.
Sesetengah kaedah (misalnya, HEAD, GET, OPTIONS dan TRACE) ditakrifkan sebagai selamat, iaitu bertujuan untuk penerimaan maklumat sahaja tanpa mengubah keadaan pelayan. Dalam erti kata lain, kaedah-kaedah tesebut tidak patut menimbulkan kesan sampingan yang boleh memudarat seperti mengelog, bercache, melayan iklan sepanduk atau menokok penghitung kenaan. Oleh itu, permintaan GET sewenang-wenang tanpa mempertimbangkan konteks keadaan aplikasi dianggap selamat.
Berbeza pula dengan kaedah-kaedah seperti POST, PUT dan DELETE yang dimaksudkan untuk tindakan yang boleh menyebabkan kesan sampingan dalam pelayan atau luaran seperti urus niaga kewangan atau penghantaran e-mel. Maka itu, kaedah-kaedah sedemikian biasanya tidak digunakan oleh robot web atau perangkak web yang patuh, yang cenderung melakukan permintaan tanpa mempertimbangkan konteks atau akibatnya.
Walaupun permintaan GET ditentukan sebagai selamat, sebenarnya cara pelayan menanganinya adalah tidak terbatas. Oleh itu, sebarang kelalaian dalam pengaturcaraan boleh mudah menyebabkan perubahan yang ketara dalam pelayan. Ini tidak digalakkan kerana akan menimbulkan masalah dalam cache web, enjin carian dan agen-agen berautomat yang lain, yang boleh menyebabkan perubahan yang tidak diingini dalam pelayan.
Kaedah-kaedah PUT dan DELETE ditakrifkan sebagai idempoten, iaitu sebanyak mana permintaan yang seiras haruslah sama kesannya seperti permintaan tunggal. Kaedah-kaedah GET, HEAD, OPTIONS dan TRACE yang selamat pula sepatutnya idempoten juga, kerana HTTP ialah protokol tanpa keadaan.
Kaedah POST berbeza pula iaitu tidak semestinya idempoten, oleh itu penghantaran permintaan POST yang serupa berbanyak kali boleh menjejaskan keadaan atau menimbulkan kesan sampingan (seperti urus niaga kewangan). Sesekali, ini boleh diterima, tetapi begitu juga timbul dari ketaksengajaan, seperti pengguna tidak menyedari tindakannya akan menyebabkan lain pula permintaan yang dihantar, atau tidak menerima maklum balas yang mencukupi bahawa pemintaan pertama mereka berjaya. Wakaupun pelayar web boleh memaparkan kotak dialog amaran untuk mengingatkan pengguna apabila menyegar semula halaman boleh menghantar semula permintaan POST, namun pada kebiasaannya adalah terpulang kepada aplikasi web untuk memastikan permintaan POST tidak wajar dihantar semula lebih daripada sekali.
Perhatian: sama ada kaedah itu idempoten tidak dikuatkuasa oleh protokol atau pelayan web. Sememangnya kita boleh menggubah sebuah aplikasi web yang mana (contohnya) sisipan pangkalan data atau mana-mana tindakan bukan idempoten dipicukan oleh permintaan GET atau lain-lain. Bagaimanapun, jika cadangan ini tidak diendahkan, maka mungkin timbulnya kesan-kesan yang tidak diingini seandainya agen pengguna menganggap bahawa mengulangi permintaan yang sama adalah selamat padahal sebenarnya adalah sebaliknya.
Dalam HTTP/1.0 dan selanjutnya, baris pertama sambutan HTTP dipanggil baris status yang merangkumi kod status berangka (seperti "404") dan ungkapan sebab (seperti "Tidak Dijumpai"). Cara agen pengguna menangani sambutan berkenaan banyak bergantung kepada kod dan juga pengepala sambutan. Kod status tersuai boleh digunakan kerana, seandainya menemui kod yang tidak dikenalinya, agen pengguna boleh menggunakan angka pertama kod berkenaan untuk menentukan dari golongan mana sambutan itu.[4]
Selain itu, ungkapan sebab yang mengikut piawaian adalah sekadar cadangan dan boleh diganti oleh ungkapan lain yang sama ertinya atas budi bicara pihak pembangun web. Jika kod status menandakan masalah, agen pengguna boleh memaparkan ungkapan sebab kepada penguna untuk menyalurkan maklumat lanjut mengenai sifat masalah ini. Piawaian juga membolehkan agen pengguna untuk cuba mentafsirkan ungkapan sebab, namun ini tidak digalakakn kerana piawaian terang-terangan menetapkan bahawa kod status boleh dibaca oleh mesin manakala ungkapan sebab pula adalah untuk bacaan manusia.
Dalam HTTP/0.9 dan 1.0, sambungan ditutup selepas sepasang permintaan/sambutan tunggal disalurkan. Dalam HTTP/1.1 pula, diperkenalkan mekanisme pengekal yang membolehkan sambungan diguna semula untuk lebih daripada satu permintaan.
Sambungan berterusan sebegini jelas mengurangkan kependaman (lag), kerana klien tidak perlu merundingkan semula sambungan TCP selepas dihantarnya permintaan pertama.
HTTP/1.1 telah menambah baik pengoptimuman lebar jalur pada HTTP/1.0. Contohnya, HTTP/1.1 memperkenalkan pengekodan pindah berketul (chunked transfer encoding) untuk membolehkan kandungan distrimkan melalui sambungan beterusan tanpa perlu ditimbal. Penalian paip HTTP mengurangkan lagi lat masa, membolehkan klien menghantar sebanyak mana permintaan sebelum sambutan terdahulu diterima pada permintaan pertama. Selain itu, terdapat juga layanan bait (byte serving), iaitu apabila pelayan cuma menghantar sebahagian sumber yang terang-terangan diminta oleh klien.
HTTP ialah protokol tanpa keadaan. Kelebihan protokol tanpa keadaan adalah hos tidak perlu mengekalkan maklumat mengenai pengguna antara permintaan, tetapi ini memaksa pembangun web menggunakan kaedah-kaedah lain untuk mengekalkan keadaan pengguna. Contohnya, apabila hos perlu menyesuaikan kandungan laman web untuk pengguna, aplikasi web mesti digubah untuk memantau kegiatan pengguna dari halaman ke halaman. Salah satu cara penyelesaian masalah ini melibatkan penghantaran dan penerimaan kuki. Kaedah-kaedah lain termasuk sesi pihak pelayan, pemboleh ubah terlindung (apabila melayari halaman berbentuk borang), dan parameter terkod URL (seperti /index.php?session_id=some_unique_session_code
).
Kini, terdapat dua cara memastikan keselamatan sambungan HTTP, iaitu skim HTTPS URI dan pengepala Upgrade HTTP 1.1 yang diperkenalkan oleh RFC 2817. Bagaimanapun, hampir-hampir tiadanya sokongan pelayar bagi pengepala Upgrade, oleh itu skim HTTPS URI masih lagi kaedah paling dikenali untuk membuat sambungan HTTP yang selamat. HTTP selamat ditatatanda dengan awalan HTTPS:// dan bukan HTTP://.
HTTPS: ialah skim URI serupa dari segi sintaks dengan skim http: yang digunakan untuk sambungan HTTP biasa, tetapi mengisyaratkan pelayan untuk menggunakan lapisan penyulitan SSL/TLS tambahan untuk melindungi trafik. SSL sesuai khususnya untuk HTTP kerana boleh memberikan perlindungan sekalipun sebelah pihak dalam perhubungan adalah disahkan. Demikianlah rupanya bagi urus niaga HTTP melalui Internet, di mana biasanya hanya pelayan disahkan (oleh klien yang memeriksa sijil pelayan).
HTTP 1.1 memperkenalkan sokongan untuk pengepala Upgrade. Dalam pertukarannya, klien bermula dengan membuat permintaan "bersihkan teks", yang kemudiannya ditingkatkan menjadi TLS. Sama ada klien atau pelayan boleh meminta agar sambungan ditingkatkan. Kegunaan utamanya ialah permintaan bersihkan teks oleh klien, diikuti permintaan oleh pelayan agar meningkatkan sambungan, yang berupa begini:
Klien:
GET /encrypted-area HTTP/1.1 Host: www.example.com
Pelayan:
HTTP/1.1 426 Upgrade Required Upgrade: TLS/1.0, HTTP/1.1 Connection: Upgrade
Pelayan mengembalikan kod status 426 kerana kod-kod 400 menandakan kegagalan klien (lihat Senarai kod status HTTP) yang memaklumkan klien-klien legasi bahawa kegagalan tersebut adalah berkenaan dengan klien.
Manfaat penggunaan kaedah ini untuk membuat sambungan yang selamat adalah bahawa ia:
Namun begitu, kaedah ini ada kelemahannya, iaitu keperluan HTTP yang selamat tidak boleh ditentukan dalam URL. Secara praktis, pelayan (yang tidak dipercayai) akan dipertanggungjawabkan kerana membolehkan HTTP selamat, bukannya klien (yang dipercayai).
Berikut ialah contoh pertanyaan dan jawapan yang berlaku dalam HTTP. Pelanggan HTTP seperti pelayar web membuat pertanyaan berikut:
GET /index.html HTTP/1.1 Host: www.example.com
Pelayan HTTP yang menerima pertanyaan tersebut menjawab pula dengan teks permulaan berikut:
HTTP/1.1 200 OK Date: Mon, 23 May 2005 22:38:34 GMT Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT Etag: "3f80f-1b6-3e1cb03b" Accept-Ranges: bytes Content-Length: 438 Connection: close Content-Type: text/html; charset=UTF-8
Jaringan Sejagat | |
---|---|
Suapan | |
Piawaian W3C | |
Domain | Nama domain • Sistem Nama Domain (DNS) • Domain peringkat tinggi (TLD) • Domain peringkat tinggi kod negara (ccTLD) • Domain peringkat tinggi generik (gTLD) • Domain peringkat tinggi tajaan (sTLD) • Domain peringkat tinggi bukan tajaan (uTLD) |
Wikimedia Commons mempunyai media berkaitan Protokol Pemindahan Hiperteks |