一、半连接队列和全连接队列
服务器绑定、监听了指定端口后,内核通常会为每一个LISTEN状态的socket维护两个队列
1.SYN队列(半连接队列):长度由tcp_max_syn_backlog决定
2.ACCEPT队列(全连接队列):长度由内核硬限制由 net.core.somaxconn 限制,即实际的值由min(backlog,somaxconn) 来决定
二、连接建立的流程
1.当client通过connect()向server发出SYN包时,server收到syn后,把相关信息放到半连接队列(syns queue)中,同时回复syn+ack。
2.Client返回ACK后,如果全连接队列(accept queue)没满,那么Server从半连接队列拿出相关信息放入到全连接队列。
3.否则按照tcp_abort_on_overflow配置参数执行操作
1)0 表示直接丢丢弃该ACK
2)1 表示发送RST
三、查看队列情况
如果应用处理全连接队列(accept queue)过慢 socket overflow,影响半连接队列(syn queue)溢出socket dropped
# netstat -s|grep -i listen
8692 times the listen queue of a socket overflowed
8692 SYNs to LISTEN sockets ignored
四、命令 ss -tln
1.LISTEN 状态:
Recv-Q 表示的当前等待服务端调用 accept 完成三次握手的 listen backlog 数值,也就是说,当客户端通过 connect() 去连接正在 listen() 的服务端时,这些连接会一直处于这个queue里面直到被服务端 accept();
Send-Q表示的则是最大的listen backlog数值,这就就是上面提到的 min(backlog, somaxconn) 的值。
2.非 LISTEN 状态
Recv-Q 表示 receive queue 中的 bytes 数量
Send-Q 表示 send queue 中的 bytes 数值。