tcp的半连接与完全连接队列
发布日期:2021-10-10 05:31:11 浏览次数:9 分类:技术文章

本文共 1458 字,大约阅读时间需要 4 分钟。

tcp解析-tcp的半连接与完全连接队列


简介

我们在开发的时候,有时候会发现,客户端的请求较慢,但是这个时候从服务的角度看每个请求的处理时间又很短,那么这是什么问题呢。下面就和大家分享下这方面的内容。

tcp队列与socket的关系

enter image description here

从这个图可以比较清楚的看出来,我们在写socket程序的时候,与连接队列的关系。

tcp的三次握手与四次挥手过程

enter image description here

server端的半连接队列(syn队列)

服务器维护一个半连接队列,在三次握手协议中,该队列为每个客户端的SYN包开设一个条目(服务端在接收到SYN包的时候,就已经创建了request_sock结构,存储在半连接队列中),该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包(会进行第二次握手发送SYN+ACK 的包加以确认,这个在稍后会讲解)。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。

SYN 队列长度
- 长度为 max(64,tcp_max_syn_backlog) ,
- tcp_max_syn_backlog值在/proc/sys/net/ipv4/tcp_max_syn_backlog下配置。

server端的完全连接队列(accpet队列)

当第三次握手时,当server接收到ACK 报之后, 会进入一个新的叫 accept 的队列,

accept队列长度
- 该队列的长度为 min(backlog, somaxconn)
- 默认情况下,somaxconn 的值为 128,表示最多有 129 的 ESTAB 的连接等待 accept(),查看地址/proc/sys/net/core/somaxconn
- backlog 的值则应该是由 int listen(int sockfd, int backlog) 中的第二个参数指定,listen 里面的 backlog 可以有我们的应用程序去定义的。

accept队列满的处理

  • 通过命令 ss -s可以查看,例如

    698399 times the listen queue of a socket overflowed

反复使用该命令

watch -n 1 "ss -s"

如果发现overflowed一直在增加,那么可以确定全连接队列是溢出了。

  • 溢出后的处理,查看

    # cat /proc/sys/net/ipv4/tcp_abort_on_overflow0

tcp_abort_on_overflow 为0表示如果三次握手第三步的时候全连接队列满了那么server扔掉client 发过来的ack(在server端认为连接还没建立起来)

为了证明客户端应用代码的异常跟全连接队列满有关系,我先把tcp_abort_on_overflow修改成 1,1表示第三步的时候如果全连接队列满了,server发送一个reset包给client,表示废掉这个握手过程和这个连接(本来在server端这个连接就还没建立起来)。

接着测试然后在客户端异常中可以看到很多connection reset by peer的错误,到此证明客户端错误是这个原因导致的。

总结

经过上面的分析,可以看出是全连接队列满了导致,这个时候有2个解决方案,如果backlog已经设置较大,看看客户端的并发是不是太大导致,这个时候需要水平扩展机器;如果设置过小,可以尝试调账backlog队列的长度进行尝试。

转载地址:https://blog.csdn.net/qq_22054285/article/details/79122058 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:白话机器学习-感知机
下一篇:白话机器学习-逻辑斯蒂回归-理论+实践篇

发表评论

最新留言

初次前来,多多关照!
[***.191.171.21]2022年12月08日 15时40分48秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

普通web项目转maven项目 2019-06-18 13:17:47
JdbcTemplate简单介绍 2019-06-18 13:17:46
Civil 3D CustomDraw .NET混合项目设置 2019-06-18 13:17:45
Shell脚步学习指南提点 2019-06-18 13:17:45
【转载】白话经典算法系列之六 快速排序 快速搞定 2019-06-18 13:17:44
Spring 常用注解 2019-06-18 13:17:44
Spark2.X集群运行模式 2019-06-18 13:17:43
javascript动画系列第二篇——磁性吸附 2019-06-18 13:17:43
MVC+EF 入门教程(四) 2019-06-18 13:17:42
java String补足 2019-06-18 13:17:41
笔记2:傻瓜式盗QQ程序 2019-06-18 13:17:41
ios开发之--令UITableView滚动到指定位置 2019-06-18 13:17:41
Chrome中使用showModalDialog无法接收返回值,解决方案 2019-06-18 13:17:40
很想回家,想念从前...... 2019-06-18 13:17:40
O-超大型LED显示屏 2019-06-18 13:17:39
学习一下HTTP 2019-06-18 13:17:39
脱离标准文档流(1)---浮动 2019-06-18 13:17:38
HDU 1222 Wolf and Rabbit(gcd) 2019-06-18 13:17:37
gprof 2019-06-18 13:17:37
ubuntu proxy 2019-06-18 13:17:36