重学TCP协议(9) 半连接队列、全连接队列

1. 半连接队列、全连接队列基本概念

image.png

  1. 三次握手中,在第一步server收到client的syn后,把相关信息放到半连接队列中,同时回复syn+ack给client(第二步),同时开启一个定时器,如果超时还未收到 ACK 会进行 SYN+ACK 的重传,重传的次数由 tcp_synack_retries 值确定。在 CentOS 上这个值等于 5。;
  2. 第三步的时候server收到client的ack,如果这时全连接队列没满,那么从半连接队列拿出相关信息放入到全连接队列中,否则按tcp_abort_on_overflow指示的执行。

1.1 tcp_abort_on_overflow

  • tcp_abort_on_overflow 为 0 表示三次握手最后一步全连接队列满以后 server 会丢掉 client 发过来的 ACK,服务端随后会进行重传 SYN+ACK。
  • tcp_abort_on_overflow 为 1 表示全连接队列满以后服务端直接发送 RST 给客户端。

1.2 ss 命令

ss 命令可以查看全连接队列的大小和当前等待 accept 的连接个数,执行 ss -lnt 即可

ss -lnt | grep :9090
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     51     50           *:9090                     *:*

Recv-Q 表示 accept 队列排队的连接个数,Send-Q 表示全连接队列(也就是 accept 队列)的总大小。

2. 半连接队列

2.1 半连接队列的长度

半连接队列的大小由3个值决定:

  • 用户层 listen 传入的backlog
  • 系统变量 net.ipv4.tcp_max_syn_backlog,默认值为 128
  • 系统变量 net.core.somaxconn,默认值为 128

2.2 半连接队列长度的计算过程

  1. 如果用户传入的 backlog 值大于系统变量 net.core.somaxconn 的值,用户设置的 backlog 不会生效,使用系统变量值,默认为 128。

  2. 将上一步计算的backlog值穿给nr_table_entries,sysctl_max_syn_backlog 为 net.ipv4.tcp_max_syn_backlog 的值

int reqsk_queue_alloc(struct request_sock_queue *queue,unsigned int nr_table_entries)
{nr_table_entries = min_t(u32, nr_table_entries, sysctl_max_syn_backlog);nr_table_entries = max_t(u32, nr_table_entries, 8);nr_table_entries = roundup_pow_of_two(nr_table_entries + 1);for (lopt->max_qlen_log = 3;(1 << lopt->max_qlen_log) < nr_table_entries;lopt->max_qlen_log++);
}
  • 在 nr_table_entries 与 sysctl_max_syn_backlog 两者中的较小值,赋值给 nr_table_entries(因为sysctl_max_syn_backlog默认是128,如果没有修改,产生的最大值就只能是128)
  • 在 nr_table_entries 和 8 取较大值,赋值给 nr_table_entries(最小只能是8)
  • nr_table_entries + 1 向上取求最接近的最大 2 的指数次幂(保证是2的幂次)
  • 通过 for 循环找不大于 nr_table_entries 最接近的 2 的对数值

3.全连接队列

全连接队列」包含了服务端所有完成了三次握手,但是还未被应用调用 accept 取走的连接队列。此时的 socket 处于 ESTABLISHED 状态。每次应用调用 accept() 函数会移除队列头的连接。如果队列为空,accept() 通常会阻塞。全连接队列也被称为 Accept 队列。

3.1 全连接队列的长度

全连接队列的大小由3个值决定:

  • 用户层 listen 传入的backlog
  • 系统变量 net.core.somaxconn,默认值为 128

3.2 全连接队列长度的计算过程

全连接队列的大小是 listen 传入的 backlog 和 somaxconn 中的较小值

3.3 全连接队列溢出的情况

