消息队列篇--通信协议篇--TCP和UDP(3次握手和4次挥手,与Socket和webSocket的概念区别等)
1、TCP和UDP概述
TCP(传输控制协议,Transmission Control Protocol)和UDP(用户数据报协议,User Datagram Protocol)都算是最底层的通信协议,它们位于OSI模型的传输层。*传输层的主要职责是确保数据能够在不同设备之间可靠地传输,并提供端到端的通信服务。*TCP和UDP是两种最常见的传输层协议,它们各自有不同的特点和适用场景。
TCP是一种面向连接、可靠的传输协议,适用于需要高可靠性和顺序保证的应用。它提供了流量控制、拥塞控制和重传机制,确保数据的完整性和正确性。然而,TCP的延迟较高,吞吐量也相对较低。
三次握手:(建立连接)
- 第一次握手:客户端发送SYN段给服务端。
- 第二次握手:服务器收到SYN后,发送SYN-ACK段给客户端。
- 第三次握手:客户端收到SYN-ACK后,发送ACK(确认)段。
注意:
为了确保连接创建的准确性,3次握手采用了计时+确认的机制。
即:客户端发出SYN后,会开始计时,在计时内收到服务端的SYN+ACK,那么就算是正常的。同理,服务端返回SYN+ACK时,也会开启计时,在计时内客户端返回ACK,则算是正常,完成连接创建。如果在有一次在计时内没有做出回应,那么连接就失败了,就需要重头来开始3次握手。
四次挥手:(终止连接)
- 第一次挥手:主动关闭方发送FIN段。
- 第二次挥手:被动关闭方发送ACK段。
- 第三次挥手:被动关闭方发送FIN段。
- 第四次挥手:主动关闭方发送ACK段,并进入TIME_WAIT状态。
UDP是一种无连接、不可靠的传输协议,适用于对实时性要求较高的应用。它具有较低的延迟和较高的吞吐量,但不提供可靠性保证。UDP适合用于那些可以容忍少量数据丢失的应用,如视频流、语音通话和在线游戏等。
选择使用TCP还是UDP取决于你的具体需求。如果你的应用需要高可靠性和顺序保证,那么TCP是更好的选择;如果你的应用对实时性要求较高,且可以容忍少量数据丢失,那么UDP更加合适。
2、TCP和UDP的区别

