TCP backlog在Linux下是如何工作的

TCP backlog工作机制 这行代码的目的是把 socket 设置为监听状态(LISTEN),并传入一个 backlog 参数,用来告诉内核:“我能接受这么多排队的连接请求”。但这个 backlog 参数并不像字面那样简单。在 Linux 中,它不是连接请求的上限本身,而是作用于一个更复杂的内核结构——两个连接队列。在高并发系统中,“连接丢失”往往不是带宽或 CPU 不够,而是 TCP 握手路径中的一个被忽视的细节。理解 backlog 实际涉及的两个队列、调优系统参数、监控连接状态,是保障服务稳定性的关键。 阅读详情

原文链接: http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html

当一个应用使用listen syscall将一个socket变成LISTEN状态时,它需要为该socket指定一个backlog值。这个backlog值通常被认为是接收传入连接的队列的长度限制。

TCP state diagram

 

因为TCP采用三次握手,一个连接在到达可以被accept syscall返回的ESTABLISHED状态之前,还会经过一个中间状态,称为SYN RECEIVED(见上图)。所以TCP/IP协议栈可以有2种方式去实现LISTEN状态的socket的backlog队列。

  1. 一种实现是使用单独的队列,队列的长度由listen syscall的backlog参数决定。当收到一个SYN包的时候,TCP返回一个SYN/ACK包,并将连接放入队列中。当收到对应的ACK包时,连接状态改为ESTABLISHED,并可以转交给应用使用。这意味着这个队列中可能包含两种状态的连接:SYN RECEIVED和ESTABLISHED。只有处于后一种状态的连接才能被accept syscall返回给应用。

  2. 另一种实现是使用两个队列,一个SYN队列(或者叫未完成连接队列)和一个accept队列(或者叫已完成连接队列)。处于SYN RECEIVED状态的连接会被加入到SYN队列,并在他们的状态变为ESTABLISHED时(即收到三次握手中的最后一个ACK包的时候)移动到accept队列中。就像系统调用的名称所表示的那样,accept调用只需简单的消费accept队列中的连接就行了。在这种实现中,listen syscall的backlog参数决定了accept队列的大小。

历史上,BSD系的TCP实现使用了第一种方式。这种方式隐含的意义是当backlog满了之后,系统不会再回应SYN/ACK包给SYN了。通常情况下TCP的实现会简单得丢弃SYN包(而不是回复一个RST包),这样客户端就会进行重试。就如W.Richard Stevens的经典著作《TCP/IP详解》14.5节 listen Backlog里面写的一样。

值得注意的是Stevens解释了BSD的实现实际上是用了两个队列的,但他们表现得像一个由backlog参数决定的(但不一定严格相等)具有固定大小的单一队列。也就是说BSD实现逻辑上采用了第一种方式:

队列的长度限制为未完成连接队列的条目数加上已完成连接队列的条目数的和

在Linux中,情况就不一样了,就如在listen syscall的man page中提到的:

TCP socket的backlog参数的行为在Linux2.2中有所改变。现在它指的是已完成连接队列的长度,而不再是未完成连接队列的长度了。未完成连接队列的长度可以用/proc/sys/net/ipv4/tcp_max_syn_backlog指定

这意味着目前的Linux版本采用了两个单独队列的方式:一个长度由系统级别设置指定的SYN队列和一个长度由应用指定的accept队列。

一个有意思的问题是,当accept队列满了,如果有连接需要从SYN队列移到accept队列(也就是当收到三次握手的最后一个ACK包的时候),这种实现方式会怎么做呢? Linux代码中,这类情况由net/ipv4/tcp_minisocks.c里的tcp_check_req函数处理,相关代码为:

       child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb, req, NULL);
        if (child == NULL)
                goto listen_overflow;

对IPv4来说,第一行代码会调用net/ipv4/tcp_ipv4.c中的tcp_v4_syn_recv_sock函数,代码如下:

        if (sk_acceptq_is_full(sk))
                goto exit_overflow;

在这里我们可以看到对已接受队列的检查,exit_overflow后续的代码会执行一些清理工作、更新/proc/net/netstat中的ListenOverflows和ListenDrops数据、并返回NULL。然后会触发tcp_check_req中listen_overflow的执行:

