被抛弃的八股文之keep-alive

还记得在我毕业面试时,经常看到碰到的面试题中都有着TCP中的keep-alive和Http中的keep-alive有什么区别。但是现在的八股文中已经再也见不到了(燕子,我们还会再见吗)

Image description

话说回来,这两个不同的协议中,keep-alive分别代表什么意思呢?

TCP中的keep-alive

我们先来看看TCP协议的报文格式长什么样的先,具体格式文档:https://datatracker.ietf.org/doc/html/rfc9293

能看到,在报文格式中并没有keep-alive这个属性或参数。但是在文档中数据传输那一节中,说明了keep-alive的作用:

TCP中的keep-alive是操作系统对于TCP协议的一种附加功能,用于检测本条TCP连接的状态。但这个附件功能并不是TCP协议中强制要求实现的部分,而且keep-alive功能在TCP中是默认关闭的。

keep-alive会在TCP连接空闲时间到达某个阈值时,开启keep-alive一方会向另一方发送一个空的数据包,如果另一方在多次发送空数据包均无响应后,TCP则会通知应用层连接失效。

简单来说,TCP中的keep-alive是一种由操作系统实现连接检测机制,但该机制检测出来的异常连接并非一定准确,在TCP文档中着重介绍了这一点。

简单示例

在Windows中变更keep-alive探测时间需要修改注册表,路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

对应有几个参数:

参数描述默认值单位
KeepAliveTimeTCP空闲触发时间7200000 2小时毫秒
KeepAliveInterval没有收到探测包响应时,重新发送keep-alive探测包的间隔时间1000毫秒
TcpMaxDataRetransmissions重试次数5次数

为了便于测试,我将触发时间缩短成50秒。

需要显示声明使用keep-alive,否则该功能不会开启。

测试服务端:

public class ServerMain {public static void main(String[] args) throws IOException, InterruptedException {try (ServerSocket serverSocket = new ServerSocket(18888)) {Socket accept = serverSocket.accept();accept.setKeepAlive(true);System.out.println("客户端已连接!");Thread.sleep(1000000000L);}}
}

测试客户端:

public class ClientMain {public static void main(String[] args) throws IOException, InterruptedException {Socket socket = new Socket("127.0.0.1", 18888);System.out.println("client connected");Thread.sleep(10 * 60 * 1000);}
}

使用Wireshark进行抓包后,可以看到在TCP连接后的50秒后,发送了keep-alive的探测包,并且每隔50秒都会进行发送。

这就是TCP中keep-alive的作用,监测并维持空闲TCP连接。

HTTP中的keep-alive

在HTTP1.0中就已经有keep-alive的请求头了,但这个请求头只是部分服务器支持,并且也不在协议的标准之内。于是,在HTTP1.1中则新开了一个章节,着重说明了keep-alive请求头的作用。

https://datatracker.ietf.org/doc/html/rfc2068#section-19.7.1

在协议中,说明了当Connection请求头为keep-alive时,客户端以及服务器都需要复用本条TCP连接。


浏览器中无法显式关闭keep-alive(想关也不给你关😢),只能在服务器中通过控制keep-alive参数进行关闭,例如tomcat的maxKeepAliveRequests。关闭之后,可以从控制台中,看到关闭前,只需要第一次请求需要连接服务器,其余请求无需再次连接服务器,正是连接复用的作用。

关闭之后,每次请求都需要跟服务器进行连接,虽然时间也不长,但是也会消耗服务器资源的。在响应头中也能看到Connectionclose

总结

差异点TCPHTTP
定义操作系统在TCP协议上添加的连接检测机制,用于检测连接状态HTTP请求头中的字段,表示复用同一条TCP连接
功能检测TCP连接是否仍然有效,通过空闲时发送探测包来验证连接状态允许在同一TCP连接上发送多个HTTP请求,减少连接建立的开销
是否为协议标准不是TCP协议的强制标准,且默认关闭协议的标准,默认开启

题外话-时代的落幕

