基本TCPソケット2−1
listen関数
環境変数で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スプーフィング)。
参考文献