HTTP keep-alive和TCP keepalive的区别,你了解吗?

2023-05-16

1、从文中找出我的IP

2、http请求中是客服端还是服务端主动关闭的tcp连接?
请阅读到最后的彩蛋部分

HTTP和TCP都是老生常谈的知识点,本文不进行铺开赘述。我们可能在HTTP和TCP中都听说“长连接”的说法,也听过HTTP中有keep-alive,TCP中有keepalive。那么,HTTP和TCP的长连接有何区别?HTTP中的keep-alive和TCP中keepalive又有什么区别?

Tips:HTTP中是keep-alive,TCP中是keepalive,HTTP中是带中划线的。大小写无所谓。

一、简介

上面是我先前做TCP协议分享时整理的一张表格,从上面可以看出:不管是在OSI七层网络模型还是在TCP/IP五层网络模型中,TCP是传输层的一种协议,而HTTP是应用层的一种协议。

HTTP和TCP的理论和实现还是相当复杂的,下面只简单介绍和本文主题相关的知识点。

1.1、TCP协议简介

TCP协议也叫传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。使用TCP的两个程序(客户端和服务端)在交换数据前,通过三次握手来建立TCP连接,建立连接后就可以进行基于字节流的双工通讯,由TCP内部实现保证通讯的可靠性,完全通讯完成后,通过四次挥手断开连接。

在客户端和服务端间的网络一切正常、且双方都没主动发起关闭连接的请求时,此TCP连接理论上可以永久保持。但是,网络情况是及其复杂的,在双方长时间未通讯时,如何得知对方还活着?如何得知这个TCP连接是健康且具有通讯能力的?

1.2、HTTP协议简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写。HTTP是万维网的数据通信的基础。HTTP是一个应用层协议,通常运行在TCP协议之上。它由请求和响应构成,是一个标准的客户端服务器模型(C/S模型)。HTTP是一个无状态的协议。

无状态怎么解释?HTTP协议永远都是客户端发起请求,服务器回送响应。每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求客户端再重新建立连接。也就无法实现在客户端没有发起请求的时候,服务器主动将消息推送给客户端。

HTTP协议运行在TCP协议之上,它无状态会导致客户端的每次请求都需要重新建立TCP连接,接受到服务端响应后,断开TCP连接。对于每次建立、断开TCP连接,还是有相当的性能损耗的。那么,如何才能尽可能的减少性能损耗呢?

二、TCP keepalive

2.1、简介

正如上面提出的问题:在双方长时间未通讯时,如何得知对方还活着?如何得知这个TCP连接是健康且具有通讯能力的?

TCP的保活机制就是用来解决此类问题,这个机制我们也可以称作:keepalive。保活机制默认是关闭的,TCP连接的任何一方都可打开此功能。有三个主要配置参数用来控制保活功能。

如果在一段时间(保活时间:tcp_keepalive_time)内此连接都不活跃,开启保活功能的一端会向对端发送一个保活探测报文。

  • 若对端正常存活,且连接有效,对端必然能收到探测报文并进行响应。此时,发送端收到响应报文则证明TCP连接正常,重置保活时间计数器即可。
  • 若由于网络原因或其他原因导致,发送端无法正常收到保活探测报文的响应。那么在一定**探测时间间隔(tcp_keepalive_intvl)后,将继续发送保活探测报文。直到收到对端的响应,或者达到配置的探测循环次数上限(tcp_keepalive_probes)**都没有收到对端响应,这时对端会被认为不可达,TCP连接随存在但已失效,需要将连接做中断处理。

在探测过程中,对端主机会处于以下四种状态之一:

2.2、实验

这里,强烈推荐《TCP/IP详解 卷1:协议》的第二版(这里一定是第二版), 第17章:TCP保活机制。这里建议17章都看,17.1和17.2小节就涵盖了我上面介绍的内容。

17.2.1 小节中还通过实验的方式详细验证了“对端主机会处于以下四种状态”以及对于这四种状态TCP都是如何去处理。

这本书中的实验已经比较通俗易懂了,我暂且没有亲自动手去模拟实践,后续时间充足,会亲自动手进行实验。

2.3、扩展

上面提到了三个参数保活时间:tcp_keepalive_time、探测时间间隔:tcp_keepalive_intvl、探测循环次数:tcp_keepalive_probes。

