长连接和短链接详解

news2024/12/25 23:52:07

长连接和短链接详解

日常工作和生活中接触到的软件系统大多数情况下是由多个进程共同协作进行的,所以,了解进程之间如何进行高效的通信至关重要。
进程之间的通信有不少方式包括管道(包括无名管道和命名管道)、消息队列、信号量、共享存储等,今天记录下基于TCP/IP通信方式的长连接和短连接。

在了解长连接和短连接之前,先介绍下TCP/IP。
TCP/IP网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合,作为互联网的基础协议,没有它就根本不可能上网,任何和互联网有关的操作都离不开TCP/IP协议。同时OSI七层模型也是要深入计算机网络必须掌握的东西。

OSI七层模型

物理层:

物理层负责最后将信息编码成电流脉冲或其它信号用于网上传输;
eg:RJ45等将数据转化成0和1;

数据链路层:

数据链路层通过物理网络链路􏰁供数据传输。不同的数据链路层定义了不同的网络和协 议特征,其中包括物理编址、网络拓扑结构、错误校验、数据帧序列以及流控;
可以简单的理解为:规定了0和1的分包形式,确定了网络数据包的形式;

网络层

网络层负责在源和终点之间建立连接;
可以理解为,此处需要确定计算机的位置,怎么确定?IPv4,IPv6!

传输层

传输层向高层􏰁提供可靠的端到端的网络数据流服务。
可以理解为:每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信!常用的(TCP/IP)协议;

会话层

会话层建立、管理和终止表示层与实体之间的通信会话;
建立一个连接(自动的手机信息、自动的网络寻址);

表示层:

表示层􏰁供多种功能用于应用层数据编码和转化,以确保以一个系统应用层发送的信息 可以被另一个系统应用层识别;
可以理解为:解决不同系统之间的通信,eg:Linux下的QQ和Windows下的QQ可以通信;

应用层:

OSI 的应用层协议包括文件的传输、访问及管理协议(FTAM) ,以及文件虚拟终端协议(VIP)和公用管理系统信息(CMIP)等;
规定数据的传输协议;
常见的应用层协议:
在这里插入图片描述
在这里插入图片描述

值得注意的是http与https协议都是应用层协议,而tcp协议才是传输层协议,所以通常长短连接指的是tcp连接而非http连接。打个形象的比喻: 拿你在网上购物来说,HTTP协议是指的那个快递单,你寄件的时候填的单子就像是发了一个HTTP请求,等货物运到地方了,快递员会根据你发的请求把货物送给相应的收货人。而TCP协议就是中间运货的那个大货车,也可能是火车或者飞机,但不管是什么,它是负责运输的,因此必须要有路,不管是地上还是天上。那么这个路就是所谓的TCP连接,也就是一个双向的数据通道。

TCP连接

当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的。

经典的三次握手示意图:
在这里插入图片描述
经典的四次握手关闭图:
在这里插入图片描述

HTTP协议与TCP/IP协议的关系

HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。

如何理解HTTP协议是无状态的

HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。

什么是长连接、短连接?

在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。

但从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:

Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

TCP短连接

我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server 发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起 close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情况。从上面的描述看,短连接一般只会在 client/server间传递一次读写操作

短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段

TCP长连接

接下来我们再模拟一下长连接的情况,client向server发起连接,server接受client连接,双方建立连接。client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

首先说一下TCP/IP详解上讲到的TCP保活功能,保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务 器端检测到这种半开放的连接。

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

客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。

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

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

客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。

长连接短连接建立过程

短连接的建立过程是:

建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接

长连接的建立过程是:

建立连接——数据传输…(保持连接)…数据传输——关闭连接

长连接和短连接的优点和缺点

由上可以看出,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可 以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。

短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

长连接和短连接的产生在于client和server采取的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。

长连接和短连接的应用场景

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。

例 数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短链好。

今天的分享就到此结束了

欢迎点赞评论互关三连

在这里插入图片描述

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

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

相关文章

Vue3在外部js文件获取Vue实例对象中的方法

刚开始想用getCurrentInstance 获取 发现这玩意只能写在setUp里面 然后百度发现在外部js文件只能先引入main.js在使用,这里注意要先将app实例导出 然后在外部js引用 就能获取到实例对象了 这点跟Vue2还是有很大区别

【SLAM14讲】 SLAM数学基础

一、向量 我们确定一个坐标系,也就是一个线性空间的基 (e1, e2, e3), 那就可以谈论向量 a 在这组基下的坐标了: 1.1 内积 内积可以描述向量间的投影关系 1.2 外积 外积的方向垂直于这两个向量,大小为 |a| |b|sin 〈a, b〉&…

【生态系统服务】构建生态安全格局--权衡与协同动态分析--多情景模拟预测--社会价值评估

生态系统服务 生态系统服务(ecosystem services)是指人类从生态系统获得的所有惠益,包括供给服务(如提供食物和水)、调节服务(如控制洪水和疾病)、文化服务(如精神、娱乐和文化收益…

vite + vue3 + tailwindcss

要在Vite Vue3中使用Tailwind CSS 创建项目 pnpm create vite在项目根目录中打开终端,并运行以下命令安装Tailwind CSS和相关依赖: pnpm install tailwindcss postcss autoprefixer执行 npx tailwindcss init,自动生成配置文件在tailwind.c…

【Unity3D】选中物体消融特效

1 消融特效原理 当前实现消融特效的方法主要有 Alpha 测试消融、clip(或 discard)消融,它们的本质都是随机丢弃一些片元,以实现消融效果。 1)噪声纹理 为模拟随机效果,可以通过对噪声纹理进行采样实现&…

