HTTPクライアントがスリーウェイハンドシェイクのACKメッセージで空のデータを送信するのはなぜですか?

user3563894

Wiresharkを使用していますが、ブラウザがWebサイトに接続すると、空のACKパケットが送信されます(http要求のあるACKパケットではありません)。なぜそれが起こるのですか?TCPおよびHTTPRFCでは、データを含むACKパケットを送信することは禁止されていません。ここで遅延ACKを実装できますか?

また、ソケットプログラミングでデータを含むACKの送信を有効/無効にする方法はありますか?

注:ACKパケットはデータとともに送信できるようです(https://osqa-ask.wireshark.org/questions/36023/tcp-3-way-handshake-data-in-third-messageを参照) 。それでも、どうすればそれを強制できるのだろうかと思っています。ここに画像の説明を入力してください

Steffen Ullrich

TCPハンドシェイクの一部として空のACKを送信することは、実際には、TCPハンドシェイクの最後の部分にすでにデータを含めるよりも一般的です。

通常のクライアントコードは最初にconnect呼び出し、これが正常に戻った後でのみデータを送信します。connectサーバーがSYN + ACKで応答した場合にのみ正常に戻ります。カーネルはこれに対して自動的にACKを発行し、ハンドシェイクが完了したことをサーバーに通知します。カーネルにはこの時点で送信するアプリケーションデータがないため、これらのデータをこのACKに含めることはできません。

最終的なACKがクライアントからのより多くの潜在的なデータを待つために延期されるとどうなるか想像してみてください。最悪の場合、クライアントは最初にサーバーからのデータを待つため、そのようなデータを送信しません。これはSMTPなどのプロトコルで一般的です。 、FTP、...。ただし、サーバーはクライアントからACKを取得しないため、TCPハンドシェイクが完了したとは見なさず、データを送信しません。したがって、これにより、クライアントが空のACKを送信することを決定するまで、不要な遅延が発生します。

したがって、ハンドシェイクを最適化するために、クライアントはカーネルにデータの送信をすぐに開始し、カーネルはまだACKを送信してはならないことを通知する必要があります。これは、少なくともLinuxでは次のTCP_QUICKACKオプションを使用して実行できます。

import socket
s = socket.socket()
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_QUICKACK, False)
s.connect(("example.com",80))
s.send(b"GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")
print(s.recv(1024))

TCP_QUICKACK明示的にFalseに設定TCPハンドシェイクのACKは、すでにアプリケーション・データを転送します:

IP local-system.45664 > example.com.http: Flags [S], seq 1590101890, win 29200, options [mss 1460,sackOK,TS val 4226937632 ecr 0,nop,wscale 7], length 0
IP example.com.http > local-system.45664: Flags [S.], seq 3649111496, ack 1590101891, win 65535, options [mss 1452,sackOK,TS val 625701214 ecr 4226937632,nop,wscale 9], length 0
IP local-system.45664 > example.com.http: Flags [P.], seq 1:38, ack 1, win 229, options [nop,nop,TS val 4226937765 ecr 625701214], length 37: HTTP: GET / HTTP/1.0

オプションを明示的に設定しないと、空のACKが取得されます。

IP local-system.45856 > example.com.http: Flags [S], seq 4147534093, win 29200, options [mss 1460,sackOK,TS val 4227186296 ecr 0,nop,wscale 7], length 0
IP example.com.http > local-system.45856: Flags [S.], seq 123501506, ack 4147534094, win 65535, options [mss 1452,sackOK,TS val 2369778695 ecr 4227186296,nop,wscale 9], length 0
IP local-system.45856 > example.com.http: Flags [.], ack 1, win 229, options [nop,nop,TS val 4227186421 ecr 2369778695], length 0
IP local-system.45856 > example.com.http: Flags [P.], seq 1:38, ack 1, win 229, options [nop,nop,TS val 4227186421 ecr 2369778695], length 37: HTTP: GET / HTTP/1.0

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

SSLメッセージを送信する前にSSLハンドシェイクが失敗するのはなぜですか?

分類Dev