这三个参数,在linux上可以在/proc/sys/net/ipv4/路径下找到,或者通过sysctl -a | grep keepalive命令查看当前内核运行参数

[root@vm01 ~]# cd /proc/sys/net/ipv4
[root@vm01 ipv4]# pwd
/proc/sys/net/ipv4
[root@vm01 ipv4]# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
[root@vm01 ipv4]# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
[root@vm01 ipv4]# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
[root@vm01 ipv4]# sysctl -a | grep keepalive
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75
  • 保活时间(tcp_keepalive_time)默认:7200秒
  • 保活时间间隔(tcp_keepalive_intvl)默认:75秒
  • 探测循环次数(tcp_keepalive_probes)默认:9次

也就是默认情况下一条TCP连接在2小时(7200秒)都没有报文交换后,会开始进行保活探测,若再经过9*75秒=11分钟15秒的循环探测都未收到探测响应,即共计:2小时11分钟15秒后会自动断开TCP连接。

别走开,还有一个骚操作

相关视频推荐

后台开发第299讲|大厂面试必问-如何实现UDP可靠性传输|1.C/C++程序员必问的TCP/UDP应用场景 2.UDP编程的各种坑 3.如何设计可靠UDP传输

需要C/C++ Linux服务器架构师学习资料加qun956314242获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

Linux平台下我们还可以借助man命令查看TCP协议的一些描述和参数定义。下面两个命令的效果相同:

  • 命令一:man tcp
  • 命令二:man 7 tcp

7的含义是:man命令使用手册共9章,TCP的帮助手册位于第7章。不知道在第几章也无所谓,使用man tcp也可,弹出的手册左上角也有写第几章。(man ls等同于man 1 ls、man ip等同于man 8 ip,可以自己尝试使用 )。

下面我们看下man tcp下的和我们本文有关的几个点:

上面介绍的三个参数tcp_keepalive_time、tcp_keepalive_intvl、tcp_keepalive_probes都是系统级别的,针对整个系统生效。下面介绍针对单条Socket连接细粒度设置的三个选项参数:保活时间:TCP_KEEPIDLE、保活探测时间间隔:TCP_KEEPINTVL、探测循环次数:TCP_KEEPCNT

在我们的Netty的框架中可以看到针对Socket选项的配置,如使用epoll的IO模型中EpollSocketChannelConfig类中的配置:

更多细节,等你挖掘。

三、HTTP keep-alive

3.1、简介

HTTP协议简介中提到http协议是一个运行在TCP协议之上的无状态的应用层协议。它的特点是:客户端的每一次请求都要和服务端创建TCP连接,服务器响应后,断开TCP连接。下次客户端再有请求,则重新建立连接。

在早期的http1.0中,默认就是上述介绍的这种“请求-应答”模式。这种方式频繁的创建连接和销毁连接无疑是有一定性能损耗的。

所以引入了keep-alive机制。http1.0默认是关闭的,通过http请求头设置“connection: keep-alive”进行开启;http1.1中默认开启,通过http请求头设置“connection: close”关闭。

keep-alive机制:若开启后,在一次http请求中,服务器进行响应后,不再直接断开TCP连接,而是将TCP连接维持一段时间。在这段时间内,如果同一客户端再次向服务端发起http请求,便可以复用此TCP连接,向服务端发起请求,并重置timeout时间计数器,在接下来一段时间内还可以继续复用。这样无疑省略了反复创建和销毁TCP连接的损耗。

3.2、实验

下面用两组实验证明HTTP keep-alive的存在。

实验工具:Wireshark

客户端IP:*.*.3.52

服务端IP:*.*.17.254

3.2.1、实验一:禁用keep-alive的http请求

从上图请求列表区中,我们可以发现:

  • 106、107、108三个请求是TCP建立连接三次握手的请求
  • 109、110两个请求分别是:http的请求报文和http的响应报文
  • 111、112、120、121这四个请求是TCP断开连接四次挥手的请求

(由于一台机器上网络请求较多,我加了筛选条件,仅显示客户端和服务端通信的网络请求,所以请求的序号是不连续的)

从上图中间的请求数据解析区,可以确定:此次http请求的请求头中有“Connection: close”,即keep-alive是关闭的。

结论:禁用keep-alive的http请求时,会先建立TCP连接,然后发送报文、响应报文、最后断开TCP连接。

