TCP的backlog参数

底层

backlog 参数主要用于底层方法 int listen(int sockfd, int backlog), 在解释 backlog 参数之前,我们先了解下 tcp 在内核的请求过程,其实就是 tcp 的三次握手:

  1. client 发送 SYN 到 server,将状态修改为 SYN_SEND,如果 server 收到请求,则将状态修改为 SYN_RCVD,并把该请求放到 syns queue 队列中。
  2. server 回复 SYN+ACK 给 client,如果 client 收到请求,则将状态修改为 ESTABLISHED,并发送 ACK 给 server。
  3. server 收到 ACK,将状态修改为 ESTABLISHED,并把该请求从 syns queue 中放到 accept queue。

在linux系统内核中维护了两个队列:syns queue 和 accept queue

   

syns queue
用于保存半连接状态的请求,其大小通过 /proc/sys/net/ipv4/tcp_max_syn_backlog 指定,一般默认值是 512,不过这个设置有效的前提是系统的syncookies功能被禁用。互联网常见的 TCP SYN FLOOD 恶意 DOS 攻击方式就是建立大量的半连接状态的请求,然后丢弃,导致 syns queue 不能保存其它正常的请求。


accept queue
用于保存全连接状态的请求,其大小通过 /proc/sys/net/core/somaxconn 指定,在使用 listen函数时,内核会根据传入的 backlog 参数与系统参数 somaxconn,取二者的较小值。

如果 accpet queue 队列满了,server 将发送一个 ECONNREFUSED 错误信息 Connection refused 到 client。

posted on 2021-09-09 09:45  MaXianZhe  阅读(435)  评论(0)    收藏  举报

导航