揮発性のメモ2

http://d.hatena.ne.jp/iww/

バックログの指定

listenのバックログが指定できない - 揮発性のメモの続き

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/listen.2.html
int listen(int sockfd, int backlog);
backlogバックログの数=accept()待ちの接続のキューの数を指定できる。
ということになっているけど、実際はキューの数をあまり制限できないっぽい。


カーネル側の設定を

# cat /proc/sys/net/ipv4/tcp_syncookies
0
# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
1

プログラム側を

    result = listen( sd, 1 );

として制限かけていても、実際にはセッションが確立してしまう。

tcp        0      0 172.16.1.4:5000         172.16.101.10:4895      SYN_RECV    -
tcp        0      0 172.16.1.4:5000         172.16.101.10:4894      SYN_RECV    -
tcp6       0      0 172.16.1.4:5000         172.16.101.10:4893      ESTABLISHED 2890/testserver
tcp6       0      0 172.16.1.4:5000         172.16.0.82:38941       ESTABLISHED -
tcp6       0      0 172.16.1.4:5000         172.16.0.82:38940       ESTABLISHED -

ESTABLISHED状態のキューの最大数が listen(sd,backlog)backlog +1となり、
SYN_RECV状態のキューの最大数が tcp_max_syn_backlog +1となる模様。
それ以上の接続は受け付けなくなる。
SYN_RECV状態のキューはそのうち切断される)
どれも、接続が確立したことになってるのでsend()したデータがサーバまできちんと送信される。
サーバがaccept()するより先にクライアントが切断していても、サーバまできちんと送信される。


現象はわかったけど原理はわからないので、あとでソース読む。