TCP/IP backlog

2905 ワード

linuxでは、アプリケーションがlisten状態のsocketを作成すると、このsocketに2つのキューが指定されます.
  • SYN queue:syn_に格納rec状態のsocket、カーネルパラメータtcp_max_syn_backlog指定.
  • accept queue:ESTABLISHED状態にあるsocketを格納し、カーネルパラメータsomaxconnとアプリケーション自体で指定します.例えば、redis:tcp-backlog、somaxconnとtcp-backlogの最小値を取ります.
  • accept queueのsocketはアプリケーションによって消費されます.

  • syn queueが満たされていないのにaccept queueが満たされている場合:
    1)tcpが3回目に握手したACKがserverに到達し、accept queueが満たされると、カーネルはこのACKパケットを失う.
    2)TCPの再送メカニズムにより、sever側はタイムアウト時間内にACKを受信せず、server側はSYN+ACKを再送し、client側はACKパケットを再送する.
    3)/proc/sys/net/ipv 4/tcp_synack_retriesが設定した再試行回数が超えた後も正常にACKパケットを受け取っていない場合は、再試行しません.
    リスニング状態でのsocket
    State      Recv-Q Send-Q                                  Local Address:Port                                    Peer Address:Port 
    LISTEN     0      100                                                 *:7000                                               *:*     
    LISTEN     0      100                                                 *:7800                                               *:*     
    LISTEN     0      50                                                  *:58201                                              *:*     
    LISTEN     0      50                                                  *:44761                                              *:*     
    LISTEN     0      100                                                 *:7001                                               *:*     
    LISTEN     0      512                                                 *:6265                                               *:*     
    LISTEN     0      50                                                  *:60026                                              *:*   
    Recv-Q:  accept queue     
    Send-Q:accept queue       

    非傍受状態のsocket
    State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port 
    CLOSE-WAIT 1      0               10.11.11.66:45694         10.11.11.227:8800  
    TIME-WAIT  0      0               10.13.13.66:9800           10.13.13.23:46128 
    ESTAB      0      0               10.13.13.66:39618          10.13.13.82:6380  
    ESTAB      0      0               10.13.13.66:7800           10.13.13.24:45343 
    ESTAB      0      0               10.13.13.66:8201           10.13.13.24:54330 
    ESTAB      0      0               10.13.13.66:9800           10.13.13.23:44531 
    ESTAB      0      0               10.11.11.66:43312         10.11.11.183:6001  
    ESTAB      0      0               10.13.13.66:45206          10.13.13.83:6380  
    CLOSE-WAIT 1      0               10.11.11.66:52191         10.11.11.227:8800  
    Recv-Q:The count of bytes not copied by the user program connected to this socket.
    Send-Q:The count of bytes not acknowledged by the remote host.

    参考記事:
    http://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html
    http://blog.itpub.net/15480802/viewspace-1399303/