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を参照) 。それでも、どうすればそれを強制できるのだろうかと思っています。
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]
コメントを追加