3.2.2、实验二:启用keep-alive的http请求

这次实验请求较多,一张图放不下,两张图是连续的,图1的第二块绿色区域和图2的第一块绿色区域是重叠的(注意看第一列的No.编号)

先说下我的操作:

  1. 开启keep-alive前提下发起第一次http请求
  2. 7秒左右时,同样的机器同样的http请求,再重新调用一次

我们根据图中抓包,分析下网络请求:

  • 197、198、199请求:三次握手建立TCP建立连接
  • 200、203请求:http的请求报文和http的响应报文
  • 212请求:可以通过Protocol列看到它是一条TCP报文。我的理解是:在keep-alive这种机制下,客户端收到服务端响应报文后,需要告知服务端“已收到”。由于要复用TCP连接,所以会多一层保障机制,类似TCP的握手和挥手
  • 459-1965请求(图1中的第一块黑色区域中):6秒内(第二列代表Time),每隔1秒,发生一对TCP请求的来回,用来维护TCP连接的可用性。保证和等待该TCP连接被复用
  • 1743、1744、1745、1755请求:其中的1743和1745是我第二次发起http请求的请求报文和响应报文。1744请求是:客户端发起请求时,服务端先回复客户端“已收到,马上处理”。紧接着1745将结果响应给客户端。1755则是客户端收到响应后,回复服务端“已收到响应,多谢”。
  • 2028-3903请求:10秒内,每隔1秒,发生一对TCP请求的来回,用来维护TCP连接的可用性。保证和等待该TCP连接被复用
  • 4127-4131请求:10秒内我没再发起http请求,四次挥手断开TCP连接。长时间没被复用,也没必要一直维持下去,浪费资源,还可能造成网络拥堵。

注意:10秒无请求,TCP连接在断开,10秒也不是默认的,只是环境的配置。是Httpd守护进程,提供的keep-alive timeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。

3.3、扩展

其实对于HTTP keep-alive机制可以总结为上图所示。

启用HTTP keep-Alive的优缺点:

优点:keep-alive机制避免了频繁建立和销毁连接的开销。 同时,减少服务端TIME_WAIT状态的TCP连接的数量(因为由服务端进程主动关闭连接)

缺点:若keep-alive timeout设置的时间较长,长时间的TCP连接维持,会一定程度的浪费系统资源。

总体而言,HTTP keep-Alive的机制还是利大于弊的,只要合理使用、配置合理的timeout参数。

四、总结

回到文章开头提出的问题:HTTP和TCP的长连接有何区别?HTTP中的keep-alive和TCP中keepalive又有什么区别?

1、TCP连接往往就是我们广义理解上的长连接,因为它具备双端连续收发报文的能力;开启了keep-alive的HTTP连接,也是一种长连接,但是它由于协议本身的限制,服务端无法主动发起应用报文。

2、TCP中的keepalive是用来保鲜、保活的;HTTP中的keep-alive机制主要为了让支撑它的TCP连接活的的更久,所以通常又叫做:HTTP persistent connection(持久连接) 和 HTTP connection reuse(连接重用)。

五、彩蛋

彩蛋一

你能从文中找出我在HTTP keep-alive实验中客户端和服务端的完整IP吗?

如能找出,说明对网络协议的了解已炉火纯青。

彩蛋二

在HTTP请求中,到底是「服务端」还是「客户端」主动关闭连接呢?

看到过很多文章,有人说服务端、有人说客户端、有人说分情况(keep-alive的开启与否)既可能是客户端也可能是服务端。你信谁?最后翻来覆去发现各个网站的各种文章基本类似,只有观点,没有论据。

HTTP keep-alive章节的实验结果:无论开启keep-alive与否,最终由服务端主动断开TCP连接。

但是我给出问题的答案是:通常由服务端主动关闭连接。没有写“肯定由服务端主动关闭连接”的原因是,我没遇到客户端主动关闭连接的场景,并不代表没有。网络和协议博大精深,等待我们继续去探索。

彩蛋三

Wireshark是一款功能强大的网络封包分析可视化软件。《TCP/IP详解 卷1:协议》第二版相比第一版,书中的抓包工具也将tcpdump改为****Wireshark。****