1996年5月HTTP1.0协议正式发布,第二年HTTP1.1随之发布。但是HTTP2.0却是在2015年5月才正式发布,并且2.0还是基于Google2009年11月份发布的实验性SPDY协议**。**

那为什么Google要发布SPDY协议呢,归根结底,还是由于HTTP1.1在当时已经不满足于愈发发展的互联网了。最经典的例子,HTTP1.1在请求时会阻塞当前TCP连接,在请求数少时还能接受,当请求数高的时候,延迟就十分严重了。

现在我们在请求一个网站的时候,按下F12可以看到在请求的协议中,大部分都已经是HTTP2了。协议的升级不仅使我们访问网页的速度变快,同时也说明了时代的变革了。

SPDY协议的推出:https://blog.chromium.org/2009/11/2x-faster-web.html

使用 SPDY 和 HTTP/2 提高 Web 速度:https://blog.chromium.org/2013/11/making-web-faster-with-spdy-and-http2.html

Chromium优先先使用HTTP2.0进行连接:https://blog.chromium.org/2015/02/hello-http2-goodbye-spdy.html


TCP虽然没有像HTTP协议一样发布了多个版本,但是也一直进行着多次改进。传输层协议也推出了很多新的协议,最出名的就是HTTP3使用的GoogleQUIC协议,以及特斯拉最新发布的TTPOE

TTPOE:https://www.servethehome.com/tesla-dojo-exa-scale-lossy-ai-network-using-the-tesla-transport-protocol-over-ethernet-ttpoe/

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

衡石分析平台系统分析人员手册-指标管理

指标管理​ 指标平台通过业务主题管理指标,对指标进行授权使用。在指标管理中业务管理员根据业务情况创建相关的主题,将与业务相关的指标添加到主题中,对指标进行上下线管理,将主题及其下面的指标授权给平台内其他用户使用。 本…

【万码优才,等你到来】一款针对程序员求职的平台

hello,大家好我是万码优才推荐官→Aic山鱼,在面对广大程序员找工作的前期我为大家推荐一款超牛的求职平台 ——万码优才 针对当前的求职情况山鱼君也做了一写总结与分析,也结合了其他求职平台给出了“为什么要使用万码优才 这个平台”的原因 …

echarts bar3D画出圆角立方体模拟建筑

结果展示 重点 bar3D中圆角属性:roundCap: true //开启圆角(echarts官方文档中没有)bevelSize: .6 //圆角程度barSize: 12.5 //立方体大小半球形使用 surface 类型,曲线方程如下 parametricEquation: {u: {min: 0,max: Math.PI,step: Ma…

从建立TRUST到实现FAIR:可持续海洋经济的数据管理

1. 引言 随着我们对信息管理方式的信任,我们的社会对数字化数据的以来呈指数级增长。为了跟上大数据的需求,通过不断的努力和持续实践,对“good”数据管理方式的共识也在不断发展和演变。 加拿大正在建设国家基础设施和服务以及研究数据管理…

CTF-RE 从0到N: perl 逆向

WMCTF2020 easy_re 1.寻找字符串Script 2.通过下一个call 3.将rax的值解析为字符串

RecyclerView详解——(二)优劣,ItemDecoration,SnapHelper

本文主要讲述RecyclerView和ListView的区别,ItemDecoration实现分割线,边距和背景,以及SnapHelper的使用。 一、RecyclerView和ListView 1. 性能和视图重用 ListView 使用的是 ViewHolder 模式来实现视图的重用,但需要手动配置…

[运维][Nginx]Nginx学习(2/5)-Nginx高级

Nginx服务器基础配置实例 前面我们已经对Nginx服务器默认配置文件的结构和涉及的基本指令做了详细的阐述。通过这些指令的合理配置,我们就可以让一台Nginx服务器正常工作,并且提供基本的web服务器功能。 接下来我们将通过一个比较完整和最简单的基础配…

动态规划习题其四【力扣】【算法学习day.26】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…

