通过PROC文件查看队列长度,可见对于4G内存的系统,tcp_max_syn_backlog的值为128;对于8G内存的系统,其值为256。

# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
128
#
/ # cat /proc/sys/net/ipv4/tcp_max_syn_backlog
256

PROC文件tcp_max_syn_backlog控制处在TCP_SYN_RECV状态的TCP连接最大数,默认值为128。即接收到SYN报文并且已发送SYN+ACK但还未收到对端ACK响应的连接最大数,此数值为基于单个socket的控制。128为最小值,对于内存较大的机器,可适当调高此值。PROC文件变量定义如下:

static struct ctl_table ipv4_net_table[] = { {.procname   = "tcp_max_syn_backlog",.data       = &init_net.ipv4.sysctl_max_syn_backlog,},
}

队列长度初始化

在函数tcp_sk_init中,初始化sysctl_max_syn_backlog,赋值为128与cnt的256分之一两个值之间的最大值。

static int __net_init tcp_sk_init(struct net *net)
{cnt = tcp_hashinfo.ehash_mask + 1;net->ipv4.sysctl_max_syn_backlog = max(128, cnt / 256);
}

其中cnt的值由tcp_hashinfo.ehash_mask决定,其在tcp_init函数中初始化。ehash_mask哈希掩码值为inet_ehash_bucket类型哈希表最大表项值减1,此处hash表的表项数值为2的幂值,其减一得到的掩码为一个全F的值。

void __init tcp_init(void)
{tcp_hashinfo.ehash =alloc_large_system_hash("TCP established",sizeof(struct inet_ehash_bucket),thash_entries,17, /* one slot per 128 KB of memory */0,NULL,&tcp_hashinfo.ehash_mask,0,thash_entries ? 0 : 512 * 1024);
}

需要注意的是tcp_hashinfo.ehash不仅包括已建立连接的TCP套接口,还包括除了在LISTEN状态的其它所有套接口。

/* This is for all connections with a full identity, no wildcards.* The 'e' prefix stands for Establish, but we really put all sockets* but LISTEN ones.*/
struct inet_ehash_bucket {struct hlist_nulls_head chain;
};

队列长度判断逻辑

参见tcp_conn_request函数中的判断条件,在SYN Cookies功能未开启,并且当前请求套接口的队列长度(inet_csk_reqsk_queue_len)已经超过最大SYN队列长度值(sysctl_max_syn_backlog)的3/4后,仅接收已知客户端的SYN连接(tcp_peer_is_proven)。意味着最后1/4的额度保留给了最近连接过的客户端,未连接过的客户端在到达最大值的3/4后,就已经不能接入了。

int tcp_conn_request(struct request_sock_ops *rsk_ops, const struct tcp_request_sock_ops *af_ops, struct sock *sk, struct sk_buff *skb)
{__u32 isn = TCP_SKB_CB(skb)->tcp_tw_isn;bool want_cookie = false;if (!want_cookie && !isn) {if (!net->ipv4.sysctl_tcp_syncookies &&(net->ipv4.sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) < (net->ipv4.sysctl_max_syn_backlog >> 2)) &&!tcp_peer_is_proven(req, dst)) {goto drop_and_release;}}
}

如果开启了TCP的SYN cookies功能并且检测到SYN flood行为,又或者SYN请求对应到一个之前处于TIME-WAIT状态的套接口,此两种情况不对新连接做SYN队列超限判断。

内核版本 Linux-4.15

