HTTP长连接实现原理

news2024/10/2 20:39:52

1. HTTP长连接和短连接的定义

  • HTTP长连接
    • 浏览器向服务器进行一次HTTP会话访问后,并不会直接关闭这个连接,而是会默认保持一段时间,那么下一次浏览器继续访问的时候就会再次利用到这个连接。
    • 在HTTP/1.1版本中,默认的连接都是长连接,我们可以通过Connection: keep-alive字段进行指定。
  • HTTP短连接
    • 浏览器向服务器每进行一次HTTP操作都要建立一个新的连接。
    • 在HTTP/1.0版本中默认是短链接

2.  HTTP长连接本质

HTTP协议本质是OSI七层参考模型中的应用层协议,而网络进行通信的时候都是通过上层协议封装头部后作为下层协议的数据部分进行封装的,而实际中我们经常接触的是TCP/IP协议簇,也就是传输层利用TCP协议和网络层利用IP协议。因此HTTP协议的长连接本质上就是TCP的长连接。

2.1 TCP建立连接回顾

上面我们提到了TCP,那么回顾一下,通信双方在进行通信的时候就是要通过“三次握手“来建立连接的,握手的过程大致如图1所示:

8a617202309281028326356.png

那么通过上图我们就可以清楚的看到,服务器和客户端都建立了一个TCB传输控制块,这里就是我们进行socket编程的时候管理连接的地方,在这里我们先标记这个TCB,在后续的文章,我们会详细介绍在Linux中TCB是怎么样管理连接的。

2.2  TCP释放连接回顾

在回顾了TCP连接建立之后,我们不妨再来看看TCP四次挥手,如图2所示:

9b86f20230928102908677.png

TCP连接的释放是看通信双方谁是主动关闭的一方,谁是被动关闭的一方来决定各自状态的,具体的内容大家依然可以参考《TCP/IP详解》,这里就不再赘述了。

2.3 TCP长连接

在建立了TCP连接之后,这也就到了这篇文章中比较核心的问题,就是说TCP连接建立之后,并不会在完成一次数据通信后就关闭连接,而是要保持一段时间,那么这个时间是怎么样保证,又是谁保证的呢?

2.3.1 TCP保活机制
  • 为什么要有保活机制?
    • 第一点自然是我们这篇文章的主题,通过保活机制,我们可以保证通讯双方的连接不被释放掉
    • 第二点就是在另一些情况下,如果客户端或者服务器发生了错误或者宕机,那么就可以依靠这种保活机制探测出网络通信出现了问题,进而可以释放掉这种错误连接。
  • 保活机制

首先保活机制的工作原理就是,通过在服务器端设置一个保活定时器,当定时器开始工作后就定时的向网络通信的另一端发出保活探测的TCP报文,如果接收到了ACK报文,那么就证明对方存活,可以继续保有连接;否则就证明网络存在故障。

上面只是在原理层面简单的介绍,根据文献[1],我们可以了解到详细的内容:

如果一个给定的连接在两个小时之内没有任何动作,则服务器就向客户发送一个探查报文段。客户主机必须处于以下 4个状态之一。

状态1:客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常工作的。服务器在两小时以后将保活定时器复位。如果在两个小时定时器到时间之前有应用程序的通信量通过此连接,则定时器在交换数据后的未来2小时再复位。

状态2:客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务器将不能够收到对探查的响应,并在75秒后超时。服务器总共发送10个这样的探查,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。

状态3:客户主机崩溃并已经重新启动。这时服务器将收到一个对其保活探查的响应,但是这个响应是一个复位,使得服务器终止这个连接。

状态4:客户主机正常运行,但是从服务器不可达。这与状态2相同,因为TCP不能够区分状态4与状态2之间的区别,它所能发现的就是没有收到探查的响应。

  • 实际应用

那么我们在了解了理论上TCP长连接是通过保活机制来实现的,但是保活机制并不是RFC规定的TCP协议的内容,因此有时候在不支持保活机制的机器上,往往我们也需要先看一下内核层面是否支持,如果不支持需要在应用层自己去实现这个功能。

在这里我们就来看一下Linux相关的TCP保活参数

tcp_keepalive_time,单位:秒,表示发送的探测报文之前的连接空闲时间,默认是7200s。

tcp_keepalive_intvl,单位:秒,表示两次探测报文之间的间隔时间,默认是75s

tcp_keepalive_probes,单位,秒,表示探测的次数,默认是9

