浅谈Http长连接和Keep-Alive以及Tcp的Keepalive

2023-11-01

Keep-Alive模式:
我们知道Http协议采用“请求-应答”模式,当使用普通模式,即非Keep-Alive模式时,每个请求/应答,客户端和服务器都要新建一个连接,完成之后立即断开连接;当使用Keep-Alive模式时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
http1.0中默认是关闭的,需要在http头加入”Connection: Keep-Alive”,才能启用Keep-Alive;
http 1.1中默认启用Keep-Alive,如果加入”Connection: close “才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。下图是普通模式和长连接模式的请求对比:
这里写图片描述

开启Keep-Alive的优缺点:
优点:Keep-Alive模式更加高效,因为避免了连接建立和释放的开销。
缺点:长时间的Tcp连接容易导致系统资源无效占用,浪费系统资源。

当保持长连接时,如何判断一次请求已经完成?
Content-Length
Content-Length表示实体内容的长度。浏览器通过这个字段来判断当前请求的数据是否已经全部接收。
所以,当浏览器请求的是一个静态资源时,即服务器能明确知道返回内容的长度时,可以设置Content-Length来控制请求的结束。但当服务器并不知道请求结果的长度时,如一个动态的页面或者数据,Content-Length就无法解决上面的问题,这个时候就需要用到Transfer-Encoding字段。

Transfer-Encoding
Transfer-Encoding是指传输编码,在上面的问题中,当服务端无法知道实体内容的长度时,就可以通过指定Transfer-Encoding: chunked来告知浏览器当前的编码是将数据分成一块一块传递的。当然, 还可以指定Transfer-Encoding: gzip, chunked表明实体内容不仅是gzip压缩的,还是分块传递的。最后,当浏览器接收到一个长度为0的chunked时, 知道当前请求内容已全部接收。

Keep-Alive timeout:
Httpd守护进程,一般都提供了keep-alive timeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住keepalive_timeout秒后,才开始关闭这个连接。
当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,便是keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览器发过来http请求,则关闭这个http连接。

Tcp的Keepalive:
连接建立之后,如果客户端一直不发送数据,或者隔很长时间才发送一次数据,当连接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,连接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。
TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文(侦测包)给对方,如果对方回应了这个报文,说明对方还在线,连接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持连接。

tcp keep-alive是TCP的一种检测TCP连接状况的保鲜机制。tcp keep-alive保鲜定时器,支持三个系统内核配置参数:
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_time = 1800
keepalive是TCP保鲜定时器,当网络两端建立了TCP连接之后,闲置(双方没有任何数据流发送往来)了tcp_keepalive_time后,服务器就会尝试向客户端发送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。如果没有收到对方的回答(ack包),则会在 tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对方的ack,如果一直没有收到对方的ack,一共会尝试 tcp_keepalive_probes次,每次的间隔时间在这里分别是15s, 30s, 45s, 60s, 75s。如果尝试tcp_keepalive_probes,依然没有收到对方的ack包,则会丢弃该TCP连接。TCP连接默认闲置时间是2小时,一般设置为30分钟足够了。

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

浅谈Http长连接和Keep-Alive以及Tcp的Keepalive 的相关文章

  • 前端面试题及答案(字节跳动)(一)

    目录 垂直居中 左侧固定 右侧自适应 如何判断一个值是数组 bigint 最大安全整数 如何判断某个字符串以 abc 开头 进程和线程的区别 tcp 与 udp 跨域问题的几种解决方案 option 预请求 跨域的同时携带 cookie 用
  • LeetCode 处理用时最长的那个任务的员工

    解题思路 把第一个一维数组的两个元素分别定义为最大值和id 之后遍历进行判断 class Solution public int hardestWorker int n int logs int max logs 0 1 int id lo

