专栏首页elon带你死磕技术关于TCP overflowed、全连接、半连接队列
原创

关于TCP overflowed、全连接、半连接队列

背景

最近遇到多台CVM中客户端访问服务器端超时的异常,当时查看了netstat -as信息,凭经验判断可能是tcp overflowed导致的。网卡队列满了,可能会造成子机网络包重传现象

netstat -as 信息截图

探究全连接、半连接

但是全连接和半连接是什么回事呢?我们一起探究探究

这个得从TCP三次握手说起,

TCP 三次握手过程

相信大家对三次握手都了然于胸,但是如果把这个过程放到linux环境下,结合linux内核的实现逻辑后是个什么形态呢?

TCP 三次握手过程详细版

这里有两个队列:

  • 半连接队列:SYN queue ,长度由tcp_max_syn_backlognet.core.somaxconn和 业务tcp调用listen(fd, backlog)的backlog三者最小值决定
  • 全连接队列:ACCEPT queue , 长度由net.core.somaxconnlisten(fd, backlog)的backlog两者最小值决定

三次握手过程详情:

  1. Client端通过connect()系统调用,向Sever发起连接。发送SYN报文,进入SYN_SEND状态。
  2. Server收到SYN包,
    1. 如果全连接队列未满,将连接信息放到半连接队列中,进入SYN_RECV状态(也被称为半连接状态)。然后答复SYN ACK报文给Client
    2. 如果全连接队列满了,那么丢弃当前请求
  3. Client收到SYN ACK后,进行最后确认,向Server发送ACK报文,进入ESTABLISHED状态
  4. Server收到Client的ACK报文,
    1. 如果全连接队列未满,那么从半连接队列拿出相关信息放入到全连接队列中,进入ESTABLISHED状态
    2. 如果全连接队列满了并且tcp_abort_on_overflow是0的话,server过一段时间再次发送SYN ACK给Client(即重走握手的第二步)。如果Client超时等待设置较短,就会引发异常

监控方法

netstat -as

如下图中所示信息:

全连接队列满了:xxx times the listen queue of a socket overflowed

半连接队列满了:xxx SYNs to LISTEN sockets dropped

可以通过监控数值是否增加,来判断是否存在异常

优化方式

调高

net.core.somaxconn

net.ipv4.tcp_max_syn_backlog

同时,提升 listen(fd, backlog) 的 backlog

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【玩转腾讯云】基础网络迁移VPC方案的“千层姿势”

    基础网络是腾讯云上所有用户的公共网络资源池(如下图右所示)。所有云服务器的内网 IP 地址都由腾讯云统一分配,无法自定义网段划分、IP 地址。

    elontian田凌翔
  • 为什么MySQL内存占用这么大? for InnoDB

    这是 Innodb 引擎最重要的缓存,也是提升查询性能的重要手段。一般是global共享内存中占用最大的部分。在进行 SQL 读和写的操作时,首先并不是对物理数...

    elontian田凌翔
  • 云服务器虚拟化技术介绍

    大家看到CVM的SLA能做99.95%以上的稳定性,甚至超越了承载的物理机的可靠性,靠的是什么原理?

    elontian田凌翔
  • 从nacos客户端的TIME_WAIT说起

    前段时间调研nacos,用来代替zookeeper当作dubbo的注册中心,使用的是nacos的1.1.4版本。还用了nacosSync,一款nacos提供的迁...

    龟仙老人
  • Kettle与Hadoop(三)连接Hadoop

    Kettle可以与Hadoop协同工作。让我们从简单的开始,本文介绍如何配置Kettle访问Hadoop集群(HDFS、MapReduce、Zookeeper、...

    用户1148526
  • python爬取新浪股票数据—绘图【原创分享】

    逆向小白
  • Python实现十大经典排序算法

    由于数组小,且范围在1到10之间,这其实对于计数排序这种非比较类算法是比较友好的,因为没有多大的空间压力,因此计数排序速度第一很容易理解,而之所以选择、插入比希...

    HoLoong
  • MyBatis 二级缓存详解

    我们在上一篇文章介绍了 MyBatis 的一级缓存的作用,如何开启,一级缓存的本质是什么,一级缓存失效的原因是什么?MyBatis 只有一级缓存吗?来找找答案吧...

    cxuan
  • MyBatis 二级缓存详解

    我们在上一篇文章介绍了 MyBatis 的一级缓存的作用,如何开启,一级缓存的本质是什么,一级缓存失效的原因是什么?MyBatis 只有一级缓存吗?来找找答案吧...

    纯洁的微笑
  • Hiberante知识点梳理

    Hibernate简介 Hibernat是一个ORM(关系映射)框架,对JDBC访问数据库的操作进行了简化,并且将数据库表中的字段和关系映射为对象,简化了对数据...

    李家酒馆酒保

扫码关注云+社区

领取腾讯云代金券