image.png

  • 如上图,150166号包是三次握手中的第三步client发送ack给server,然后150167号包中client发送了一个长度为816的包给server。

  • 因为在这个时候client认为连接建立成功(因为已经完成三次握手了),但是server上这个连接实际没有ready(因为全连接队列已经满了),所以server直接丢掉client发来的ACK包,并且一段时间后,server认为自己第二次握手的syn+ack包丢包了,因此就重发syn+ack包(SYN+ACK重传的次数是由操作系统的一个文件决定的/proc/sys/net/ipv4/tcp_synack_retries

  • 一段时间后client又收到了syn+ack包,认为第三次握手的ack丢包了,然后重传这816个字节的ack包。一直到超时,client主动发fin包断开该连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分类预测回归预测_我们应该如何汇总分类预测?

分类预测回归预测If you are reading this, then you probably tried to predict who will survive the Titanic shipwreck. This Kaggle competition is a canonical example of machine learning, and a right of passage for any aspiring data scientist. What if instead …

【CZY选讲·Yjq的棺材】

题目描述 Yjq想要将一个长为宽为的矩形棺材&#xff08;棺材表面绝对光滑&#xff0c;所以棺材可以任意的滑动&#xff09;拖过一个L型墓道。 如图所示&#xff0c;L型墓道两个走廊的宽度分别是和&#xff0c;呈90&#xff0c;并且走廊的长度远大于。 现在Hja想知道对于给…

“机器换人”之潮涌向珠三角,蓝领工人将何去何从

企业表示很无奈&#xff0c;由于生产需要&#xff0c;并非刻意换人。 随着传统产业向更加现代化、自动化的新产业转型&#xff0c;“机器换人”似乎是历史上不可逆转的潮流。 据报道&#xff0c;珠三角经济圈所在的广东省要从传统的制造大省向制造强省转变&#xff0c;企业转型…

slack通知本地服务器_通过构建自己的Slack App学习无服务器

slack通知本地服务器Serverless architecture is the industrys latest buzzword and many of the largest tech companies have begun to embrace it. 无服务器架构是业界最新的流行语&#xff0c;许多大型科技公司已开始采用它。 In this article, well learn what it is an…

深入理解InnoDB(6)—独立表空间

InnoDB的表空间 表空间可以看做是InnoDB存储引擎逻辑结构的最高层 &#xff0c;所有的数据都是存放在表空间中。 1. Extent 对于16KB的页来说&#xff0c;连续的64个页就是一个区&#xff0c;也就是说一个区默认占用1MB空间大小。 每256个区被划分成一组,第一组的前3个页面是…

神经网络推理_分析神经网络推理性能的新工具

神经网络推理Measuring the inference time of a trained deep neural model on different hardware devices is a critical task when making deployment decisions. Should you deploy your inference on 8 Nvidia V100s, on 12 P100s, or perhaps you can use 64 CPU cores?…

Eclipse断点调试

1.1 Eclipse断点调试概述Eclipse的断点调试可以查看程序的执行流程和解决程序中的bug1.2 Eclipse断点调试常用操作:A:什么是断点&#xff1a;就是一个标记&#xff0c;从哪里开始。B:如何设置断点&#xff1a;你想看哪里的程序&#xff0c;你就在那个有效程序的左边双击即可。C…

react部署在node_如何在没有命令行的情况下在3分钟内将React + Node应用程序部署到Heroku

react部署在nodeIn this tutorial we will be doing a basic React Node app deploy to Heroku. 在本教程中&#xff0c;我们将进行基本的React Node应用程序部署到Heroku。 There are a lot of tutorials that do this only using the command line, so to change things u…

深入理解InnoDB(7)—系统表空间

系统表空间 可以看到&#xff0c;系统表空间和独立表空间的前三个页面&#xff08;页号分别为0、1、2&#xff0c;类型分别是FSP_HDR、IBUF_BITMAP、INODE&#xff09;的类型是一致的&#xff0c;只是页号为3&#xff5e;7的页面是系统表空间特有的 页号3 SYS: Insert Buffer …

CodeForces - 869B The Eternal Immortality

题意&#xff1a;已知a,b&#xff0c;求的最后一位。 分析&#xff1a; 1、若b-a>5&#xff0c;则尾数一定为0&#xff0c;因为连续5个数的尾数要么同时包括一个5和一个偶数&#xff0c;要么包括一个0。 2、若b-a<5&#xff0c;直接暴力求即可。 #include<cstdio>…

如何在24行JavaScript中实现Redux

90% convention, 10% library. 90&#xff05;的惯例&#xff0c;10&#xff05;的图书馆。 Redux is among the most important JavaScript libraries ever created. Inspired by prior art like Flux and Elm, Redux put JavaScript functional programming on the map by i…

卡方检验 原理_什么是卡方检验及其工作原理?

卡方检验 原理As a data science engineer, it’s imperative that the sample data set which you pick from the data is reliable, clean, and well tested for its usability in machine learning model building.作为数据科学工程师&#xff0c;当务之急是从数据中挑选出的…

Web UI 设计(网页设计)命名规范

Web UI 设计命名规范 一.网站设计及基本框架结构: 1. Container“container“ 就是将页面中的所有元素包在一起的部分&#xff0c;这部分还可以命名为: “wrapper“, “wrap“, “page“.2. Header“header” 是网站页面的头部区域&#xff0c;一般来讲&#xff0c;它包含…

leetcode 1486. 数组异或操作(位运算)

给你两个整数&#xff0c;n 和 start 。 数组 nums 定义为&#xff1a;nums[i] start 2*i&#xff08;下标从 0 开始&#xff09;且 n nums.length 。 请返回 nums 中所有元素按位异或&#xff08;XOR&#xff09;后得到的结果。 示例 1&#xff1a; 输入&#xff1a;n …

27个机器学习图表翻译_使用机器学习的信息图表信息组织

27个机器学习图表翻译Infographics are crucial for presenting information in a more digestible fashion to the audience. With their usage being expanding to many (if not all) professions like journalism, science, and research, advertisements, business, the re…

在HTML中使用javascript (js高级程序设计)

在HTML中使用javascript 刚开始入门的时候觉得关于应用以及在html中只用javascript很简单&#xff0c;不需要进行学习。我又开始重温了一下红宝书&#xff0c;觉得还是有必要进行学习的。这是一个笔记&#xff01; script 元素插入有多种方式 属性使用方式async延迟脚本&#x…

大数据新手之路二:安装Flume

Ubuntu16.04Flume1.8.0 1.下载apache-flume-1.8.0-bin.tar.gz http://flume.apache.org/download.html 2.解压到/usr/local/flume中 3.设置配置文件/etc/profile文件&#xff0c;增加flume的路径 ①vi /etc/profile export FLUME_HOME/usr/local/flume export PATH$PATH:$FLUME…

leetcode 1723. 完成所有工作的最短时间(二分+剪枝+回溯)

给你一个整数数组 jobs &#xff0c;其中 jobs[i] 是完成第 i 项工作要花费的时间。 请你将这些工作分配给 k 位工人。所有工作都应该分配给工人&#xff0c;且每项工作只能分配给一位工人。工人的 工作时间 是完成分配给他们的所有工作花费时间的总和。请你设计一套最佳的工作…

异步解耦_如何使用异步生成器解耦业务逻辑

异步解耦Async generators are new in JavaScript. They are a remarkable extension. They provide a simple but very powerful tool for splitting programs into smaller parts, making sources easier to write, read, maintain and test.异步生成器是JavaScript中的新增功…

函数的定义,语法,二维数组,几个练习题

1、请将’A’,’B’,’C’存入数组&#xff0c;然后再输出2、请将”我” “爱” “你”存入数组&#xff0c;然后正着和反着输出3、输入10个整数存入数组&#xff0c;然后复制到b数组中输出4、定义一个长度为10的数组&#xff0c;循环输入10个整数。 然后将输入一个整数&#x…