(1)、面向连接vs无连接
TCP是面向连接的协议,这意味着在数据传输之前,发送方和接收方必须先建立一个可靠的连接。这个过程通过三次握手来完成:发送方发送SYN(同步请求),接收方回应SYN-ACK(同步确认),然后发送方再发送ACK(确认)。只有当连接成功建立后,数据传输才能开始。传输结束后,还需要通过四次挥手来终止连接。
UDP则是无连接的协议,它不需要在数据传输之前建立连接。发送方可以直接发送数据报文(Datagram),而接收方也会立即接收。这种方式减少了建立连接的开销,但同时也意味着没有连接状态的维护。
(2)、可靠性
TCP提供了可靠的数据传输。它使用序列号和确认机制来确保每个数据包都能按顺序到达接收方。如果某个数据包丢失或损坏,TCP会自动请求重传该数据包,直到接收方确认收到为止。因此,TCP适合用于需要高可靠性的应用,如文件传输、电子邮件等。
UDP不提供可靠性保证。它只是简单地将数据报文发送出去,而不关心对方是否收到或是否按顺序接收。因此,UDP适合用于对实时性要求较高的应用,如视频流、语音通话等,这些应用即使偶尔丢失一些数据包也不会严重影响用户体验。
(3)、流量控制和拥塞控制
TCP提供了流量控制和拥塞控制机制。流量控制通过滑动窗口机制来限制发送方的发送速率,确保接收方不会因为接收到过多的数据而溢出。拥塞控制则通过慢启动、拥塞避免、快速重传和快速恢复等算法来避免网络拥塞,确保网络资源的有效利用。
UDP不提供流量控制和拥塞控制。发送方可以以任意速率发送数据,而不考虑网络的当前状态。这可能导致网络拥塞,尤其是在网络带宽有限的情况下。
(4)、头部开销
TCP的头部较大,通常为20字节(不含选项字段)。头部中包含了序列号、确认号、窗口大小等重要信息,用于实现可靠传输和流量控制。
UDP的头部较小,通常为8字节。头部中只包含了源端口、目标端口、长度和校验码,没有复杂的控制信息。因此,UDP的头部开销更小,适合对性能要求较高的应用。
(5)、延迟和吞吐量
TCP的延迟较高,因为它需要进行确认、重传等操作,确保数据的可靠传输。此外,TCP的流量控制和拥塞控制也会增加传输时间,因此它的吞吐量相对较低,尤其是在网络拥塞的情况下。但与此相反,TCP能提供可靠性和流量控制。
UDP的延迟较低,因为它没有确认和重传机制,数据可以直接发送和接收。这使得UDP更适合对实时性要求较高的应用,如视频流、语音通话等。由于UDP没有流量控制和拥塞控制,它的吞吐量较高,但在网络拥塞时可能会导致数据包丢失。
(6)、应用场景
TCP适用于需要高可靠性的应用,如:
- HTTP/HTTPS:网页浏览
- FTP:文件传输
- SMTP:电子邮件
- Telnet/SSH:远程登录
- 数据库通信:MySQL、PostgreSQL等
UDP适用于对实时性要求较高的应用,如:
- DNS:域名解析
- VoIP:语音通话(如 Skype、WhatsApp 语音)
- 视频流:在线视频播放(如 YouTube、Netflix)
- 在线游戏:多人游戏中的实时交互
- 实时监控:物联网设备的状态更新
扩展:TCP、Socket和WebSocket的区别
1、TCP (传输控制协议)
TCP是OSI模型中的传输层协议,负责提供可靠的数据传输服务。它确保数据包按顺序到达接收方,并且不会丢失或损坏。TCP通过序列号、确认机制、流量控制和拥塞控制等技术来保证数据的可靠性。
特点:
- 面向连接:在数据传输之前,发送方和接收方必须通过三次握手建立连接,传输结束后再通过四次挥手终止连接。
- 可靠传输:TCP提供了确认机制和重传机制,确保每个数据包都能按顺序到达接收方。
- 流量控制:通过滑动窗口机制限制发送方的发送速率,避免接收方溢出。
- 拥塞控制:通过慢启动、拥塞避免、快速重传和快速恢复等算法避免网络拥塞。
应用场景:
- HTTP/HTTPS:网页浏览
- FTP:文件传输
- SMTP:电子邮件
- Telnet/SSH:远程登录
- 数据库通信:MySQL、PostgreSQL等
TCP是一种底层的传输层协议,提供了可靠的、面向连接的通信服务。它是许多上层应用协议的基础,如HTTP、FTP、SMTP等。
2、Socket (套接字)
Socket是一个编程接口(API),用于实现网络通信。它位于应用层和传输层之间,允许应用程序通过网络与其他应用程序进行通信。Socket可以基于TCP或UDP协议工作,具体取决于应用的需求。
类型:
- 流式套接字(Stream Socket):基于TCP,提供可靠的、面向连接的通信。
- 数据报套接字(Datagram Socket):基于UDP,提供不可靠的、无连接的通信。
工作原理:
- 创建Socket:应用程序首先创建一个Socket对象,指定使用的协议(TCP或UDP)。
- 绑定地址:将Socket绑定到本地的IP地址和端口号。
- 监听连接(仅适用于服务器端):对于TCP Socket,服务器端需要调用listen()方法来等待客户端的连接请求。
- 建立连接(仅适用于TCP Socket):客户端通过connect()方法与服务器建立连接。
- 发送和接收数据:通过send()和recv()方法在客户端和服务器之间传输数据。
- 关闭连接:通信结束后,双方调用close()方法关闭连接。
(1)、基于TCP的Socket的代码示例
服务器端:
import java.io.*;
import java.net.;public class TCPServer {public static void main(String[] args) throws IOException {// 创建服务器Socket,监听8080端口ServerSocket serverSocket = new ServerSocket(8080);System.out.println("Server is listening on port 8080");// 等待客户端连接Socket clientSocket = serverSocket.accept();System.out.println("Client connected");// 获取输入输出流PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));// 读取客户端消息并回复String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println("Received: " + inputLine);out.println("Echo: " + inputLine);}// 关闭连接clientSocket.close();serverSocket.close();}
}
客户端:
import java.io.;
import java.net.;public class TCPClient {public static void main(String[] args) throws IOException {// 客户端,用于连接到服务器端Socket socket = new Socket("localhost", 8080);System.out.println("Connected to server");// 获取输入输出流PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));// 发送和接收消息String userInput;while ((userInput = stdIn.readLine()) != null) {out.println(userInput);System.out.println("Server response: " + in.readLine());}// 关闭连接socket.close();}
}
Socket是一个编程接口,允许应用程序通过网络与其他应用程序进行通信。它可以基于TCP或UDP协议工作,具体取决于应用的需求。Socket提供了低级别的网络通信功能,适合开发自定义的网络应用程序。
3、WebSocket
WebSocket是一种应用层协议,旨在提供全双工通信通道,允许客户端和服务器之间保持持久连接,并支持双向数据传输。WebSocket最初是为了改进Web浏览器和服务器之间的通信而设计的,但它也可以用于其他类型的客户端-服务器通信。
特点:
- 全双工通信:WebSocket允许客户端和服务器同时发送和接收数据,而不需要像HTTP那样依赖请求-响应模式。
- 持久连接:一旦连接建立,客户端和服务器可以持续交换数据,直到一方主动关闭连接。
- 低延迟:由于WebSocket使用的是持久连接,减少了每次通信的开销,因此具有较低的延迟。
- 基于HTTP升级:WebSocket连接是通过HTTP协议的Upgrade请求从HTTP协议升级而来,通常使用ws://或wss://(加密)URL方案。
- 支持文本和二进制数据:WebSocket可以传输文本数据(如JSON)和二进制数据(如图像、音频、视频等)。
工作原理:
1、握手阶段:客户端通过HTTP请求发起WebSocket连接,服务器响应并同意升级为WebSocket协议。
2、数据传输阶段:一旦连接建立,客户端和服务器可以自由地发送和接收数据帧。数据帧可以是文本帧或二进制帧。
3、关闭连接:当一方决定关闭连接时,会发送关闭帧,另一方收到后也会关闭连接。
示例代码:
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
import java.net.URISyntaxException;public class WebSocketExample extends WebSocketClient {public WebSocketExample(URI serverUri) {super(serverUri);}@Overridepublic void onOpen(ServerHandshake handshakedata) {System.out.println("Connected to server");// 发送消息到服务器send("Hello, Server!");}@Overridepublic void onMessage(String message) {System.out.println("Received from server: " + message);}@Overridepublic void onClose(int code, String reason, boolean remote) {System.out.println("Connection closed: " + reason);}@Overridepublic void onError(Exception ex) {ex.printStackTrace();}public static void main(String[] args) {try {// 创建 WebSocket 客户端并连接到服务器WebSocketExample client = new WebSocketExample(new URI("ws://localhost:8080"));client.connect();} catch (URISyntaxException e) {e.printStackTrace();}}
}
WebSocket是一种应用层协议,旨在提供全双工、低延迟的通信通道,特别适合实时应用,如聊天系统、在线游戏、股票交易平台等。它通过HTTP升级机制建立连接,并允许客户端和服务器之间持续交换数据。
4、三者的区别与联系

联系:
- TCP是Socket的基础,Socket通过TCP或UDP协议实现网络通信。TCP提供了可靠的、面向连接的传输服务,而Socket是应用程序与TCP或UDP交互的接口。
- WebSocket是一种应用层协议,它基于TCP协议工作,实际通过HTTP升级机制建立了更高效的全双工通信通道。WebSocket的底层仍然是基于TCP的,但它提供了比传统HTTP更强大的实时通信能力。
区别:
- TCP是一个传输层协议,专注于数据的可靠传输和连接管理。它是许多上层协议的基础,如HTTP、FTP、SMTP等。
- Socket是一个编程接口,允许应用程序通过网络与其他应用程序通信。它可以基于TCP或UDP协议工作,具体取决于应用的需求。
- WebSocket是一种应用层协议,专门用于实现实时、全双工的通信。它通过HTTP升级机制建立连接,并允许客户端和服务器之间持续交换数据。
5、综述
- TCP是一种传输层协议,提供了可靠的、面向连接的通信服务,是许多上层协议的基础。
- Socket是一个编程接口,允许应用程序通过网络与其他应用程序通信。它可以基于TCP或UDP协议工作,具体取决于应用的需求。
- WebSocket是一种应用层协议,旨在提供全双工、低延迟的通信通道,特别适合实时应用,如聊天系统、在线游戏等。它通过HTTP升级机制建立连接,并基于TCP协议工作。
选择使用哪种技术取决于你的具体需求:
- 如果你需要构建自定义的网络应用程序,并且需要可靠的、面向连接的通信,可以选择TCP Socket。
- 如果你需要实现实时、全双工的通信,特别是基于Web的应用,WebSocket是更好的选择。
- TCP是底层协议,通常由操作系统和网络库处理,开发者通常不需要直接操作TCP,而是通过Socket或WebSocket来实现通信。
乘风破浪!Dare to Be!!!
相关文章:
消息队列篇--通信协议篇--TCP和UDP(3次握手和4次挥手,与Socket和webSocket的概念区别等)
1、TCP和UDP概述 TCP(传输控制协议,Transmission Control Protocol)和UDP(用户数据报协议,User Datagram Protocol)都算是最底层的通信协议,它们位于OSI模型的传输层。*传输层的主要职责是确保…...
YOLOv9改进,YOLOv9检测头融合ASFF(自适应空间特征融合),全网首发
摘要 一种新颖的数据驱动的金字塔特征融合策略,称为自适应空间特征融合 (ASFF)。它学习了在空间上过滤冲突信息以抑制不一致的方法,从而提高了特征的尺度不变性,并引入了几乎免费的推理开销。 # 理论介绍 目标检测在处理不同尺度的目标时,常采用特征金字塔结构。然而,…...
Elastic Agent 对 Kafka 的新输出:数据收集和流式传输的无限可能性
作者:来 Elastic Valerio Arvizzigno, Geetha Anne 及 Jeremy Hogan 介绍 Elastic Agent 的新功能:原生输出到 Kafka。借助这一最新功能,Elastic 用户现在可以轻松地将数据路由到 Kafka 集群,从而实现数据流和处理中无与伦比的可扩…...
论文速读|Is Cosine-Similarity of Embeddings Really About Similarity?WWW24
论文地址: https://arxiv.org/abs/2403.05440 https://dl.acm.org/doi/abs/10.1145/3589335.3651526 bib引用: inproceedings{Steck_2024, series{WWW ’24},title{Is Cosine-Similarity of Embeddings Really About Similarity?},url{http://dx.doi.o…...
Midjourney中的强变化、弱变化、局部重绘的本质区别以及其有多逆天的功能
开篇 Midjourney中有3个图片“微调”,它们分别为: 强变化;弱变化;局部重绘; 在Discord里分别都是用命令唤出的,但如今随着AI技术的发达在类似AI可人一类的纯图形化界面中,我们发觉这样的逆天…...
基于 Node.js 的天气查询系统实现(附源码)
项目概述 这是一个基于 Node.js 的全栈应用,前端使用原生 JavaScript 和 CSS,后端使用 Express 框架,通过调用第三方天气 API 实现天气数据的获取和展示。 主要功能 默认显示多个主要城市的天气信息 支持城市天气搜索 响应式布局设计 深色主题界面 优雅的加载动画 技术栈 …...
时序数据库的使用场景
文章目录 前言一、特点二、工作原理三、常见的时序数据库四、使用场景优势总结 前言 时序数据库(Time Series Database, TSDB) 是一种专门设计用于存储和处理时序数据的数据库。时序数据是指按照时间顺序排列的数据,其中每个数据点通常包含时…...
计算机的错误计算(二百二十二)
摘要 利用大模型化简计算 实验表明,虽然结果正确,但是,大模型既绕了弯路,又有数值计算错误。 与前面相同,再利用同一个算式看看另外一个大模型的化简与计算能力。 例1. 化简计算摘要中算式。 下面是与一个大模型的…...
ThinkPHP 8模型与数据的插入、更新、删除
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...
c语言函数(详解)
目录 前言 一、函数的基本概念和作用 二、函数的声明和定义 三、函数参数的传递方式 四、函数的递归 五、函数指针 总结 前言 本文主要讲解了c语言函数方面的内容 函数的定义和调用函数的返回值和参数函数的作用域和生命周期 函数的声明和定义 函数声明和函数定义的区别函数声…...
为AI聊天工具添加一个知识系统 之70 详细设计 之11 维度运动控制的应用:上下文受控的自然语言
本文要点 要点 前面我们 讨论了 “维度”及其运动控制原理 以及 维度控制 如何在中台微服务架构中撑起了“架构师”角色的一片天。下面我们从 “维度”运动控制的一个典型应用场景:受控的自然语言 ”开始讨论。 拼块文字型风格: 维度运动控制下的受控自然语言…...
ios打包:uuid与udid
ios的uuid与udid混乱的网上信息 新人开发ios,发现uuid和udid在网上有很多帖子里是混淆的,比如百度下,就会说: 在iOS中使用UUID(通用唯一识别码)作为永久签名,通常是指生成一个唯一标识…...
数组,对象解构,forEach方法,filter方法
数组解构 对象结构 遍历数组 forEach方法 筛选数组 filter方法 渲染商品案例 forEach遍历数组,能得到每个数组中的数据,item是对象中的每个元素 将遍历的数组中每个对象 加到 str 中 将 str 字符串中的 8 个 div 添加到 list盒子中 对象解构并渲染 综…...
PSPNet
文章目录 摘要Abstract1. 引言2. 框架2.1 金字塔池化模块2.2 特征提取器的监督2.3 训练细节 3. 创新点和不足3.1 创新点3.2 不足 参考总结 摘要 PSPNet是一个改进了FCN-8s缺点的语义分割模型,它解决了FCN-8s的缺点——分割不够精细以及没有考虑上下文信息。PSPNet的…...
论文阅读的附录(七):Understanding Diffusion Models: A Unified Perspective(二):公式46的推导
Understanding Diffusion Models: A Unified Perspective(二):公式46的推导 文章概括要推导的公式1. 条件概率的定义2. 联合分布的分解2.1 联合分布的定义2.2 为什么可以这样分解?2.3 具体意义 3. 分母的分解:边际化规…...
BGP分解实验·12——配置路由反射器
当一个AS包含多个iBGP对等体时,路由反射器(Route-Reflector)非常有用,因为相对于iBGP路由反射器指定的客户端只需要和路由反射器建立邻居关系,从而降低了iBGP全互连的连接数量。路由反射器(RR)和…...
PCIe 个人理解专栏——【2】LTSSM(Link Training and Status State Machine)
前言: 链路训练和状况状态机LTSSM(Link Training and Status State Machine)是整个链路训练和运行中状态的状态转换逻辑关系图,总共有11个状态。 正文: 包括检测(Detect),轮询&…...
cmake 编译QT之JKQtPlotter-4.0.3
cmake 编译 JKQtPlotter-4.0.3 1.下载源码 源码地址:https://github.com/jkriege2/JKQtPlotter 2.编译 mkdir build cd buildDCMAKE_PREFIX_PATH指编译器目录 D:\ProgramFiles\cmake-3.25.0-rc1-windows-i386\bin\cmake.exe -G "Visual Studio 16 2019&qu…...
【C】memory 详解
<memory.h> 是一个 C 标准库头文件,提供了一组内存管理函数,用于分配、释放和操作动态内存。这些函数主要操作的是未初始化的内存块,是早期 C 编程中常用的内存操作工具。 尽管在现代 C 编程中更推荐使用<cstring>或<memory&…...
Python 爬虫 - Selenium 框架
Python 爬虫 - Selenium 框架 安装安装 Selenium安装 WebDriver 操作浏览器打开浏览器普通方式加载配置方式Headless 方式 设置浏览器窗口最大化显示最小化显示自定义大小 前进后退前进后退 元素定位根据 id 定位根据 name 定位根据 class 定位根据标签名定位使用 CSS 定位使用…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
运动控制--BLDC电机
一、电机的分类 按照供电电源 1.直流电机 1.1 有刷直流电机(BDC) 通过电刷与换向器实现电流方向切换,典型应用于电动工具、玩具等 1.2 无刷直流电机(BLDC) 电子换向替代机械电刷,具有高可靠性,常用于无人机、高端家电…...
