以下に、ポートへの接続要求をリッスンするサーバーとして機能する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に強制されます。
しかし:
socket.listen(5)
で実行されているサーバーは、接続要求の受け入れまたはデータの受信でsocket.listen(1)
で実行されているサーバーとは異なりますか?)1
_であってはいけませんか?backlog
がTCP接続のみに定義されていますか、またはUDPおよび他のプロトコルにも適用されますか?注:回答は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と呼ばれます)もあります。
TCP接続が確立されているとき、いわゆる3ウェイハンドシェイクが実行されます。両側がパケットを交換し、一度実行すると、この接続は完全と呼ばれ、アプリケーションで使用できる状態になります。 。
ただし、この3方向ハンドシェイクには時間がかかります。そしてその間、接続はキューに入れられ、これがバックログです。したがって、.listen(no)
呼び出しを介して不完全な並列接続の最大量を設定できます(posix標準 値はヒントにすぎません により、完全に無視されることに注意してください)。誰かがバックログ制限を超えて接続を確立しようとすると、反対側はそれを拒否します。
したがって、バックログの制限は、確立されていない保留中の接続に関するものです。
現在、ほとんどの場合、バックログの上限が高いほど良くなります。最大制限はOSに依存していることに注意してください。 cat /proc/sys/net/core/somaxconn
は私に128
私のUbuntuで。