用事の無い急な休みはいらない!

暇だよ、暇。

急な休みだから空いてる友だちもいないし。とりあえず、Red Hat Linuxのbacklogについて実験してみた。backlogってのはBSDソケットでサーバ側がlisten呼ぶときの二つ目の引数のこと。

#include 
int listen(int s, int backlog);

man listenからbacklog関係の部分を引用しておく

backlog 引き数は、保留中の接続のキューが拡張することのできる最大長を指定する。

(中略)

注意
TCP ソケットでの backlog 引数の振る舞いは Linux 2.2 で変更された。現 在ではこの引数は、受け付けられるのを待っている、 完全に確立されたソケットのキューの長さを指定する。以前は不完全な接続要求の数であったが、これを置き換えた。

ここでいう不完全な接続要求というのは多分3-way-ハンドシェークのクライアントからのACK待ち状態の事だと思う(これをSYN_RCVDという)。で、確立されたソケットってのは3-way-ハンドシェークが完了したソケット(これをESTABLISHEDという)のことでしょう。

backlogの最大値はSOMAXCONNで分かる。俺の環境では128だった。一般的には(というかBSD的には)5に制限されているところを見ると十分過ぎる程の大きさだ。で、実際にいくつの接続がキューされるか調べたところ、backlogに3足して、131よりも大きいときは131にカットされ、131より小さいときはbacklog+3が用いられているようだ。

だからbacklogに0を指定しても3つはキューされる(これに頼るのはだめ)。

manから察するにlistenに与えるbacklogはESTABLISHEDな接続のキューなので、暗黙的に追加される3というのが(意味的には)SYN_RCVDな接続の為のスペースなのかな。