我对Backlog的理解

简介: 我对Backlog的理解

 listen函数中backlog参数的意义

1)backlog 用于在TCP层接收链接的缓冲池的最大个数,这个个数可在应用层中的listen函数里设置,当客户链接请求大于这个个数(缓冲池满),其它的未进入链接缓冲池的客户端在tcp层上tcp模块会自动重新链接,直到超时(大约57秒后)  
2)应用层链接(connect)完成时,要从tcp层的链接缓冲池中移出一个(accept函数实现)

3).backlog是连接请求队列的最大长度

TCP握手的几个阶段

收到客户端的syn请求 ->将这个请求放入syn_table中去->服务器端回复syn-ack->收到客户端的ack->放入accept queue中

在linux里可以简单的认为有2个队列,一个就是在握手过程中的队列,而另一个就是握手成功的队列

而backlog影响的是握手成功的队列

backlog 并不是按照你调用listen的所设置的backlog大小,实际上取的是backlog和somaxconn的最小值

在linux内核2.2版本以后,backlog参数控制的是已经握手成功的还在accept queue的大小。

现在backlog用来确定已完成队列(完成三次握手等待accept)的长度,而不再是已完成队列和未完成连接队列之和(linux 2.2之前)。

未完成队列(incomplete connection queue),每个这样的SYN分节对应其中一项:已由每个客户发出并到达服务器,而服务器正在等待完成相应的TCP三路握手过程。这些套接字处于SYN_RCVD状态。,的长度现在由/proc/sys/net/ipv4/tcp_max_syn_backlog设置,在现在大多数最新linux内核都是默认512,这个设置有效的前提是系统的syncookies功能被禁用,如果系统的syncookies功能被启用,那么这个设置是无效的。Syncookies是在内核编译的时候设置的,查看syncookies是否启动:

cat  /proc/sys/net/ipv4/tcp_syncookies

如果是“1”说明已启用,为“0”说明未启用。

那么为syncookies是做什么的呢,为什么它会和未完成队列有关系。简单的说它是为防范SYN Flood攻击的设计。

cat /proc/sys/net/ipv4/tcp_max_syn_backlog

已完成队列(complete connection queue),每个已完成TCP三路握手过程的客户对应其中一项,这些套接字处于ESTABLISHED状态。

 继续看backlog,如果我们给listen的backlog参数设值超过了/proc/sys/net/core/somaxconn,那么backlog参数的值为自动被改写为/proc/sys/net/core/somaxconn的值,它的默认大小为128.

2048

cat /proc/sys/net/core/somaxconn

128


查看连接情况

watch "netstat -t -n  | grep 9001 | grep -oP '\w+\s*$'  | sort  | uniq -c"

watch "ss -s"




 


目录
相关文章
|
6月前
|
算法 Unix
socket套接字选项getsockopt&setsockopt
setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。在Unix网络编程中通常用到getsockopt和setsockopt两个函数来获取和设置套接口的选项。getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。
95 0
|
6月前
|
缓存 网络协议 算法
深入TCP协议——tcp_tw_reuse和tcp_tw_recycle
前情提要:深入理解Linux网络——TCP协议三次握手和四次挥手详细流程 我们已经知道TCP四次挥手中,主动方在收到被动方的FIN数据包之后会进入TIME_WAIT状态等待2MSL的时间后才进入CLOSED。在 Linux 操作系统下,TIME_WAIT 状态的持续时间是 60 秒,这意味着这 60 秒内,客户端一直会占用着这个端口,这是有一定的开销的。如果如果主动关闭连接方的 TIME_WAIT 状态过多,占满了所有端口资源,则会导致无法创建新连接。
|
6月前
|
存储 网络协议 安全
tcp服务器epoll的多种实现
tcp服务器epoll的多种实现
|
运维 网络协议 Linux
聊聊 IP packet 的 TTL 与 tcp segment 的 MSL
聊聊 IP packet 的 TTL 与 tcp segment 的 MSL
|
数据库
为socket的recv/send设置超时
为socket的recv/send设置超时
257 0
|
消息中间件 网络协议 Java
|
算法 Windows 数据安全/隐私保护
UDP10040 和 setsockopt设置大全
今天无意之中碰到 UDP 10040 错误  原来是缓冲区不够,以下转载的解决方法以供不时之需。   1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,...
1085 0