Saya tidak begitu mengerti jika saya memposting data formulir http dari browser ke server, apakah protokol masih perlu membuat jabat tangan tiga arah (syn-ack-data) atau hanya berfungsi untuk MENDAPATKAN permintaan http?
Saya tidak begitu mengerti jika saya memposting data formulir http dari browser ke server, apakah protokol masih perlu membuat jabat tangan tiga arah (syn-ack-data) atau hanya berfungsi untuk MENDAPATKAN permintaan http?
Jawaban:
HTTP GET dan HTTP POSTS menggunakan TCP. Jika Anda bertanya apakah POST juga memerlukan jabat tangan TCP 3-arah (syn-synack-ack), itu sama seperti koneksi TCP lainnya. Jabat tangan TCP diperlukan sebelum protokol aplikasi apa pun (seperti HTTP) mulai berfungsi.
FYI, jabat tangan tiga arah Anda salah; itu harus "syn-synack-ack"
MENAMBAHKAN:
Jika browser menggunakan QUIC (Koneksi Internet UDP Cepat, diucapkan cepat. Diusulkan oleh Google) protokol untuk HTTP dimungkinkan untuk menghindari jabat tangan TCP 3-arah. Tapi AFAIK didukung di Chrome dan Google.
Sebagian besar perangkat lunak lebih suka HTTP / 2 yang masih TCP tetapi dengan banyak fitur yang menggunakan koneksi persisten kemudian jabat tangan 3 arah dilakukan sekali untuk setiap server server.
Jika protokol ini digunakan, hanshake 3 arah dapat dihindari dengan permintaan apa pun, termasuk GET.
Jika Anda bertanya dalam pengertian umum, maka jawabannya pasti "ya", setiap metode HTTP (seperti POST) memerlukan koneksi TCP, dan satu-satunya cara untuk memulai koneksi TCP adalah dengan menggunakan jabat tangan tiga arah.
JIKA, bagaimanapun, Anda bertanya dalam kasus tertentu, mungkin jika Anda menangkap lalu lintas Anda sendiri dan tidak melihat jabat tangan 3 arah setelah Anda mengirimkan konten ke situs web, maka jawabannya sedikit kurang sederhana. Kita harus mendiskusikan beberapa konsep terkait HTTP sebelum kita dapat menjawabnya dengan benar ...
Dalam rilis asli HTTP1.0, setiap objek yang Anda minta dari halaman web membutuhkan koneksi TCP baru untuk dibentuk untuk setiap objek. Ambil situs web sederhana berikut ini yang mencakup beberapa teks, dan dua gambar:
<HTML>
<HEAD>
<TITLE>My Title</TITLE>
</HEAD>
<BODY>
Stack Exchange Rules!
<IMG SRC="a.gif">
<IMG SRC="b.gif">
</BODY>
</HTML>
Dalam HTTP1.0 tradisional, untuk memuat situs web ini ke browser Anda akan membutuhkan tiga koneksi TCP (masing-masing dengan jabat tangan 3-arah, dan penutupan 4-arah).
HTTP 1.0:
--> SYN
SYN ACK <--
--> ACK
--> GET /index.html
<index.html> <--
--> FIN
ACK <--
FIN <--
--> ACK
.
--> SYN
SYN ACK <--
--> ACK
--> GET /a.gif
<a.gif> <--
--> FIN
ACK <--
FIN <--
--> ACK
.
--> SYN
SYN ACK <--
--> ACK
--> GET /b.gif
<b.gif> <--
--> FIN
ACK <--
FIN <--
--> ACK
Perhatikan ada 27 paket di atas, hanya untuk mengunduh tiga item: Halaman HTML itu sendiri (index.html), gambar a.gif, dan gambar b.gif. (Sebenarnya akan ada lebih dari 27 paket, tetapi untuk menghemat ruang vertikal, saya hanya memasukkan ACK dalam jabat tangan 3 arah dan penutupan 4 arah, dan menghilangkan ACK dalam aliran data)
Untuk meningkatkan efisiensi HTTP, fitur yang disebut "Connection Keepalive" diperkenalkan, yang memungkinkan HTTP untuk menggunakan kembali koneksi TCP yang sama untuk meminta beberapa objek. Transfer di atas akan dikurangi menjadi sebagai berikut:
HTTP 1.1 dengan Koneksi Keepalive
--> SYN
SYN ACK <--
--> ACK
--> GET /index.html
<index.html> <--
--> GET /a.gif
<a.gif> <--
--> GET /b.gif
<b.gif> <--
--> FIN
ACK <--
FIN <--
--> ACK
Perhatikan bahwa hanya koneksi TCP tunggal yang digunakan untuk meminta ketiga objek. Kali ini, hanya butuh 13 paket, peningkatan besar dari 27 dari sebelumnya.
Perbaikan terakhir ke HTTP yang harus kita diskusikan adalah fitur yang disebut Pipelining. Fitur ini semakin meningkatkan efisiensi HTTP, dengan membuatnya sehingga Klien dapat meminta beberapa opsi sekaligus, tanpa menunggu untuk menerima objek yang diminta sebelumnya. Mari ku tunjukkan:
HTTP1.1 dengan Pipelining
--> SYN
SYN ACK <--
--> ACK
--> GET /index.html
--> GET /a.gif
--> GET /b.gif
<index.html> <--
<a.gif> <--
<b.gif> <--
--> FIN
ACK <--
FIN <--
--> ACK
Kami hanya menggunakan satu koneksi TCP, dan kami hanya menggunakan 9 paket. Namun, kami tidak harus menunggu Round Trip Time (RTT) yang diperlukan antara Klien dan Server di antara meminta dan menerima setiap objek. Jika Anda membutuhkan analogi, bayangkan Anda berada di sebuah Restoran, dan Anda membutuhkan Garam, Merica, dan Kecap. Apakah lebih efisien untuk meminta pelayan / pelayan Anda untuk ketiga item sekaligus, atau meminta mereka satu per satu dan menunggu mereka kembali sebelum membuat permintaan berikutnya?
(Pipelining tidak terkait langsung dengan pertanyaan Anda, tetapi sering dijelaskan bersama dengan Keepalives dan fitur efisiensi HTTP lainnya, jadi saya memutuskan untuk memasukkannya dalam jawaban ini untuk kelengkapan)
Sekarang kita akhirnya dapat kembali ke pertanyaan Anda:
Apakah handshake tiga arah TCP diperlukan untuk HTTP POST?
Jika Anda membuka koneksi ke server web dan mengunduh halaman web menggunakan metode GET, dan server web itu mendukung koneksi keepalive. Permintaan selanjutnya ke server web itu, termasuk metode POST, mungkin hanya menggunakan kembali koneksi TCP yang sudah ada. Oleh karena itu, POST tertentu itu tidak memerlukan jabat tangan 3-arah baru, karena data akan ditransfer dalam koneksi TCP yang sudah ada.
Koneksi Keepalive, bagaimanapun, tidak memiliki durasi yang tak terbatas. Jadi jika setelah mengunduh halaman web, Anda menunggu beberapa saat sebelum mengirim POST Anda, koneksi TCP yang asli mungkin sudah ditutup, dan dalam hal ini, browser Anda harus membuka koneksi TCP baru untuk POST data Anda, yang jelas akan memerlukan permulaan dengan jabat tangan 3 arah.
Karena banyak browser dan webservers menggunakan pengatur waktu yang berbeda untuk berapa lama mereka menginginkan fitur "koneksi keepalive" mereka untuk menjaga koneksi tetap hidup, saya tidak akan dapat memberi Anda nomor yang dapat diandalkan tentang berapa lama biasanya diminta.