个人观点:《TCP/IP详解 卷1:协议》第一版和第二版结合起来看效果更好。第一版的TCP阻塞控制将的更通俗易懂,第二版的TCP保活机制讲的更清晰。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP keep-alive和TCP keepalive的区别,你了解吗? 的相关文章

  • 使用意图过滤器从 URL 打开 Android 应用程序不起作用

    我有一个 Android 应用程序 人们用它来替代网站 因此 当用户遇到网站的 URL 时 我想为他们提供在我的应用程序中而不是在浏览器中 打开 URL 的选项 换句话说 我希望出现弹出窗口 让他们在我的应用程序和浏览器 可能还有其他应用程
  • 发送压缩文件 Spring

    我想通过我的 spring 控制器发送一个已经存在的压缩文件 但我不断收到这些错误消息org springframework web HttpMediaTypeNotAcceptableException Could not find ac
  • 是否可以阻止在每个 HTTP 请求中发送 cookie?

    我最近发现 这里 每个网络请求都会发送浏览器cookie吗 https stackoverflow com questions 1336126 does every web request send the browser cookies
  • Angular2 http.post 被执行两次

    我遇到一个奇怪的问题 Angular2 的 RC1 Http 服务执行 http post 调用两次 我已经调试了我的应用程序 并且我知道这不是点击事件问题 导致核心服务调用的所有调用 public create json Object p
  • 有没有办法测量 Java (Servlet) I/O 流量?

    我尝试做的是使用以下代码实现 servlet 过滤器 int up request getContentLength if HttpServletRequest request getQueryString null up Math max
  • REST URL 结构建议

    我正在尝试为我正在开发的网站的愿望清单部分敲定一个宁静的网址结构 这是一个非常简单的模型 用户可以有许多愿望清单 每个愿望清单可以包含许多产品 目前我有明显的 CRUD URL 来操作愿望清单本身 GET account wishlists
  • HTTP 重定向图像可以吗?

    返回图片资源时返回301 302 303代码可以吗 我过去曾这样做过 而且似乎有效 这是好的做法吗 它与大多数浏览器兼容吗 是的 您可以重定向图像 浏览器将遵循重定向 但出于性能原因 您通常希望将重定向保持在最低限度 因为每个重定向都需要单
  • python 中的原始套接字和 sendto

    我正在努力将 scapy 与twisted 集成 但我在 OSX 上遇到了这个非常奇怪的错误 我似乎无法弄清楚 基本上我无法通过原始套接字发送有效的 TCP 数据包 包括 IP 标头 这就是我正在做的 import socket from
  • 我首次设置 AWS EB 时创建的默认安全组是什么?

    我对几个组所扮演的角色感到困惑 这些组似乎已自动添加到我的 AWS 安全组列表中 并以我收集的默认配置进行连接 并且想知道它们是如何工作的 以及它们的安全性如何 改变 具体来说 有三个神秘之处 launch wizard 1其中有一条入站规
  • 从浏览器中删除cookie?

    有什么方法可以指示网络浏览器完全delete一个人的cookie是用PHP设置的吗 我不想expiry或者等待浏览器closed 对于删除 我的意思是实际上不再将其列在 cookie 列表中 尝试这样删除所有 cookie foreach
  • 使用信号器时会话超时

    我有一个网络应用程序 主要用于监控系统 它使用信号器从服务器 服务器推送 更新来刷新显示 该页面还有一些按钮 它们也使用相同的信号器连接将数据发送到服务器 问题是 signalr 使用单独的连接 因此即使它定期从服务器发送和接收数据 会话也
  • 是否有管理 __utma、__utmz 等 cookie 的标准?

    无论我登录 Facebook 还是 Twitter 我都会受到以下名称的 cookie 轰炸 utma utmb utmc utmv 它们的功能是什么 是否有一个标准来管理这些在服务器端的使用方式 这些 cookie 通常与谷歌分析 htt
  • 由于请求的资源上不存在“Access-Control-Allow-Origin”标头,无法获取与 Axios 的链接请求

    我正在尝试使用 cryptocompare api 来获取 axios 的 coindata 列表 但我不知道如何解决这个问题 我相信这是一个 CORS 问题 但我不确定 完整错误如下 加载失败https www cryptocompare
  • OkHttp如何获取Json字符串?

    Solution 这是我这边的一个错误 正确的方法是响应 body string 以外响应 body toString 我使用 Jetty servlet URL 是http 172 16 10 126 8789 test path jso
  • .NET 中有什么方法可以以编程方式侦听 HTTP 流量吗?

    我正在使用浏览器自动化来测试网站 但我需要验证来自浏览器的 HTTP 请求 即图像 外部脚本 XmlHttpRequest 对象 有没有一种方法可以以编程方式实例化代理以供浏览器使用以查看其发送的内容 我已经在使用 Fiddler 来监视流
  • HTTP部分上传、断点续传的标准方法

    我正在开发 http 客户端 服务器框架 并寻找处理部分上传的正确方法 与使用带有 Range 标头的 GET 方法进行下载相同 但是 HTTP PUT 并不打算恢复 据我所知 PATCH 方法不接受 Range 标头 有没有办法通过 HT
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • 由于浏览器设置的标头,Safari 拒绝重定向的 CORS 请求

    Summary Safari 拒绝一些涉及重定向的 CORS 请求 声称某些标头是不允许的 但该标头从来不是由脚本请求的 而是由浏览器添加的 所以我认为这应该不重要 Safari 的行为是一个错误吗 规格有问题吗 或者 事情变成这样是有原因
  • 伪TCP通道

    什么是伪 TCP 通道以及如何实现 伪 TCP 是一种协议 它实现了 TCP 的一些思想 通过不可靠的基于数据包的接口提供可靠的数据流 例如 如果您只能访问 UDP 但想要 一种可靠的方式来传递数据 则可以使用此方法 您可以在这里找到示例代
  • 当会话令牌无效时,我应该使用什么状态代码?

    创建 Web 服务 RESTful 时 当会话令牌无效时我应该使用什么状态代码 目前我公司的人给我发了一个404 未找到 但我认为这是不正确的 因为资源存在 也许我应该使用 401 Unauthorized 你怎么认为 您建议我在这种情况下