迅速なプロジェクトでランタイムエラーが発生した場合、Xcodeがアセンブリ言語のスレッド出力に送信するのはなぜですか?ポイントは何ですか ?

分類Dev

(未定義のインデックス: ドライバー) Laravel アプリケーションでデータベース クエリを実行しようとすると、なぜこのエラー メッセージが表示されるのですか?

分類Dev

Qt 5.3.1:ウィジェットのインクルードパスとライブラリを設定する必要があるのはなぜですか

分類Dev

メッセージobjc_msgSend(class、@ selector(dealloc))を送信してオブジェクトを解放しますが、オブジェクトポインタにアクセスするのが間違っているのはなぜですか?

分類Dev

ジェネリックインターフェイスの制約が拡張メソッドの使用を台無しにするのはなぜですか?

分類Dev

オブジェクトの型がそのインターフェイスを参照するのはなぜですか?(デザインパターン:再利用可能なオブジェクト指向ソフトウェアの本の要素)

分類Dev

インターフェイスのディクショナリをメソッドパラメータとして使用しようとすると、コンパイラが派生クラスからそのインターフェイスに変換できないのはなぜですか?

分類Dev

ペイロード付きのカスタムメッセージをボットからクライアントアプリケーションにダイレクトライン経由で送信するにはどうすればよいですか?

分類Dev

JPAがドメインオブジェクトの引数なしのコンストラクターを必要とするのはなぜですか?

分類Dev

ジェネリックメソッドのバインドされた型パラメーターは、同等のジェネリックインターフェイスが機能しているときに失敗します。なぜですか?

分類Dev

ジェネリックメソッドのバインドされた型パラメーターは、同等のジェネリックインターフェイスが機能しているときに失敗します。なぜですか?

分類Dev

nullオブジェクトポインタのデータにアクセスしないメソッドを呼び出すと、機能する場合とクラッシュする場合があります。なぜいつもクラッシュしないのですか?

分類Dev

多くのJava Streamインターフェースメソッドが、ジェネリック型の代わりに下限のワイルドカードをパラメーターに使用するのはなぜですか?

分類Dev

メソッドがインターフェイスタイプのオブジェクトを返すのはなぜですか?

分類Dev

「エラー:アクションはプレーンオブジェクトである必要があります。非同期アクションにはカスタムミドルウェアを使用してください。」というメッセージが表示されるのはなぜですか。エラー?

分類Dev

SSLProtocolExcepetion:HTTPリクエストを送信しようとするとハンドシェイクが失敗するのはなぜですか?

分類Dev

KnockoutJSで送信ハンドラーのイベントオブジェクトにアクセスする

分類Dev

ネットワーク経由でリソースをフェッチするには、クライアントとサーバー間で複数のラウンドトリップが必要になるのはなぜですか?

分類Dev

javascript handleEventメソッドがイベントパラメータを省略してイベントにアクセスできるのはなぜですか?

分類Dev

ウィンドウタイトルを取得するコードがアプリのクラッシュを引き起こすのはなぜですか?

分類Dev

JS:パラメータで受け取らずにイベントハンドラでイベントオブジェクトにアクセスできるのはなぜですか?

分類Dev

セッションパラメータで「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生し、nullではないのはなぜですか?

分類Dev

コンパイラがユーザーインターフェイスプロジェクトでEntityFrameworkへの参照を要求するのはなぜですか?

分類Dev

ジェネリッククラスコンストラクターが、要求されたインターフェイスを実装するオブジェクトの取得を拒否するのはなぜですか

分類Dev

C#でクライアントの画面にウェルカムメッセージを送信する

分類Dev

sbtセッション内からのSparkアプリケーションのコンパイルが「オブジェクトapacheはパッケージorgのメンバーではありません」で失敗するのはなぜですか?

分類Dev

TypeScriptがユニオンタイプをチェックするifステートメントでエラーをスローするのはなぜですか?

分類Dev

このAWS Lambdaデプロイメントパッケージにハンドラスクリプトが見つからないのはなぜですか?