TCP套接口的最大SYN队列长度相关推荐

  1. TCP套接口热迁移REPAIR模式

    要实现TCP套接口的热迁移,必须能够实现在迁移之前保存套接口的当前状态,迁移之后还原套接口的状态.Linux内核中为支持TCP套接口热迁移实现了REPAIR模式以及相关的操作.迁移流程如下,首先启用R ...

  2. TCP套接口的sk_backlog接收队列

    在接收到数据包之后,如果判断此套接口当前正被用户进程所使用,数据包将被保存到套接口结构的sk_backlog成员的head所定义的skb缓存列表中,tail指向链表的末尾,len变量记录了当前链表中所 ...

  3. TCP套接口的FIN_WAIT_2状态超时

    PROC文件tcp_fin_timeout默认为60秒,内核中相应的变量为init_net.ipv4.sysctl_tcp_fin_timeout,不过其以jiffies表示,默认值为TCP_FIN_ ...

  4. 网络编程学习笔记(TCP套接口选项)

    其套接口级别为IPPROTO_TCP TCP_KEEPALIVE: 指定TCP开始发送保持存活探测分节前以秒为单位的连接空闲时间.此选项在SO_KEEPALIVE套接口选项打开时才有效 TCP_MAX ...

  5. 网络编程学习笔记(基本套接口选项)

    SO_BROADCAST套接口选项: 此选项使能或禁止进程发送广播消息的能力.只有数据报套接口支持广播,并且还必须是在支持广播消息的网络上(例如以太网.令牌网).不能在一个点对点链路上进行广播. SO ...

  6. 第8章 基本UDP套接口编程

    TCP: 面向连接的,提供可靠的字节流. UDP: 无连接,不可靠的数据报协议. UDP: DNS 域名系统, NFS 网络文件系统, SNMP 简单网络管理协议. #include <sys/ ...

  7. 网络编程学习笔记(ICMPv6和IPv6套接口选项)

    ICMPv6套接口选项级别为IPPROTO_ICMPV6 ICMP6_FILTER: 获取和设置一个icmp6_filter结构,这指明256个可能的ICMPv6消息类型中哪一个传递给在原始套接口上的 ...

  8. 套接口学习(一)实现

    套接口这个概念最先由4.2BSD(1983)引入.如今已经成为一个通用的网络应用程序编程接口.受到全部操作系统的支持.套接口层位于应用程序和 协议栈之间,相应用程序屏蔽了与协议相关实现的详细细节. 通 ...

  9. UNIX网络编程读书笔记:套接口选项

    概述 有很多方法来获取和设置影响套接口的选项: getsockopt和setsockopt函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接口. ...

最新文章

  1. 非标准配置linux,剖析非标准波特率的设置和使用于Linux操作系统中
  2. 海量数据处理利器greenplum——初识
  3. 【PAT乙级】1048 数字加密 (20 分)
  4. c代码中 执行sh文件 带参数_创建含有$1参数的Bash脚本以及运行脚本的三种方法...
  5. 解决windows7您当前无权访问该文件夹的问题
  6. 数据库命名规范(转)
  7. python3.6基础知识_python的基础知识
  8. 设计模式之禅之六大设计原则-依赖倒置原则
  9. c语言spi测试代码,C语言程序SPI
  10. Kubernetes详解(二十五)——Deployment控制器扩容
  11. 全源最短路径 - floyd算法 - O(N ^ 3)
  12. HDU 2825 AC自动机+状压dp
  13. (bug更正)利用KVC和associative特性在NSObject中存储键值
  14. 问老板个事情,ta说“一会找你”,是敷衍我吗?
  15. Eclipse SVN:E200030:There are unfinished transactions detected
  16. android 解析程序包时出现问题
  17. 计算机页面里的坚果云删不了怎么回事,坚果云如何卸载?卸载坚果云的几种方法...
  18. AD17-SchDoc(原理图基础)
  19. Java Runtime.exec() hangs
  20. 一个35岁男人的自学编程之路

热门文章

  1. Vue引入iconfont失败 文件查找失败:‘./iconfont.eot?t=1606800914535
  2. Android后台限制
  3. 安全类系列资质认证,你都了解嘛?
  4. 专家:还早呢!有意识的人工智能兴起还需要几十年
  5. 解决VMWare低版本无法打开高版本创建的系统
  6. C语言 16进制字符串转16进制数组 函数示例
  7. 转载和积累系列 - HTTPS原理和HTTP缓存机制
  8. 20P19 Premiere 预设100种抽帧定格动画Pr预设模板片头
  9. 地铁票务管理系统_地铁车站票务管理
  10. 为什么增加解释变量的个数,R^2不会减小,该如何证明