随机推荐

  • ESP32驱动1.28寸GC9A01播放视频(二、程序说明和效果展示)

    ESP32驱动1 28寸GC9A01播放视频 xff08 二 程序下载和效果展示 xff09 1 28寸GC9A01屏幕屏幕引脚定义 程序说明程序更改1 Arduino DataBus bus和Arduino GC9A01 gfx要改成ES
  • 计算机网络---传输层的udp协议

    首先我们认识要在应用层对数据封装之后需要传输到传输层进行封装 xff0c 但是在应用层只是对数据进行了处理 xff0c 所以在传输层上需要对传输到那个进程进行设置 xff0c 所以在传输层需要对port进行设置 所以port是标志一个进程
  • c++中 ->,c++中::

    gt gt 用于指针 gt 用于指向结构体的指针 gt 用于指向结构体的指针 xff0c 表示结构体内的元素 include lt stdio h gt struct role 定义一个结构体 char name 8 姓名 int leve
  • U8W/U8W-Mini使用与常见问题解决

    U8W U8W Mini使用与常见问题解决 U8WU8W U8W mini简介准备工作U8W U8W mini在线联机下载U8W U8W mini脱机下载第一步 xff0c 把程序下载到U8W U8W mini烧录器中 xff1a 第二步
  • Arduino 驱动GP2Y1014AU检测PM2.5

    Arduino 驱动GP2Y1014AU检测PM2 5 一 基本参数二 接线三 部分代码引脚定义对应代码 四 实验现象五 注意事项 一 基本参数 二 接线 三 部分代码 引脚定义 define measurePin span class t
  • STM32F103ZET6驱动TOF250激光测距传感器

    STM32驱动TOF250激光测距传感器 TOF250介绍I2C通讯协议I2C寄存器地址 TOF250引脚说明和STM32的接线和STM32的接线 程序实验结果总结 TOF250介绍 TOF250是一款基于TOF原理的单点测距雷达 xff0
  • STM32驱动SG90舵机

    STM32驱动SG90舵机 关于SG90舵机SG90转动角度与占空比的关系驱动SG90舵机代码 确定控制引脚 写代码 SG90舵机正常驱动现象总结 关于SG90舵机 SG90是一种小型伺服电机 xff0c 通常用于模型制作和小型机械应用中
  • Arduino驱动L298N控制直流电机的正反转和调速

    Arduino驱动L298N控制直流电机的正反转和调速 一 前言二 产品参数三 驱动直流电机三 接线图四 程序五 实验结果总结 一 前言 本模块使用ST公司的L298N作为主驱动芯片 xff0c 具有驱动能力强 xff0c 发热量低 xff
  • Livox MID-70连接及使用

    ROS下载安装 本文选用ros xff0c 未使用ros2 在Ubuntu18 04下配置ros 下载安装参考 xff1a Ubuntu18 04安装 ROS桌面完整版 其中注意在第8部分 span class token function
  • 微信小程序 宠物论坛1

    微信小程序宠物论坛1 一个简单的论坛包括以下几个方面 xff1a 登录模块发帖模块首页模块帖子详情模块搜索模块个人主页模块 下面将从这6个方面介绍如何用微信小程序开发一个简单的论坛 登录模块 先看界面图 打开小程序首先看到这个界面 xff0
  • 微信小程序宠物论坛6

    微信小程序宠物论坛6 个人主页页面 JS部分 const db 61 wx cloud database Page data openid 34 34 nickname 34 34 heads 34 34 onLoad function o
  • 激光SLAM从理论到实践学习——第三节(传感器数据处理2:激光雷达运动畸变的去除)

    传感器数据处理2 xff1a 激光雷达运动畸变的去除 激光雷达运动畸变的去除比里程计标定更重要 xff0c 但也取决于用的雷达型号 我用的思岚A2雷达频率小于10Hz xff0c 畸变也是比较明显的 概念介绍 激光雷达传感器介绍 xff08
  • Ubuntu16.04 ROS环境中RealSense D435i安装使用

    Ubuntu16 04 ROS环境中RealSense D435i安装使用 弄了三四天 xff0c 网上说法很多 xff0c 有的说需要编译内核 xff0c 然而编译内核下载的补丁特别慢 xff0c 有的说catkin make的需要加其它
  • 计算机网络---传输层(tcp协议,三次握手,四次挥手)

    tcp报头三次握手四次挥手状态改变WIME WAIT状态相关的问题 tcp协议是面向连接 xff0c 可靠传输 xff0c 面向字节流的传输层协议 xff0c 首先我们认识一下tcp的协议报头 源 目的端口 xff1a 表示数据是从哪个进程
  • C++中 对》和《的重载

    在 C 43 43 中 xff0c 左移运算符 lt lt 可以和 cout 一起用于输出 xff0c 因此也常被称为 流插入运算符 或者 输出运算符 实际上 xff0c lt lt 本来没有这样的功能 xff0c 之所以能和 cout 一
  • 深入理解 http 反向代理(nginx)

    要理解什么是 反向代理 reverse proxy 自然你得先知道什么是 正向代理 forward proxy 另外需要说的是 一般提到反向代理 通常是指 http 反向代理 但反向代理的范围可以更大 比如 tcp 反向代理 在这里 不打算
  • 面试必问的红黑树,从根源上探究红黑树的本质

    前言 本文主要讲解下面试经常会问到的红黑树 xff0c 看看究竟是什么神仙鬼怪 二叉树 满足以下两个条件的树就是二叉树 xff1a 本身是有序树 xff08 若将树中每个结点的各子树看成是从左到右有次序的 即不能互换 xff0c 则称该树为
  • C++后台开发面试题总结(涉及C++基础、多线程多进程、网络编程等)

    C 43 43 后台开发面试题总结 涉及C 43 43 基础知识 多线程多进程 TCP IP网络编程 Linux操作 数据结构与算法 因巩固知识体系 xff0c 面试 xff0c 梳理以往看到过的知识点 xff0c 故总结如下相关题目 xf
  • 实战项目:手把手带你实现一个高并发内存池

    项目介绍 1 这个项目做的是什么 xff1f 当前项目是实现一个高并发的内存池 xff0c 他的原型是google的一个开源项目tcmalloc xff0c tcmalloc全称Thread Caching Malloc xff0c 即线程
  • HTTP keep-alive和TCP keepalive的区别,你了解吗?

    1 从文中找出我的IP 2 http请求中是客服端还是服务端主动关闭的tcp连接 xff1f 请阅读到最后的彩蛋部分 HTTP和TCP都是老生常谈的知识点 xff0c 本文不进行铺开赘述 我们可能在HTTP和TCP中都听说 长连接 的说法