Related 関連記事

  1. 1

    SSLメッセージを送信する前にSSLハンドシェイクが失敗するのはなぜですか?

  2. 2

    迅速なプロジェクトでランタイムエラーが発生した場合、Xcodeがアセンブリ言語のスレッド出力に送信するのはなぜですか?ポイントは何ですか ?

  3. 3

    (未定義のインデックス: ドライバー) Laravel アプリケーションでデータベース クエリを実行しようとすると、なぜこのエラー メッセージが表示されるのですか?

  4. 4

    Qt 5.3.1:ウィジェットのインクルードパスとライブラリを設定する必要があるのはなぜですか

  5. 5

    メッセージobjc_msgSend(class、@ selector(dealloc))を送信してオブジェクトを解放しますが、オブジェクトポインタにアクセスするのが間違っているのはなぜですか?

  6. 6

    ジェネリックインターフェイスの制約が拡張メソッドの使用を台無しにするのはなぜですか?

  7. 7

    オブジェクトの型がそのインターフェイスを参照するのはなぜですか?(デザインパターン:再利用可能なオブジェクト指向ソフトウェアの本の要素)

  8. 8

    インターフェイスのディクショナリをメソッドパラメータとして使用しようとすると、コンパイラが派生クラスからそのインターフェイスに変換できないのはなぜですか?

  9. 9

    ペイロード付きのカスタムメッセージをボットからクライアントアプリケーションにダイレクトライン経由で送信するにはどうすればよいですか?

  10. 10

    JPAがドメインオブジェクトの引数なしのコンストラクターを必要とするのはなぜですか?

  11. 11

    ジェネリックメソッドのバインドされた型パラメーターは、同等のジェネリックインターフェイスが機能しているときに失敗します。なぜですか?

  12. 12

    ジェネリックメソッドのバインドされた型パラメーターは、同等のジェネリックインターフェイスが機能しているときに失敗します。なぜですか?

  13. 13

    nullオブジェクトポインタのデータにアクセスしないメソッドを呼び出すと、機能する場合とクラッシュする場合があります。なぜいつもクラッシュしないのですか?

  14. 14

    多くのJava Streamインターフェースメソッドが、ジェネリック型の代わりに下限のワイルドカードをパラメーターに使用するのはなぜですか?

  15. 15

    メソッドがインターフェイスタイプのオブジェクトを返すのはなぜですか?

  16. 16

    「エラー:アクションはプレーンオブジェクトである必要があります。非同期アクションにはカスタムミドルウェアを使用してください。」というメッセージが表示されるのはなぜですか。エラー?

  17. 17

    SSLProtocolExcepetion:HTTPリクエストを送信しようとするとハンドシェイクが失敗するのはなぜですか?

  18. 18

    KnockoutJSで送信ハンドラーのイベントオブジェクトにアクセスする

  19. 19

    ネットワーク経由でリソースをフェッチするには、クライアントとサーバー間で複数のラウンドトリップが必要になるのはなぜですか?

  20. 20

    javascript handleEventメソッドがイベントパラメータを省略してイベントにアクセスできるのはなぜですか?

  21. 21

    ウィンドウタイトルを取得するコードがアプリのクラッシュを引き起こすのはなぜですか?

  22. 22

    JS:パラメータで受け取らずにイベントハンドラでイベントオブジェクトにアクセスできるのはなぜですか?

  23. 23

    セッションパラメータで「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生し、nullではないのはなぜですか?

  24. 24

    コンパイラがユーザーインターフェイスプロジェクトでEntityFrameworkへの参照を要求するのはなぜですか?

  25. 25

    ジェネリッククラスコンストラクターが、要求されたインターフェイスを実装するオブジェクトの取得を拒否するのはなぜですか

  26. 26

    C#でクライアントの画面にウェルカムメッセージを送信する

  27. 27

    sbtセッション内からのSparkアプリケーションのコンパイルが「オブジェクトapacheはパッケージorgのメンバーではありません」で失敗するのはなぜですか?

  28. 28

    TypeScriptがユニオンタイプをチェックするifステートメントでエラーをスローするのはなぜですか?

  29. 29

    このAWS Lambdaデプロイメントパッケージにハンドラスクリプトが見つからないのはなぜですか?

ホットタグ

アーカイブ