前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于TCP overflowed、全连接、半连接队列

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

原创
作者头像
elontian田凌翔
修改2020-05-02 11:59:35
7.2K0
修改2020-05-02 11:59:35
举报
文章被收录于专栏:elon带你死磕技术

背景

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

netstat -as 信息截图
netstat -as 信息截图

探究全连接、半连接

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

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

TCP 三次握手过程
TCP 三次握手过程

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

TCP 三次握手过程详细版
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超时等待设置较短,就会引发异常

监控方法

代码语言:javascript
复制
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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 探究全连接、半连接
  • 监控方法
  • 优化方式
相关产品与服务
私有网络
私有网络(Virtual Private Cloud,VPC)是基于腾讯云构建的专属云上网络空间,为您在腾讯云上的资源提供网络服务,不同私有网络间完全逻辑隔离。作为您在云上的专属网络空间,您可以通过软件定义网络的方式管理您的私有网络 VPC,实现 IP 地址、子网、路由表、网络 ACL 、流日志等功能的配置管理。私有网络还支持多种方式连接 Internet,如弹性 IP 、NAT 网关等。同时,您也可以通过 VPN 连接或专线接入连通腾讯云与您本地的数据中心,灵活构建混合云。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档