我们知道当服务器绑定、监听了指定端口后,内核通常会为每一个LISTEN状态的socket维护两个队列:
- SYN队列(半连接队列):由/proc/sys/net/ipv4/tcp_max_syn_backlog指定,表示处于 SYN_RECV 状态的队列
- ACCEPT队列(全连接队列):由listen()函数的第二个参数 backlog 指定,内核硬限制由 net.core.somaxconn 限制,即实际的值由min(backlog,somaxconn) 来决定。表示已完成连接的队列,等待被 accept系统调用取走。
TCP三次握手如何与accept交互呢?
看下面这张图:
客户端使用connect向服务器发送TCP连接,三次握手就发生了。当1.1步骤 客户端首先发送SYN到达服务端后,内核会把连接信息放到SYN队列中,同时回一个SYN+ACK包给客户端。一段时间后,客户端再次发来ACK包后,内核会把连接从SYN队列中取出,再把这个连接放到ACCEPT队列中。服务器调用accept时,其实就是直接从ACCEPT队列中取出已经建立成功

本文详细介绍了TCP连接的管理,包括半连接队列(SYN队列)和全连接队列(ACCEPT队列)的工作原理。当服务器的SYN队列或ACCEPT队列满时,可能导致连接请求被丢弃或重试。服务器进程可能会使用独立线程处理accept以避免队列满的问题,而某些服务器如Nginx则采用非阻塞模式的套接字来处理连接和IO操作。
最低0.47元/天 解锁文章
4055

被折叠的 条评论
为什么被折叠?



