TCP的全连接和半连接队列

TCP的全连接和半连接队列

当服务端调用listen函数监听端口的时候,内核会为每个监听的socket创建两个队列:

  • 半连接队列(syn queue):客户端发送SYN包,服务端收到后回复SYN+ACK后,服务端进入SYN_RCVD状态,这个时候的socket会放到半连接队列。

  • 全连接队列(accept queue):当服务端收到客户端的ACK后,socket会从半连接队列移出到全连接队列。当调用accpet函数的时候,会从全连接队列的头部返回可用socket给用户进程。

半连接队列

半连接队列的大小由/proc/sys/net/ipv4/tcp_max_syn_backlog控制,Linux的默认是1024。

当服务端发送SYN_ACK后将会开启一个定时器,如果超时没有收到客户端的ACK,将会重发SYN_ACK包。重传的次数由/proc/sys/net/ipv4/tcp_synack_retries控制,默认是5次。

全连接队列

全连接队列的大小通过/proc/sys/net/core/somaxconn指定,在使用listen函数时,内核会根据传入的backlog参数与系统参数somaxconn,取二者的较小值。

listen函数

  • ounter(line
int listen(int sockfd, int backlog)

Nginx和Redis默认的backlog值等于511,Linux默认的backlog 为 128,Java默认的backlog等于50

默认情况下,全连接队列满以后,服务端会忽略客户端的 ACK,随后会重传SYN+ACK,也可以修改这种行为,这个值由/proc/sys/net/ipv4/tcp_abort_on_overflow决定。

  • tcp_abort_on_overflow为0表示三次握手最后一步全连接队列满以后服务端会丢掉客户端发过来的ACK,服务端随后会进行重传 SYN+ACK
  • tcp_abort_on_overflow为1表示全连接队列满以后服务端发送RST给客户端,直接释放资源。

syn_flood攻击

深入浅出TCP中的SYN-Cookies

命令查看

netstat -s

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
netstat -s | egrep "listen|LISTEN" // 全连接队列溢出次数667399 times the listen queue of a socket overflowed // 半连接队列溢出次数667399 SYNs to LISTEN sockets dropped

ss -lnt

  • ounter(line
  • ounter(line
  • ounter(line
[root@mcs opt]# ss -lntState      Recv-Q Send-Q                        Local Address:Port                                       Peer Address:Port              LISTEN     0      100                                       *:8080                                                  *:* 

listen状态下,Send-Q表示全连接队列大小的最大值,Recv-Q表示全连接队列的使用大小,超过最大值则会溢出。

ss命令和Recv-Q和Send-Q状态

关注作者微信公众号:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值