Linux操作系统详解

文章目录 引言1. 认识Linux1.1 操作系统概述1.2 认识Linux1.3 虚拟机介绍1.4 远程连接Linux操作系统1.5 WSL1.6 虚拟机快照 2. Linux基础命令2.1 Linux的目录结构2.2 命令入门2.3 目录切换相关命令(cd/pwd)2.4 相对路径,绝对路径和特殊路径符…

当某个微服务重启后,GateWay网关访问服务出现503的问题

因为开发阶段可能需要经常重启微服务,但有时会莫名奇妙返回503 Service Unavailable 由于从springcloud2020版本开始,弃用了Ribbon,因此Alibaba在2021及之后版本的nacos中删除了Ribbon的jar包,因此无法通过loadbalancer路由到指定…

SpringBoot使用AOP

Spring相信大家都学过,就不多述了。 自定义注解,注解的类中所有的接口都会执行AOP增强,注解的接口会执行AOP增强。 注解类: package xin.students.examManagement.annotation.springConfiguration;import java.lang.annotation…

tensorboard 如何导出数据

tensorboard 如何导出数据 场景描述:有时候在第一遍跑实验的时候,由于epoch和内部循环变量的原因,做出来的图可能不是我们想要的,这个时候,需要自己导出数据并且重新画图,本文介绍如何导出数据道json或csv格…

超声波功率放大器在超声驱动技术中的应用

超声波功率放大器是一种能够将低功率信号放大到足够高的电平的电子器件。在超声驱动技术中,超声波功率放大器被广泛应用于超声波发生器、超声波换能器和超声波传感器等部件中,以保证这些部件的正常工作和高效性能。 超声波功率放大器在超声驱动技术中的应…

C++primer(第五版)第十二章(动态内存)

C中内存包含静态内存,栈内存,自由空间(堆). 静态内存用于保存局部的static(静态)对象,以及定义于任何函数以外的变量(全局变量). 栈内存用来保存定义在函数内的非static对象,由编译器自动创建和销毁. 程序可以用堆来存储动态分配的对象,同时也需要由我们来显式地销毁. 12.1…

【第四天学习】数组

数组批量数据处理 数组的定义 速度是一个相同类型的用同一个标识符封装到一起的基本数据类型,可以使用一个统一的速度名或者是索引来唯一确定速度中的每个元素,它的执行效率非常高。 数组中每一个变量称为数组的元素,数组能够容纳元素的数…

Centos7安装wordpress图文教程

宝塔面板安装WordPress有两种方法: 自己手动安装(推荐)宝塔后台一键部署跳转提示 推荐使用手动安装,因为一键部署的WordPress版本不是最新的,而且自己上传的文件比较放心。 第一步,上传WordPress安装包 …

提升UE5写实效果的项目设置

随着虚幻引擎5(Unreal Engine 5,简称UE5)的发布,游戏开发者和数字艺术家们迎来了一个全新的机会,可以在其强大的渲染引擎下创建更加逼真和令人惊叹的游戏和虚拟场景。然而,要实现出色的写实效果&#xff0c…

经典轻量级神经网络(2)MobileNetV2及其在Fashion-MNIST数据集上的应用

经典轻量级神经网络(2)MobileNet V2及其在Fashion-MNIST数据集上的应用 1 MobileNet V2的简述 MobileNet V2 创新性的提出了具有线性bottleneck 的Inverted 残差块。这种块特别适用于移动设备和嵌入式设备,因为它用到的张量都较小,因此减少了推断期间的…

Redis 入门指南

Redis 入门指南 目录 Redis 入门指南 Redis 基本概念 Redis 常用命令 字符串String操作命令: 哈希Hash操作命令: 列表list操作命令 集合set操作命令: 有序集合sorted set 操作命令 通用命令 在Java中操作 Redis 1.Jedis 2.Spring …

windows后台窗口启动jar包

启动命令 chcp 65001 //切换utf-8 echo off start javaw -jar test-1.0-SNAPSHOT.jar --spring.profiles.activeprod echo 启动成功,按任意键结束 pause exit查看后台进程命令 wmic process where caption"javaw.exe" get processid,caption,commandli…

手机里的视频怎么转换成MP4格式?简单的转换方法分享

MP4格式是一种广泛使用的视频格式,几乎所有设备和操作系统都支持MP4格式的视频播放。无论是使用 iPhone、iPad、安卓手机、电视等各种设备,都可以播放 MP4 格式的视频。这种广泛的兼容性使得 MP4 成为一种非常方便的视频格式,我们可以随时随地…

IDEA自动生成实体类

操作流程 第一次需要配置Generate POJOs.groovy 新建该文件 Generate POJOs.groovy import com.intellij.database.model.DasTable import com.intellij.database.model.ObjectKind import com.intellij.database.util.Case import com.intellij.database.util.DasUtil import…

嵌入式面试刷题(day1)

文章目录 前言一、由for( ; ;)引出的一系列问题二、sizeof和strlen的误区三、字符串转义字符带来的问题四、结构体概念模糊五、!和~概念分不清六、switch case误区七、短路运算八、复合赋值运算符带来的问题九、什么是左值什么是右值十、struct和union总结 前言 最…