HTTP GETリクエストとPOSTリクエストのネットワーク通信に違いはありますか?
GETを使用すると、リクエスト全体が一度に送信されることを理解しています。POSTでは、最初のリクエストが送信され、次にすべてのパラメータを送信する2番目のリクエストが送信されると思います。
たとえば、サーバーとクライアント間の遅延が500ミリ秒であると想定します。GET呼び出しとPOST呼び出しの合計時間はどれくらいですか?
HTTP GETリクエストとPOSTリクエストのネットワーク通信に違いはありますか?
GETを使用すると、リクエスト全体が一度に送信されることを理解しています。POSTでは、最初のリクエストが送信され、次にすべてのパラメータを送信する2番目のリクエストが送信されると思います。
たとえば、サーバーとクライアント間の遅延が500ミリ秒であると想定します。GET呼び出しとPOST呼び出しの合計時間はどれくらいですか?
同じ量の情報(POSTメッセージがGETを超えない)を考えると、POSTはサーバー側で技術的に高速である必要があります(ナノからピコ秒)。
POST要求はクエリ文字列をログに記録しないため、書き込み処理が少なくなります。サーバーIOPSが誤って遅延に影響を与える可能性がある
これがなければ、同じパケットが与えられれば、それらは実質的に同等です。
GETはデータをクエリ文字列に格納し、POSTは情報をメッセージ本文に格納します。
サーバーは両方を異なる方法で処理します。
クライアント側では、POSTはメッセージを準備するためにより多くの処理を必要とします。AJAXを実行している場合、これに気付くでしょう。POSTよりもGETリクエストを送信する方がはるかに簡単です。
HTTP / 1.1のw3で定義されているように、GETには部分的な要求を実行する機能があるため、ネットワーク帯域幅が制限されます。
リクエストメッセージにRangeヘッダーフィールドが含まれている場合、GETメソッドのセマンティクスは「部分的なGET」に変わります。部分的なGETは、セクション14.35で説明されているように、エンティティの一部のみを転送することを要求します。部分的なGETメソッドは、クライアントが既に保持しているデータを転送せずに、部分的に取得されたエンティティを完了できるようにすることで、不要なネットワークの使用を減らすことを目的としています。
さらに、w3は、ネットワーク使用量を削減するための条件付きGETについて説明しています。
The semantics of the GET method change to a "conditional GET" if the request message includes an If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range header field. A conditional GET method requests that the entity be transferred only under the circumstances described by the conditional header field(s). The conditional GET method is intended to reduce unnecessary network usage by allowing cached entities to be refreshed without requiring multiple requests or transferring data already held by the client.
パケットはすべてTCPパケットであり、HTTPプロトコルを伝送します。要求メソッドは、ネットワーク層の応答時間を変更しません。
リクエストのサイズに応じてリクエストごとに変更されますが、リクエストの種類によっては決まりません。
投稿を使用して、取得するよりも多くのデータを送信できますが、これは、データがより速く応答することを意味するわけではなく、別の問題です。
HTTPサーバーが処理して結果を返すことができる速度は、使用しているサーバー上であり、言及する価値がないほど無視できる可能性があります。
サーバーから結果が返される速度は、HTTPサーバーが処理しているリソースによって異なります。時間がかかるPHPファイルを呼び出す場合は、時間がかかります...
パケットに明確な違いはありません...これはSSLを介したGETリクエストです。
00907f8252f7001e4fe86a93080045000028
0bb2400080067380ac100167adc22064c51a
01bb66ccad148448d84850103f05bde90000
そしてこれはSSLを介したPOSTリクエストです:
00907f8252f7001e4fe86a93080045000028
0c0640008006732cac100167adc22064c511
01bbe538c0df8621dc6150104042248c0000
TCPパケット内の文字列が「GET」であるか「POST」であるかについては、それほど多くの関与はありません。ネットワークはそれを見て、「ああ、あなたはTCPですよね? 「」気にしない。
通常のネットワークトラフィック以外の遅延は、サーバーレベルでの処理、またはサーバーが処理しているコードでの処理が原因で発生します。
Wiresharkで監視しながらこれをテストしました。
単純なHTMLフォームを作成し、メソッドをGETとPOSTの間で切り替えました。
一貫して、GETリクエストは1つのパケットを送信し、POSTは2つのパケットを送信することに気付きました。フォームデータが非常に小さい場合でも、POSTデータは常に2番目のパケットで送信されます。
これは、POSTがレイテンシーの影響をより受けやすいことを私に示唆しています。
更新2011.07.05:
POSTの単純なHTMLフォームは次のとおりです。
<form method="GET" action="/form-handler.aspx">
<input type="hidden" value="12345" />
<input type="submit" value="click to submit" />
</form>
POSTバージョンは次のとおりです。
<form method="POST" action="/form-handler.aspx">
<input type="hidden" value="12345" />
<input type="submit" value="click to submit" />
</form>
特定のデータについて、それらはほぼ同じになる可能性があります。GETリクエストは次のようになります。
GET /test?x=5&y=3&z=4 HTTP/1.1
Header1: value
Header2: value
...
POSTと同じように見えるのは次のとおりです。
POST /test HTTP/1.1
Header1: value
Header2: value
...
x=5&y=3&z=4
つまり、同じ量のデータです。本当の問題は、ユーザーがブックマークしてURLに戻り、将来同じデータを再び表示できるようにするかどうかです。GETはそのために使用され、POSTはサーバー上でデータの変更を要求するため、またはセキュリティ上の理由で使用されます(たとえば、GETを使用してパスワードを送信しないでください)。
ジョナサンの答えは非常に解明的です。しかし、リクエストが互いに異なるその場でもう少し進んでみましょう。
インターネットを流れるすべての情報は、小さなパッケージを通過します。各パッケージの最大容量が1KBであるとしましょう(これは正しい値ではありません。制限に関する実際の値が必要な場合は、RFCで検索してください)。
OK、GETリクエストとPOSTリクエストがあります。パッケージは、ジョナサンが説明したものと非常によく似ています。その場合、少量のデータですべてを1KBパッケージにラップできるため、ネットワークパフォーマンスに違いはありません。
しかし、リクエストが巨大である必要がある場合はどうなりますか?知っている人もいますが、GETリクエストの最大長はサーバーによって異なる場合があります。site.com/foo/a{200回A}に聞いてみてください。404が見つからないだけでなく、無効/不正なリクエストが返されます。
ここでPOSTが行われます。データ量が特定の値よりも大きい場合、POSTにより、サーバーはその要求へのリストを継続し、値を解析できます。
また、これまで言及されていなかった動作の根本的な違いがもう1つあります。POSTデータは、サーバーに送信される前に、ブラウザー内で現在のドキュメントエンコーディングに解析されます。
そのすべては、クライアント側での実装に関するものです。http仕様では、そのような条件はありません。送信する時間は、データの量によって異なります。POSTをGETの代わりにのみ使用すると、区別がつかなくなります。