listen_overflow:
        if (!sysctl_tcp_abort_on_overflow) {
                inet_rsk(req)->acked = 1;
                return NULL;
        }

这意味着除非/proc/sys/net/ipv4/tcp_abort_on_overflow设置成1(在这种情况下,后续的代码会发送一个RST包),这种实现基本上。。。啥都没做!

总结一下,如果Linux中的TCP实现收到了ACK包,但accept队列已经满了的话,它会简单的忽略这个包。这种做法初看会觉得有点奇怪,但记住SYN RECEIVED状态是有一个定时器的:如果ACK包没有收到(或者像这种场景下被忽略了),TCP实现会重发SYN/ACK包(重试次数由/proc/sys/net/ipv4/tcp_synack_retries决定,并且使用指数退避算法)。

下面是一个客户端尝试连接(并发送数据)到一个已经达到最大backlog值的socket的时候的包跟踪日志,它可以证实上述的行为:

  0.000  127.0.0.1 -> 127.0.0.1  TCP 74 53302 > 9999 [SYN] Seq=0 Len=0
  0.000  127.0.0.1 -> 127.0.0.1  TCP 74 9999 > 53302 [SYN, ACK] Seq=0 Ack=1 Len=0
  0.000  127.0.0.1 -> 127.0.0.1  TCP 66 53302 > 9999 [ACK] Seq=1 Ack=1 Len=0
  0.000  127.0.0.1 -> 127.0.0.1  TCP 71 53302 > 9999 [PSH, ACK] Seq=1 Ack=1 Len=5
  0.207  127.0.0.1 -> 127.0.0.1  TCP 71 [TCP Retransmission] 53302 > 9999 [PSH, ACK] Seq=1 Ack=1 Len=5
  0.623  127.0.0.1 -> 127.0.0.1  TCP 71 [TCP Retransmission] 53302 > 9999 [PSH, ACK] Seq=1 Ack=1 Len=5
  1.199  127.0.0.1 -> 127.0.0.1  TCP 74 9999 > 53302 [SYN, ACK] Seq=0 Ack=1 Len=0
  1.199  127.0.0.1 -> 127.0.0.1  TCP 66 [TCP Dup ACK 6#1] 53302 > 9999 [ACK] Seq=6 Ack=1 Len=0
  1.455  127.0.0.1 -> 127.0.0.1  TCP 71 [TCP Retransmission] 53302 > 9999 [PSH, ACK] Seq=1 Ack=1 Len=5
  3.123  127.0.0.1 -> 127.0.0.1  TCP 71 [TCP Retransmission] 53302 > 9999 [PSH, ACK] Seq=1 Ack=1 Len=5
  3.399  127.0.0.1 -> 127.0.0.1  TCP 74 9999 > 53302 [SYN, ACK] Seq=0 Ack=1 Len=0
  3.399  127.0.0.1 -> 127.0.0.1  TCP 66 [TCP Dup ACK 10#1] 53302 > 9999 [ACK] Seq=6 Ack=1 Len=0
  6.459  127.0.0.1 -> 127.0.0.1  TCP 71 [TCP Retransmission] 53302 > 9999 [PSH, ACK] Seq=1 Ack=1 Len=5
  7.599  127.0.0.1 -> 127.0.0.1  TCP 74 9999 > 53302 [SYN, ACK] Seq=0 Ack=1 Len=0
  7.599  127.0.0.1 -> 127.0.0.1  TCP 66 [TCP Dup ACK 13#1] 53302 > 9999 [ACK] Seq=6 Ack=1 Len=0
 13.131  127.0.0.1 -> 127.0.0.1  TCP 71 [TCP Retransmission] 53302 > 9999 [PSH, ACK] Seq=1 Ack=1 Len=5
 15.599  127.0.0.1 -> 127.0.0.1  TCP 74 9999 > 53302 [SYN, ACK] Seq=0 Ack=1 Len=0
 15.599  127.0.0.1 -> 127.0.0.1  TCP 66 [TCP Dup ACK 16#1] 53302 > 9999 [ACK] Seq=6 Ack=1 Len=0
 26.491  127.0.0.1 -> 127.0.0.1  TCP 71 [TCP Retransmission] 53302 > 9999 [PSH, ACK] Seq=1 Ack=1 Len=5
 31.599  127.0.0.1 -> 127.0.0.1  TCP 74 9999 > 53302 [SYN, ACK] Seq=0 Ack=1 Len=0
 31.599  127.0.0.1 -> 127.0.0.1  TCP 66 [TCP Dup ACK 19#1] 53302 > 9999 [ACK] Seq=6 Ack=1 Len=0
 53.179  127.0.0.1 -> 127.0.0.1  TCP 71 [TCP Retransmission] 53302 > 9999 [PSH, ACK] Seq=1 Ack=1 Len=5
106.491  127.0.0.1 -> 127.0.0.1  TCP 71 [TCP Retransmission] 53302 > 9999 [PSH, ACK] Seq=1 Ack=1 Len=5
106.491  127.0.0.1 -> 127.0.0.1  TCP 54 9999 > 53302 [RST] Seq=1 Len=0

由于客户端的TCP实现收到了多个 SYN/ACK包,它会认为ACK包已经丢失了,然后重发ACK(参见日志中的TCP Dup ACK部分)。如果服务端应用在SYN/ACK重试的最大次数内减小了backlog队列的大小(消费了已完成连接队列中的一个或多个连接),TCP最终能处理某一个重发的ACK,把连接从SYN RECEIVED变为ESTABLISHED状态,并移动到accept队列。否则的话,客户端最终会发送一个RST包(如上例所示)。

上面的日志还显示了另外一个有趣的行为。从客户端的角度来看,当收到第一个SYN/ACK时,连接会处于ESTABLISHED状态。如果它发送数据的话(不需要先等待服务端的数据的时候),数据也会被重传。好消息是TCP 慢开始 特性会限制在这个阶段传输的数据段的数量。

另一方面来说,如果客户端需要先等待服务端发来的数据而服务端又无法减少backlog,那最终的结果就是客户端连接处于ESTABLISHED状态,但在服务端认为连接处于CLOSED状态。这使我们得到了一个半开的连接!

这里还有一点我们没有讨论到的。listen的man page中说每个SYN包会产生SYN队列中的一个新的连接(除非队列已经满了)。但其实并不完全是这样。原因在net/ipv4/tcp_ipv4.c的tcp_v4_conn_request函数中(该函数用来处理SYN包),代码如下:

        /* Accept backlog is full. If we have already queued enough
         * of warm entries in syn queue, drop request. It is better than
         * clogging syn queue with openreqs with exponentially increasing
         * timeout.
         */
        if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) {
                NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
                goto drop;
        }

从代码中可以看出如果accept队列已经满了,内核会应用一个接受SYN包的速率限制。如果收到了太多的SYN包,他们中的一些会被丢弃。在这种情况下,需要由客户端重发SYN包,这就和BSD系实现的行为方式类似了

作为总结,让我们来看看为什么Linux的设计是优于传统的BSD实现的。Stevens提出了以下有趣的观点:

到达backlog的设定值既有可能因为已完成连接队列的累积(也就是说服务端进程或者主机太忙了,导致他们调用accept的速度赶不上连接进入accept队列的速度),也有可能是因为未完成连接队列的累积导致。后一种情况在HTTP服务器中经常会遇到,因为每次客户端的调用会产生一个的SYN,进而占用未完成连接队列中的一个条目,当服务端处理与响应的速度比请求达到的速度慢的时候,未连接队列就会累积起来了。

已完成连接队列基本总是空的,因为当一个条目放到这个队列的时候,服务器对accept的调用就返回了,然后服务器就会从队列中拿走这个连接

Stevens的建议是简单地增加backlog的值来解决这个场景。但问题是这样做需要应用在调整backlog时不仅仅考虑他如何处理新建的连接,还要把诸如往返时间之类的数据流量的特性考虑进去。Linux的实现有效的隔离了这两个关注点:应用只需要负责调整backlog参数以保证它能足够快速的调用accept(避免已完成连接队列的累积)。而操作系统管理员可以根据流量特性调整/proc/sys/net/ipv4/tcp_max_syn_backlog参数。

Tomcat优化:从Linux内核源码层面解析TCP Backlog与Java 在进行Tomcat服务器的调优过程中,理解Linux内核源码层面的TCP Backlog与Java之间的关系非常重要。TCP Backlog是指内核中用于存放未完成的连接请求的队列,而Java是Tomcat服务器的核心编程语言。同时,通过调整线程池大小、合理使用连接池和避免频繁的对象创建和销毁等Java代码优化技巧,可以进一步提升Tomcat服务器的性能和稳定性。除了调整TCP Backlog队列的大小,还可以调整其他与TCP连接相关的参数来优化Tomcat服务器的性能。文件来永久更改该参数的值。 阅读详情

相关推荐

abap中使用Screen painter为普通屏幕创建单选按钮组radiobutton组的过程

选择屏幕中,创建radiobutton组直接使用代码实现,如下所示 SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-001. PARAMETERS R1 RADIOBUTTON GROUP GR1. PARAMETERS R2 RADIOBUTTON GROUP GR1. PARAMETERS R3 RADIOBUTTON GR

charliefromkansas的博客 8302

TCP参数之backlog

运维同学的一个问题直接问的我蒙圈:请问你们dubbo的backlog参数设置的是多少? 我是谁,我在哪,我在干什么? backlog参数含义 backlog参数为socket套接字监听端口时,内核为该套接字分配的一个队列大小,在服务端还没有来得及处理请求时暂时缓存请求所用的队列。如果队列已经被客户端socket占满了,还有新的连接过来,那么ServerSocket会拒绝新的连接。backlog提供了容量限制功能,避免太多的客户端socket占用太多服务器资源。 注意如果连接处于休眠状态即没有数据传输是不属于

阿呆的专栏 4284

WPF实战:利用Live Charts实现高性能动态曲线可视化

本文详细介绍了如何在WPF中使用Live Charts实现高性能动态曲线可视化,特别适用于工业监控和金融分析等实时数据场景。通过增量渲染、内存复用和硬件加速等核心技术,Live Charts能够高效处理高频数据更新,显著提升图表流畅度。文章提供了从基础实现到工业级优化的完整解决方案,帮助开发者应对各种性能挑战。

weixin_29189373的博客 407

TCP-Backlog

TCP backlog 队列设计初衷是为了缓存服务器无法立即处理的握手请求先回顾一下三次握手的过程: 图片来源于网络,侵删 从服务器的视角来看,需要接受两个数据包(首个SYN,最后一个ACK)TCP backlog创建了两个队列来负责缓存已经收到的首个SYN和已经握手完成待应用层接收的连接负责缓存SYN的队列叫SYN QUEUE负责缓存已完成连接叫ACCEPT QUEUE 举例子来说明:如果坐火车来说明的话,在春运时,火车站人满为患,进入火车站分为两步: 进入候车室(SYN QUEUE) 进入

chuixue24的博客 1192

东华大学2020考研计算机OJ题目解答分享——进阶篇(4)

4 一个月的天数 作者: Turbo时间限制: 1S章节: 分支结构 问题描述 : 输入年和月,输出该月有几天。 输入说明 : 输入两个整数,中间以空格分隔,第一个整数表示年,第二个整数表示月。 输出说明 : 输出该年该月的天数,输出时,行首与行尾均无空格,仅输出一个整数。 输入范例 : 2000 2 输出范例 : 29 解答思路: 闰年和质数出题一样频繁,简单必会 AC代码 #include...

qq_38344326的博客 472

从零到一:TI AWR1843 Boost EVM与DCA1000 EVM的ADC数据采集实战指南

本文详细介绍了TI AWR1843 Boost EVM与DCA1000 EVM的ADC数据采集实战指南,涵盖硬件连接、软件配置、固件烧录、雷达参数设置及数据处理等关键步骤。通过MATLAB等工具,开发者可高效实现毫米波雷达数据采集,适用于自动驾驶、工业检测等领域。

weixin_29001327的博客 967

TCP 的backlog详解及半连接队列和全连接队列

注:本文分析基于3.10.107内核版本 问题1:backlog是什么? 问题2:backlog怎么设置? 问题3:backlog怎么影响TCP的建链? 问题4:如何验证backlog的设置? 以上就是我的疑问,因此我开始去从代码中了解backlog。 man手册 首先,要知道这个backlog是listen()函数里的第二个参数。 int listen(int sockf...

Blue summer的博客 7047

告别Keil!用VSCode+PlatformIO玩转STC单片机(附自动下载配置)

本文详细介绍了如何从Keil迁移到VSCode+PlatformIO进行STC单片机开发,包括环境搭建、自动下载配置等实用技巧。通过对比传统IDE与现代工具链的差异,展示了VSCode+PlatformIO在代码编辑体验、跨平台支持和开发效率上的优势,帮助开发者实现更流畅的STC单片机开发流程。

weixin_27252001的博客 458

TCP backlog的解读

TCP backlog参数 文章目录TCP backlog参数介绍底层syns queueaccept queue应用层解决方案 介绍 在实际生产环境中使用netty的过程中,遇到了一个奇怪的坑,就是backlog参数,明明设置得很大了,但是还是不生效,使得server在TCP连接数上来的时候,就会发送ECONNREFUSED给client以示拒绝。 这触及到我的知识盲区,因此我决定加以探索并且...

rekingman的博客 3005

C# ScottPlot 5.0 WinForms 十字光标示例:轻松实现动态数值显示,你学会了吗?

ScottPlot是一个免费、开源的.NET交互式绘图库,能够轻松地实现大型数据集的交互式显示。它支持多种图表类型,如折线图、柱状图、饼图、散点图等。ScottPlot的性能非常出色,即使是处理千万级别的数据也游刃有余。

java专栏 2218

使用cutoff包基于最小p值法方法计算最佳截断值(基于LIRI基因数据集) R语言

这个方法在生物学研究中具有重要的意义,能够帮助我们从大规模基因表达数据中准确地找到差异显著的基因。在上述代码中,calculate_p_values函数是一个自定义函数,用于计算差异表达基因的p值。在本文中,我们将介绍如何使用R语言的cutoff包来基于最小p值法方法计算最佳的截断值,以便筛选出差异显著的基因。通过以上步骤,我们成功地使用cutoff包基于最小p值法方法计算了最佳的截断值,并筛选出了差异显著的基因。最后,我们可以根据得到的最佳截断值将基因表达数据集进行筛选,提取出差异显著的基因。

ByteKnight的博客 1291

TCP backlog解析与实战

前言: 针对TCP连接三次握手,我们都已经非常熟悉了。 那么三次握手之后是不是就一定会被服务端处理请求了呢? 可能我们不太清楚操作系统的具体做法,但是凭感觉我们会有两方面的思考: 1)如果大量的客户端连接发送SYN请求,服务器根本无力处置这么多SYN请求,那么怎么做限流操作来避免自己被冲垮呢? 2)三次握手成功之后,服务端处理程序一直在忙于之前的连接的业务处理,长时间没有感知到新的连接到了,那么对于这个客户端发来的请求应该怎么操作呢? 本文就通过对TCP backlog来回答下上述两个问题。

恐龙弟旺仔的博客 3131

提示词驱动的多智能体协作系统

《提示词驱动的多智能体协作系统》 关键词:人工智能、多智能体系统、协作机制、提示词驱动、系统设计与应用 摘要:本文深入探讨提示词驱动的多智能体协作系统,首先介绍其背景和核心概念,然后详细分析多智能体系统的基本原理和提示词驱动的协作机制,最

AI天才研究院 849

【翻译】TCP backlog在Linux中的工作原理

原文How TCP backlog works in Linux水平有限,难免有错,欢迎指出!以下为翻译: 当应用程序通过系统调用listen将一个套接字(socket)置为LISTEN状态时,需要为该套接字指定一个backlog参数,该参数通常被描述为用来限制进来的连接队列长度(queue of incoming connections)。 由于TCP协议的三次握手机制,一个进来的套接字...

weixin_30578677的博客 159

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

再理解tcp backlog

from:点击打开链接            在linux 2.2以前,backlog大小包括了半连接状态和全连接状态两种队列大小。linux 2.2以后,分离为两个backlog来分别限制半连接SYN_RCVD状态的未完成连接队列大小跟全连接ESTABLISHED状态的已完成连接队列大小。互联网上常见的TCP SYN FLOOD恶意DOS攻击方式就是用/proc/sys/net/ipv4/tcp...

lclwjl的专栏 824

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

浅谈tcp socket的backlog参数

最近看netty源码碰到ChannelOption.SO_BACKLOG参数,通过跟踪代码发现其实是用于设置底层tcp socket的backlog参数,由于不了解这个参数,有必要彻底的理解一下。 TCP三次握手底层实现 backlog参数主要用于底层方法int listen(int sockfd, int backlog), 在解释backlog参数之前,我们先了解下tcp在内核的请求过程,其实就是tcp的三次握手: 1、client发送SYN到server,将状态修改为SYN_SEND,如...

大JAVA解决方案 480

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深入理解Linux TCP backlog

在linux 2.2以前,backlog大小包括了半连接状态和全连接状态两种队列大小。linux 2.2以后,分离为两个backlog来分别限制半连接SYN_RCVD状态的未完成连接队列大小跟全连接ESTABLISHED状态的已完成连接队列大小。互联网上常见的TCP SYN FLOOD恶意DOS攻击方式就是用/proc/sys/net/ipv4/tcp_max_syn_backlog来控制的,可参见《TCP洪水攻击(SYN Flood)的诊断和处理》。 在使用listen函数时,内核会根据传入参数的bac

bujidexinq的专栏 772

listen函数的第二个参数_浅谈tcp socket的backlog参数

最近看netty源码碰到ChannelOption.SO_BACKLOG参数,通过跟踪代码发现其实是用于设置底层tcp socket的backlog参数,由于不了解这个参数,有必要彻底的理解一下。底层backlog参数主要用于底层方法int listen(int sockfd, int backlog), 在解释backlog参数之前,我们先了解下tcp在内核的请求过程,其实就是tcp的三次握手:...

weixin_39928667的博客 124

Linux中,Tomcat 怎么承载高并发(深入Tcp参数 backlog)

一、前言 这两天看tomcat,查阅 tomcat 怎么承载高并发时,看到了backlog参数。我们知道,服务器端一般使用mq来减轻高并发下的洪峰冲击,将暂时不能处理的请求放入队列,后续再慢慢处理。其实操作系统已经帮我们做了一些类似的东西了,这个东西就是backlog。服务端一般通过 accept 调用,去获取socket。但是假设我们的程序处理不过来(比如因为程序bug,或者设计问题,没能及时...

weixin_30344795的博客 518

linux backlog详解

本文转自:http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html When an application puts a socket into LISTEN state using the listen syscall, it needs to specify a backlog for that socket. The b...

nice_wen的博客 997

How TCP backlog works in Linux

原文地址 http://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html When an application puts a socket into LISTEN state using the listen syscall, it needs to specify a backlog for that socke...

zhouguoqionghai的博客 451

[TCP/IP] TCP在listen时的参数backlog的意义

linux内核中会维护两个队列:  1)未完成队列:接收到一个SYN建立连接请求,处于SYN_RCVD状态  2)已完成队列:已完成TCP三次握手过程,处于ESTABLISHED状态  3)当有一个SYN到来请求建立连接时,就在未完成队列中新建一项。当三次握手过程完成后,就将套接口从未完成队列移动到已完成队列。  4)backlog曾被定义为两个队列的总和的最大值,Berkely实现中...

程序员老狼专注开发aigc或客服系统应用 345

从Linux源码看Socket(TCP)的listen及连接队列

从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。 今天笔者就来从Linux源码的角度看下Server端的Socket在进行listen的时候到底做了哪些事情(基于Linux 3.10内核),当然由于listen的backlog参数和半连接hash表以及全连接队列都相关,在这一篇博客里也一块讲了。 Server端Socket需要Listen 众所周知,一个Server端Socket的建立,需要so

alchemystar的专栏 657

Redis5.0.5源码解析 -- tcp_max_syn_backlog

1、client发送SYN到server,将状态修改为SYN_SEND,如果server收到请求,则将状态修改为SYN_RCVD,并把该请求放到syns queue队列中。 2、server回复SYN+ACK给client,如果client收到请求,则将状态修改为ESTABLISHED,并发送ACK给server。 3、server收到ACK,将状态修改为ESTABLISHED,并把该请求从sy...

junlon2006的博客 545
上一篇: 国税总局发票助手二维码生成的CRC计算
下一篇: Celery入门
帅帅兔子
博客等级 码龄24年 7粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值