Apakah handshake tiga arah TCP diperlukan untuk HTTP POST?

10

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?

Елена Кокчева
sumber

Jawaban:

12

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.

mmv-ru
sumber
24

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.

Eddie
sumber
1
Ini jawaban yang lebih lengkap. Terima kasih banyak. Sangat layak untuk diunggulkan.
Manikandan Sigamani
1
Bagaimana dengan menggambarkan HTTP / 2: p?
animaacija
Sebenarnya, jabat tangan tiga arah bukan satu-satunya cara untuk membuka koneksi TCP. Untuk menyebutkan cara lain, ada koneksi simultan membuka dan membagi jabat tangan setidaknya.
juhist
1
Dunia akan menjadi tempat yang lebih baik jika semua jawaban akan dirinci seperti ini! Dilakukan dengan baik, dijelaskan dengan sangat baik.
dawez
Dengan router pengoptimal TCP atau proxy, browser dapat mulai mengirim data HTTP saat melihat koneksi TCP palsu dari agen lokal ketika server masih membangun koneksi dengan bagian terluar dari lingkungan klien. Dan mari kita berpikir sebentar jika pengoptimal TCP berjalan di tengah atau di lingkungan server!
belut ghEEz
0

Memang. Tapi bagaimanapun, masih ada cara untuk membuatnya lebih efisien - data dapat dimasukkan ke dalam paket SYN-SYNACK-ACK, meskipun sampai jabat tangan selesai, data tidak dapat digunakan.

poige
sumber