基本TCPソケット2−1

listen関数

  • 1.クライアントからSYNが到着
  • 2.TCPは確立待ちコネクションキュー上に新しいエントリを作成
  • 3.3WHSが成功すると、対応するエントリが確立待ちコネクションキューから確立済みコネクションキューの末尾に移動する。
  • 4.accept関数を呼び出すと、確立済みコネクションキューの最初のエントリがプロセスに返されるか、キューが空であった場合は、確立済みコネクションキューに加えられるまでプロセスはスリープ状態におかれる。



    環境変数でbacklogの値を指定できるようにしたlisten関数ラッパ

    void Listen(int fd, int backlog)
    {
      char *ptr;
      
      if ( (ptr = getenv("LISTENQ") ) != NULL )
        backlog = atoi(ptr);
      if (listen(fd, backlog) < 0)
        err_sys("listen error");
    }

    クライントからのSYNが到着した際にキューが満杯だった場合、TCPは、単にSYNを無視する。クライアントはSYNを再送することにより、運がよければキューの空きを見つけることが可能である。もし、TCPがRSTを返すと、クライアントのconnectは即座にエラーを返す。TCPサーバーがRSTを返してしまうと、"このポートにサーバーが存在しない"と"サーバーのキューが満杯である"を区別できない。

    3WHS完了後、サーバーがacceptを呼び出すまでの間に到着したデータは、ソケットの受信バッファが許す限り、サーバーのTCPによってバッファリングされるべき。

    バックログの値は、確立済みコネクション数を指定すべき。

    SYNフラッディング
    TCPサーバーに連続でSYNを送出し、TCPの確立待ちコネクションキューを溢れさせる攻撃。各SYNの始点IPアドレスは乱数で設定されているため、サーバーのSYN/ACKはどこにも届かない(IPスプーフィング)。





    参考文献

  • UNIXネットワークプログラミング スティーブンズ