TCP之backlog
TCP3次握手
实际上可分为4步
1 客户端发起connect(),发送SYN j
2 服务器从SYN queue中建立条目,响应SYN k, ACK J+1
3 客户端connect()成功返回,响应ACK K+1
4 服务器将socket从SYN queue移入accept queue,accept()成功返回
backlog解释
为了更好的理解backlog参数,我们必须认识到内核为任何一个给定的监听套接口维护两个队列: 1、未完成连接队列(incomplete connection queue或SYN queue),每个这样的SYN分节对应其中一项:已由某个客户发出并到达服务器,而服务器正在等待完成相应的TCP三路握手过程。这些套接口处于SYN_RCVD状态。 2、已完成连接队列(completed connection queue或accept queue),每个已完成TCP三路握手过程的客户对应其中一项。这些套接口处于ESTABLISHED状态。
未完成队列(incomplete connection queue)的长度现在由**/proc/sys/net/ipv4/tcp_max_syn_backlog**设置,在现在大多数最新linux内核都是默认512,这个设置有效的前提是系统的syncookies功能被禁用,如果系统的syncookies功能被启用,那么这个设置是无效的。Syncookies是在内核编译的时候设置的,查看syncookies是否启动:
cat /proc/sys/net/ipv4/tcp_syncookies
如果是“1”说明已启用,为“0”说明未启用。 那么为syncookies是做什么的呢,为什么它会和未完成队列有关系。简单的说它是为防范SYN Flood攻击的设计。具体请参考“syncookies介绍”(
继续看backlog,如果我们给listen的backlog参数设值超过了**/proc/sys/net/core/somaxconn**,那么backlog参数的值为自动被改写为/proc/sys/net/core/somaxconn的值。
#includeint listen(int sockfd, int backlog);
Now it specifies the queue length for completely established sockets waiting to be accepted, instead of the number of incomplete connection requests.
=========END=========