接下来如果我们需要在应用层写自己的心跳机制,那么就需要其他方面的一些内容了。

2.3.2 TCP长连接和短链接比较
  • TCP短链接
    • 优点
      • 短链接不占服务器的内存,服务器能处理的连接数量会比较多
    • 缺点
      • 在有实际的资源要进行数据通信的时候才建立连接,那么在客户端发送完数据释放连接之后当服务器有向客户端发送数据时就不能做到发送消息的实时性。
      • 频繁地建立连接、释放连接会耗费大量的CPU和网络带宽资源。
  • TCP长连接[2]
    • 优点
      • 通信双方因为在保活机制的保证下可以保证数据收发的实时性
    • 缺点
      • 因为服务器需要一直保存和客户端的这条链接,因为是有状态的,那么在大量并发连接请求过来时,系统资源可能就不够了。
    • 什么时候需要长连接
      • 服务器需要主动发送资源给客户端时
      • 客户端和服务器通信很频繁时
      • 客户端宕机或者掉线时需要服务器做一些处理时
    • TCP长连接设计时需要考虑的问题
      • 默认的keep-alive时间比较长,一般的业务可能不需要这么久的时间
      • socket proxy会让TCP的保活失效:多有的proxy应用只能转发TCP的应用数据,不能转发TCP协议内部的包

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

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

相关文章

《Python 自动化办公应用大全》书籍推荐(包邮送书五本)

前言 随着科技的快速发展和智能化办公的需求增加,Python自动化办公成为了一种趋势。Python作为一种高级编程语言,具有简单易学、功能强大和开放源代码等优势,可以帮助我们更高效地完成日常办公任务。 Python自动化办公还可以帮助我们实现更…

数据结构-二叉查找树(BST)

