一、半连接队列和全连接队列

服务器绑定、监听了指定端口后,内核通常会为每一个LISTEN状态的socket维护两个队列

1.SYN队列(半连接队列):长度由tcp_max_syn_backlog决定

2.ACCEPT队列(全连接队列):长度由内核硬限制由 net.core.somaxconn 限制,即实际的值由min(backlog,somaxconn) 来决定


二、连接建立的流程

blob.png

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 数值。