candence : 原理图如何导出原理库?

原理图如何导出原理库? 1、打开要需要导出原理图库的工程文件,新建一个原理图库: 2、copy 需要导出的原理图的库文件 3、粘贴到 刚刚新建的原理图库文件中即可 完成 可以一个一个复制,也可以多可一起复制。

二叉树的遍历

普通二叉树的遍历 前序遍历:根 左子树 右子树 中序遍历:左子树 根 右子树 后序遍历:左子树 右子树 根 一颗普通二叉树的实现 #include<stdlib.h> //树的定义 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;s…

WebStorm 如何调试 Vue 项目

前言 在日常开发和各种教程中&#xff0c;最常见的 debug 方式就是在代码中插入 console.log 语句&#xff0c;然后在 Chrome 控制台中查看日志。显而易见&#xff0c;插入console.log 的效率不高&#xff0c;那是否有更高效的 debug 方式呢&#xff1f;断点调试允许开发者在代…

timedatectl status显示系统时间相关信息

timedatectl status命令用于显示当前系统的时间和日期相关信息。 下面是每行含义&#xff1a; Local time: 当前系统的本地时间Universal time: 当前系统的协调世界时&#xff08;UTC&#xff09;RTC time: 硬件时钟&#xff08;Real Time Clock&#xff09;的时间Time zone:…

【网页设计】HTML5 和 CSS3 提高

目标 能够说出 3~5 个 HTML5 新增布局和表单标签能够说出 CSS3 的新增特性有哪些 1. HTML5 的新特性 注&#xff1a;该部分所有内容可参考菜鸟教程菜鸟教程 - 学的不仅是技术&#xff0c;更是梦想&#xff01; (runoob.com) HTML5 的新增特性主要是针对于以前的不足&#xf…

09C++结构体

/*结构体属于用户自定义的数据类型&#xff0c; 允许用户存储不同的数据类型, 语法:struct 结构体名{结构体成员列表} ;*/ //struct 结构体名 变量名 #include <iostream> #include <string> using namespace std; struct student { string name; int age;int s…

软件测试之白盒测试(超详细总结)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 白盒测试 白盒测试&#xff08;White Box Testing&#xff09;又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试只测试软件产品的内部结…

【入门篇】数字统计——多语言版

题目跳转&#xff1a;数字统计 题目解析&#xff1a; 这道题目要求统计在给定范围 [L, R] 内所有整数中数字 2 出现的次数。例如&#xff0c;在范围 [2, 22] 中&#xff0c;数字 2 分别在数 2、12、20、21、22 中出现的次数&#xff0c;最终出现了6次。 题目的输入为两个正…

C++初阶——list

一、什么是list list是一个可以在序列的任意位置进行插入和删除的容器&#xff0c;并且可以进行双向迭代。list的底层是一个双向链表&#xff0c;双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过将每个元素与前一个元素的链接和后一个元素的链接关联起来&…

FlinkSql读取kafka数据流的方法(scala)

我的scala版本为2.12 <scala.binary.version>2.12</scala.binary.version> 我的Flink版本为1.13.6 <flink.version>1.13.6</flink.version> FlinkSql读取kafka数据流需要如下依赖&#xff1a; <dependency><groupId>org.apache.flink&…

力扣 LeetCode 19. 删除链表的倒数第N个结点(Day2:链表)

解题思路&#xff1a; 快慢指针 class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy new ListNode(-1);dummy.next head;ListNode fast dummy;ListNode slow dummy;for (int i 0; i < n; i) {fast fast.next;}while (fast.ne…

提升法律文书处理效率的秘密武器:开源文档比对工具解析

本篇文章介绍了一款针对律师行业的免费开源文档比对工具&#xff0c;旨在解决法律文档的多版本比对难题。通过逐字、逐句精确比对、语义分析、批量处理等核心功能&#xff0c;该工具可高效识别文本差异&#xff0c;提升文书审查效率并降低错误风险。它支持多种文件格式&#xf…