二叉查找树 需要满足这些规则: 左子节点小于父节点右子节点大于父节点 查找的效率 非常好,每次都能根据大小去舍弃另一半的分支,极大的减少的比对次数 具体的性能,取决于树的层数和平衡程度。 BST树的节点 struct Node {No…

HTML5+CSSday4综合案例二——banner效果

bannerCSS展示图&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wi…

Unity实现设计模式——策略模式

Unity实现设计模式——策略模式 策略模式是一种定义一些列算法的方法&#xff0c;这些所有的算法都是完成相同的工作&#xff0c;只是实现不同。它可以通过相同的方式调用所有的算法&#xff0c;减少各种算法类与使用算法类之间的耦合。 策略模式的 Strategy 类层次为 Contex…

微信黑名单在哪里找出来?掌握4个步骤即可!

微信的黑名单功能可以帮助用户过滤掉一些不友好的联系人&#xff0c;从而在一定程度上限制与这些联系人的互动。在使用微信的过程中&#xff0c;如果不想被一些陌生人或者恶意用户骚扰&#xff0c;那么可以通过将这些人拉入黑名单来阻断联系。 但是如果是和熟人吵架&#xff0…

SpringBoot 如何使用 Micrometer 进行度量和监控

使用Micrometer进行度量和监控Spring Boot应用程序 在构建和维护现代应用程序时&#xff0c;度量和监控是至关重要的&#xff0c;它们可以帮助您了解应用程序的性能、稳定性和可用性。Spring Boot提供了集成Micrometer的功能&#xff0c;使得度量和监控变得非常容易。本文将介…

设计模式 - 访问者模式

目录 一. 前言 二. 实现 三. 优缺点 一. 前言 访问者模式&#xff0c;即在不改变聚合对象内元素的前提下&#xff0c;为聚合对象内每个元素提供多种访问方式&#xff0c;即聚合对象内的每个元素都有多个访问者对象。访问者模式主要解决稳定的数据结构和易变元素的操作之间的…

DCE/RPC协议详解之-数据包请求响应过程

在windows的域环境中有非常多的协议和服务是基于DCE/RPC协议进行实现的,例如NETLOGON,LSA,SAMR,DSSETUP等。因此在 windows的环境下会大量的遇到DCE/RPC协议,因此有必要对该协议有一个初步的了解,这样的话在遇到对应的数据包,则能够比较清楚的还原数据包中发生了什么。本…

长沙旅行见闻实用帖

最近趁着假期&#xff0c;来了趟长沙游&#xff0c;还是有很多值得记录下来的。 众所周知&#xff0c;长沙市是湖南省的省会城市&#xff0c;也是国务院批复确定的长江中游地区重要的中心城市和长株潭城市群中心城市。它位于湖南省中部偏东&#xff0c;湘江下游&#xff0c;辖6…

常见弯道输送机有哪些

提到弯道输送机您可能首先想到的就是弯道滚筒线&#xff0c;其实除了滚筒线之外&#xff0c;也有一些其他线体可以做弯道&#xff0c;下面就为您总结了4种常见的弯道输送机。 1、弯道皮带线&#xff1a;即线体转弯处设计成皮带输送机&#xff0c;这种形式的转弯设计可以实现不同…

Xcode 15 编译出错问题解决

正常升级xcode 15以后发现原来没有出现报错的代码&#xff0c;现在出现了编译错误。&#xff08;如果没有出现请忽略&#xff09;下面教你如何解决这个问题。 1、pod update更新cocoapods&#xff0c;因为其根据xcode15做了很多的更新&#xff0c;保证cocoapods是最新的。 千…

深入理解PKI

安全始终是网络通信的核心议题&#xff0c;PKI提供了一组标准的网络安全组件&#xff0c;可以为通信双方提供加密、完整性保护、认证等安全基础设施。原文: Public Key Infrastructure (PKI) Jacek DylagUnsplash 由于用户名和密码不足以验证用户的身份&#xff0c;因此PKI(公钥…

数据结构 | (二) List

什么是 List 在集合框架中&#xff0c; List 是一个接口&#xff0c;继承自 Collection 。 Collection 也是一个接口 &#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&#xff1a; Iterable 也是一个接口&#xff0c;表示实现该接口的类是可以逐个…

iPhone15手机拓展坞方案,支持手机快充+传输数据功能

手机拓展坞的组合有何意义&#xff1f;首先是数据存储场景&#xff0c;借助拓展坞扩展出的接口&#xff0c;可以连接U盘、移动硬盘等采用USB接口的设备&#xff0c;实现大文件的快速存储或者流转&#xff1b;其次是图片、视频的读取场景&#xff0c;想要读取相机、无人机SD/TF存…

阿里云ESS弹性伸缩的实例配置以及伸缩组规则配置

文章目录 1.配置伸缩组的实例来源信息1.1.创建伸缩组实例来源配置属性1.2.查看创建的伸缩来源配置信息 2.配置伸缩组的触发规则2.1.创建伸缩规则2.2.创建扩展实例的伸缩规则2.3.创建缩减实例的伸缩规则2.4.扩展缩减规则添加完成 1.配置伸缩组的实例来源信息 伸缩组的属性已经配…

自监督DINO论文笔记

论文名称&#xff1a;Emerging Properties in Self-Supervised Vision Transformers 发表时间&#xff1a;CVPR2021 作者及组织&#xff1a; Facebook AI Research GitHub&#xff1a;https://github.com/facebookresearch/dino/tree/main 问题与贡献 作者认为self-supervise…

【计算机网络黑皮书】传输层

【事先声明】 这是对于中科大的计算机网络的网课的学习笔记&#xff0c;感谢郑烇老师的无偿分享 书籍是《计算机网络&#xff08;自顶向下方法 第6版&#xff09;》 需要的可以私信我&#xff0c;无偿分享&#xff0c;课程简介下也有 课程链接 目录 传输服务与协议网络层与传输…

非局部均值滤波的指令集优化和加速(针对5*5的搜索特例,可达到单核1080P灰度图 28ms/帧的速度)。

非局部均值滤波(Non Local Means&#xff09;作为三大最常提起来的去燥和滤波算法之一&#xff08;双边滤波、非局部均值、BM3D&#xff09;&#xff0c;也是有着很多的论文作为研究和比较的对象&#xff0c;但是也是有着致命的缺点&#xff0c;速度慢&#xff0c;严重的影响了…

【Spring】Spring MVC 程序开发

Spring MVC 程序开发 一. 什么是 Spring MVC1. MVC2. Spring、Spring Boot 与 Spring MVC 二. 创建 Spring MVC 项目1. 创建项目2. 用户和程序的映射3. 获取用户请求参数①. 获取单个参数②. 获取多个参数③. 传递对象④. 后端参数重命名&#xff08;后端参数映射&#xff09;R…

谈谈Android Jetpack Compose中的状态提升

谈谈Android Jetpack Compose中的状态提升 在本文中&#xff0c;我们将了解Jetpack Compose中的状态提升&#xff08;State Hoisting&#xff09;。在深入研究这个主题之前&#xff0c;让我们先了解一下Jetpack Compose中的有状态&#xff08;Stateful&#xff09;和无状态&am…