随机推荐

  • sql注入知识---堆叠注入

    MySQL手注之堆叠注入详解 一 堆叠注入产生原因 二 使用条件 三 堆叠注入语句 1 查看数据库 2 查看表格 3 查看列 4 查看数据 四 16进制类型 绕过 五 堆叠应用 一 堆叠注入产生原因 平常我们注入时都是通过对原来sql语句传
  • 数组元素交叉排列的算法题(a1 a2 a3 .. an b1 b2 b3 .. bn -->a 1 b1, a2 b2, a3 b3, .. an bn ) 概论思想(perfect shuffle 算法)

    perfect shuffle 算法 今天又发现一个关于完美洗牌的算法 这个比较简单一些 由 microsoft的Peiyush Jain提出 原论文 A Simple In Place Algorithm for In Shuffle P
  • 沪胶期货全称(沪胶期货全称叫什么)

    什么是黄金期货 上海黄金交易所和上海期货交易所是一家单位吗 1 以前的期货市场上没有黄金期货 黄金期货是在08年1月9日刚刚开始的 2 上海黄金交易所和上海期货交易所不是同一个单位 上海期交所只做各种期货交易 上海金交所只做黄金现货交易 3
  • Fabric1.4源码解析:链码实例化过程

    之前说完了链码的安装过程 接下来说一下链码的实例化过程好了 再然后是链码的调用过程 其实这几个过程内容已经很相似了 都是涉及到Proposal 不过整体流程还是要说一下的 同样 切入点仍然是fabric peer main go文件中的ma
  • 前端性能优化--预加载技术

    当我们谈到前端的性能时 总是会提到比如合并 压缩 缓存或者在服务器上开启gzip之类的 目的都是为了让页面加载的更快 资源预拉取 prefetch 则是另一种性能优化的技术 通过预拉取可以告诉浏览器用户在未来可能用到哪些资源 Pre fet
  • java开发者工具IDEA自定义设置主题/字体/字号大小

    IDEA自定义设置主题 第一步 点击工具栏上的 File 选项 第二步 选择 Settings 选项 第三步 点击 Appearance Behavior gt Appearance 选项 第四步 点击右侧 Theme 下拉框 选择自己喜欢
  • docker搭建sonar服务

    拉取数据库 docker pull postgres 启动postgres数据库创建sonar用户 docker run name db p 5432 5432 e POSTGRES USER sonar e POSTGRES PASSWO
  • 神经网络二分类问题范例,神经网络解决分类问题

    求运用BP神经网络算法处理分类问题的源程序 例如输入蚊子的翼长和触角长 输出蚊子类型与此类似的源程序 30 这种分类的案例很多 附件里面就有这类案例 主要还是要形成样本 输入输出都做好 进行训练 训练完成后就能满足分类需要 模式识别是对表征
  • 什么是HuggingFace

    一 HuggingFace简介 1 HuggingFace是什么 可以理解为对于AI开发者的GitHub 提供了模型 数据集 文本 图像 音频 视频 类库 比如transformers peft accelerate 教程等 2 为什么需要
  • Yolo v8中的上下文管理器

    from contextlib import contextmanager contextmanager def torch distributed zero first local rank int Decorator to make a
  • 【Pytorch】第 9 章 :Capstone 项目——用 DQN 玩 Flappy Bird

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 使用STM32CubeProgrammer烧录STM32芯片

    不使用keil环境烧录STM32时一般需要使用官方的STM32 ST LINK Utility 但今天在使用STM32 ST LINK Utility烧录STM32F401时提示找不到Device ID 查看ST LINK Utility版
  • 解决django运行manage.py runscript命令时报错Try running with a higher verbosity level like: -v2 or -v3

    解决方法 查看命令是否书写正确 比如脚本名称为 my script py 时 python3 manage py runscript my script my script py文件中需要有入口函数 而且此时的 name 属性不是 main
  • css+js网页红包雨效果实现

  • 手把手教你在Android中使用bsdiff实现文件增量更新 (超详细)

    全量更新和增量更新 在Android开发中 版本更新是一个非常常见的需求 目前更新主要分为两种方式 全量更新 增量更新 如下图 分别是酷安和应用宝两个商店的更新页面 可以明显的看到 酷安的更新方式是全量更新 即每次下载全量的新版本文件 当然
  • Ubuntu 18.04 出现GLIBC_2.28 not found的解决方法(亲测有效)

    关于 lib x86 64 linux gnu libc so 6 version GLIBC 2 28 not found 出现报错 建议不要使用源码包去编译并升级 在下文有分享一个使用官方的Debian软件包去升级使用的方法 仅供参考
  • Android开发中的Unable to resolve superclass of L错误解决方法

    这个方法一般是因为引入第三方包造成的 注意android support v4等等也算 解决方法 项目上右键 gt Build Path gt Configure Build Path gt Order and Export里将引入的第三方
  • 头歌:字符串处理

    一 字符串的拼接 将要处理的字符串存放在变量中之后 可直接加 额外 空格需要用 框起来使用 二 字符串的转换 1 获取长度 使用函数len 注意使用字符串变量和直接应用字符串内容的区别 字符串需要加 符号 创建字符串是 输入的字符串也需要加
  • Qt只出现 exited with code 3的错误

    我的这个错误是在debug的时候报错 但是release和profile是可以正常运行的 各种百度以后 还是没有找到解决办法 自己无意中尝试将mingw32改为Mingw64重新运行之后就没问题了 好神奇 虽然解决了bug 但是还是不清楚其
  • 浅谈Http长连接和Keep-Alive以及Tcp的Keepalive

    Keep Alive模式 我们知道Http协议采用 请求 应答 模式 当使用普通模式 即非Keep Alive模式时 每个请求 应答 客户端和服务器都要新建一个连接 完成之后立即断开连接 当使用Keep Alive模式时 Keep Aliv