web-dev-qa-db-ja.com

TCP接続の「バックログ」とは何ですか?

以下に、ポートへの接続要求をリッスンするサーバーとして機能するpythonプログラム9999

_# server.py 
import socket                                         
import time

# create a socket object
serversocket = socket.socket(
            socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
Host = socket.gethostname()                           

port = 9999                                           

# bind to the port
serversocket.bind((Host, port))                                  

# queue up to 5 requests
serversocket.listen(5)                                           

while True:
    # establish a connection
    clientsocket,addr = serversocket.accept()      

    print("Got a connection from %s" % str(addr))
    currentTime = time.ctime(time.time()) + "\r\n"
    clientsocket.send(currentTime.encode('ascii'))
    clientsocket.close()
_

質問は、socket.listen()メソッドのパラメーターの機能(つまり_5_)です。

インターネットに関するチュートリアルに基づいて:

Backlog引数は、キューに入れられる接続の最大数を指定し、少なくとも0でなければなりません。最大値はシステムに依存(通常5)、最小値は0に強制されます。

しかし:

  1. これらは何ですかキュー接続
  2. クライアントのリクエストに違いはありますか? (つまり、socket.listen(5)で実行されているサーバーは、接続要求の受け入れまたはデータの受信でsocket.listen(1)で実行されているサーバーとは異なりますか?)
  3. なぜ最小値がゼロなのですか?少なくとも_1_であってはいけませんか?
  4. 優先値はありますか?
  5. これはbacklogがTCP接続のみに定義されていますか、またはUDPおよび他のプロトコルにも適用されますか?
23
user3739941

注:回答はPythonのバックグラウンドを持たずにフレーム化されていますが、質問は言語とは無関係であり、回答する必要があります。

これらのキュー接続とは何ですか?

簡単に言えば、backlogパラメーターは、キューが保持する保留中の接続の数を指定します。

複数のクライアントがサーバーに接続すると、サーバーは着信要求をキューに保持します。クライアントはキューに配置され、サーバーはキューメンバーが処理を進めるときに要求を1つずつ処理します。この種の接続の性質は、キュー接続と呼ばれます。

クライアントのリクエストに違いはありますか? (つまり、socket.listen(5)で実行しているサーバーは、接続要求の受け入れまたはデータの受信でsocket.listen(1)で実行しているサーバーとは異なりますか?)

はい、両方のケースは異なります。最初のケースでは、5つのクライアントのみをキューに配置できます。一方、backlog = 1の場合、キューに保持できる接続は1つだけであるため、それ以降の接続要求はドロップされます。

なぜ最小値がゼロなのですか?少なくとも1であるべきではありませんか?

Pythonについてはわかりませんが、 このソースによる 、Cでは、バックログ引数0により、ソケットが接続を受け入れることができます。この場合、待機キューの長さは実装定義の最小値。

優先値はありますか?

この質問には明確な答えはありません。これは、ハードウェア構成とソフトウェア構成だけでなく、アプリケーションの性質にも依存すると思います。繰り返しになりますが、ソースごとに、BackLogは暗黙的に1から5の間(Cによる)に制限されます。

このバックログはTCP接続のみに定義されていますか、それともUDPおよび他のプロトコルにも適用されますか?

いや接続されていないデータグラムソケット(UDP)に対してlisten()またはaccept()する必要がないことに注意してください。これは、接続されていないデータグラムソケットを使用する利点の1つです。

しかし、覚えておいてください、そして、バックログパラメータを持つTCPベースのデータグラムソケット実装(TCPDatagramSocketと呼ばれます)もあります。

32
Am_I_Helpful

TCP接続が確立されているとき、いわゆる3ウェイハンドシェイクが実行されます。両側がパケットを交換し、一度実行すると、この接続は完全と呼ばれ、アプリケーションで使用できる状態になります。 。

ただし、この3方向ハンドシェイクには時間がかかります。そしてその間、接続はキューに入れられ、これがバックログです。したがって、.listen(no)呼び出しを介して不完全な並列接続の最大量を設定できます(posix標準 値はヒントにすぎません により、完全に無視されることに注意してください)。誰かがバックログ制限を超えて接続を確立しようとすると、反対側はそれを拒否します。

したがって、バックログの制限は、確立されていない保留中の接続に関するものです。

現在、ほとんどの場合、バックログの上限が高いほど良くなります。最大制限はOSに依存していることに注意してください。 cat /proc/sys/net/core/somaxconnは私に128私のUbuntuで。

18
freakish