ブラウザからサーバーにhttpフォームデータを投稿するかどうかはよくわかりませんが、プロトコルは3方向のハンドシェイク(syn-ack-data)を行う必要がありますか、それともGET httpリクエストに対してのみ機能しますか?
ブラウザからサーバーにhttpフォームデータを投稿するかどうかはよくわかりませんが、プロトコルは3方向のハンドシェイク(syn-ack-data)を行う必要がありますか、それともGET httpリクエストに対してのみ機能しますか?
回答:
HTTP GETとHTTP POSTSはどちらもTCPを使用します。POSTで3方向のTCPハンドシェイク(syn-synack-ack)も必要かどうかを確認する場合は、他のTCP接続と同様に行います。TCPハンドシェイクは、HTTPなどのアプリケーションプロトコルが機能を開始する前に必要です。
参考までに、あなたの3方向ハンドシェイクは正しくありません。「syn-synack-ack」である必要があります
追加:
ブラウザーがHTTPにQUIC(Quick UDP Internet Connections、発音はクイック。Proposedby Google)プロトコルを使用している場合、3方向のTCPハンドシェイクを回避できます。しかし、私の知る限り、ChromeとGoogleでサポートされています。
ほとんどのソフトウェアは、依然としてTCPであるHTTP / 2を好みますが、多くの機能で永続的な接続を使用し、その後、サーバーサーバーごとに3ウェイハンドシェイクが1回行われます。
このプロトコルが使用されている場合、GETを含むすべてのリクエストで3ウェイハンシェイクを回避できます。
一般的な意味で質問している場合、答えは間違いなく「はい」です。HTTPメソッド(POSTなど)にはTCP接続が必要です。TCP接続を開始する唯一の方法は、3方向ハンドシェイクを使用することです。
ただし、特定のケースで質問している場合、おそらく自分のトラフィックをキャプチャしていて、Webサイトにコンテンツを送信した後に3ウェイハンドシェイクが表示されない場合、答えは少し単純です。適切に回答する前に、HTTP関連のいくつかの概念について説明する必要があります...
HTTP1.0の最初のリリースでは、Webページから要求したすべてのオブジェクトで、各オブジェクトに対して新しいTCP接続を形成する必要がありました。いくつかのテキストと2つの画像を含む次の単純化したWebサイトを見てください。
<HTML>
<HEAD>
<TITLE>My Title</TITLE>
</HEAD>
<BODY>
Stack Exchange Rules!
<IMG SRC="a.gif">
<IMG SRC="b.gif">
</BODY>
</HTML>
従来のHTTP1.0では、このWebサイトをブラウザーにロードするには、3つの TCP接続(それぞれ独自の3ウェイハンドシェイクと4ウェイクロージャー)が必要でした。
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
上記の27パケットがあることに注意してください。HTMLページ自体(index.html)、画像a.gif、および画像b.gifの3つのアイテムをダウンロードするだけです。 (実際には27パケット以上ありますが、垂直方向のスペースを節約するために、3ウェイハンドシェイクと4ウェイクロージャーにACKのみを含め、データストリーム内のACKは省略しました)
HTTPの効率を改善するために、「接続キープアライブ」と呼ばれる機能が導入されました。これにより、HTTPは同じTCP接続を再利用して複数のオブジェクトを要求できます。上記の送金は次のように削減されます。
接続キープアライブを使用したHTTP 1.1
--> SYN
SYN ACK <--
--> ACK
--> GET /index.html
<index.html> <--
--> GET /a.gif
<a.gif> <--
--> GET /b.gif
<b.gif> <--
--> FIN
ACK <--
FIN <--
--> ACK
3つのオブジェクトすべてを要求するために単一のTCP接続のみが使用されたことに注意してください。今回は13パケットしかかかりませんでした。以前の27パケットから大幅に改善されました。
私たちが議論しなければならない最後のHTTPの改善は、パイプラインと呼ばれる機能です。この機能により、クライアントは、前に要求されたオブジェクトの受信を待たずに、一度に複数のオプションを要求できるようになり、HTTPの効率がさらに向上しました。披露させて:
パイプラインを使用したHTTP1.1
--> SYN
SYN ACK <--
--> ACK
--> GET /index.html
--> GET /a.gif
--> GET /b.gif
<index.html> <--
<a.gif> <--
<b.gif> <--
--> FIN
ACK <--
FIN <--
--> ACK
まだ1つのTCP接続しか使用しておらず、9つのパケットしか使用していません。ただし、各オブジェクトの要求と受信の間にクライアントとサーバー間でかかる往復時間(RTT)を待つ必要はありません。たとえが必要な場合は、レストランにいるとします。塩、コショウ、ケチャップが必要です。ウェイター/ウェイトレスに3つすべてのアイテムを一度に要求するか、一度に1つずつ要求して戻ってくるのを待ってから次の要求を行う方が効率的ですか?
(パイプライン処理は質問に直接関係していませんが、キープアライブやその他のHTTP効率機能と組み合わせて説明されることが多いため、完全性のためにこの回答に含めることにしました)
これでようやくあなたの質問に戻ることができます:
HTTP POSTにはTCP 3ウェイハンドシェイクが必要ですか?
Webサーバーへの接続を開き、GETメソッドを使用してWebページをダウンロードし、そのWebサーバーが接続キープアライブをサポートしている場合。POSTメソッドを含む、そのWebサーバーへの後続の要求は、単に既存のTCP接続を再利用するだけです。したがって、データは既存のTCP接続で転送されるため、その特定のPOSTでは新しい3ウェイハンドシェイクは必要ありません。
ただし、接続キープアライブの期間は無限ではありません。したがって、ウェブページをダウンロードした後、POSTを送信するまでしばらく待った場合、元のTCP接続はすでに閉じている可能性があり、この場合、ブラウザはデータをPOSTするために新しいTCP接続を開く必要があります。 3ウェイハンドシェイクを使用します。
多くのブラウザとウェブサーバーは、「接続キープアライブ」機能が接続を維持するために必要な時間に異なるタイマーを使用しているため、通常要求する時間について信頼できる数値を提供することはできません。