消息队列篇--通信协议篇--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!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity学习22:Application类其他功能

目录 1 是否允许后台运行 1.1 Application.runInBackground,显示是否允许后台运行 1.2 设置的地方 2 打开URL 2.1 Application.OpenURL("") 打开超链接 3 退出游戏 3.1 Application.Quit() 退出游戏 4 场景相关 5 返回游戏状态 6 控制游戏的行…

deepseek R1 14b显存占用

RTX2080ti 11G显卡,模型7b速度挺快,试试14B也不错。 7B显存使用5.6G,14B显存刚好够,出文字速度差不多。 打算自己写个移动宽带的IPTV播放器,不知道怎么下手,就先问他了。

.NET Core缓存

目录 缓存的概念 客户端响应缓存 cache-control 服务器端响应缓存 内存缓存(In-memory cache) 用法 GetOrCreateAsync 缓存过期时间策略 缓存的过期时间 解决方法: 两种过期时间策略: 绝对过期时间 滑动过期时间 两…

C++,STL 六大组件:容器、迭代器、算法、函数对象、适配器、分配器

文章目录 引言一、容器(Containers)主要分类 二、迭代器(Iterators)三、算法(Algorithms)四、函数对象(Functors)五、适配器(Adapters)六、分配器&#xff08…

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…

【懒删除堆】力扣2349. 设计数字容器系统

设计一个数字容器系统,可以实现以下功能: 在系统中给定下标处 插入 或者 替换 一个数字。 返回 系统中给定数字的最小下标。 请你实现一个 NumberContainers 类: NumberContainers() 初始化数字容器系统。 void change(int index, int numb…

利用飞书机器人进行 - ArXiv自动化检索推荐

相关作者的Github仓库 ArXivToday-Lark 使用教程 Step1 新建机器人 根据飞书官方机器人使用手册,新建自定义机器人,并记录好webhook地址,后续将在配置文件中更新该地址。 可以先完成到后续步骤之前,后续的步骤与安全相关&…

SpringBoot 日志

目录 一. 日志概述 二. 日志的使用 1. 打印日志 (1) 获取日志对象 (2) 输出要打印的内容 2. 日志框架简介 (1) 门面模式简介 (2) SLF4J 框架简介 3. 日志的格式 4. 日志的级别 5. 日志配置 (1) 配置日志级别 (2) 日志持久化存储 ① 配置日志文件名 ② 配置日志的…

RK3568中使用QT opencv(显示基础图像)

文章目录 一、查看对应的开发环境是否有opencv的库二、QT使用opencv 一、查看对应的开发环境是否有opencv的库 在开发板中的/usr/lib目录下查看是否有opencv的库: 这里使用的是正点原子的ubuntu虚拟机,在他的虚拟机里面已经安装好了opencv的库。 二、…

LMI Gocator GO_SDK VS2019引用配置

LMI SDK在VS2019中的引用是真的坑爹,总结一下经验,希望后来的人能少走弯路.大致内容如下: (1) 环境变量 (2)C/C 附加包含目录 E:\GWQ\Gocator\GO_SDK\Gocator\GoSdk E:\GWQ\Gocator\GO_SDK\Platform\kApi (3&#…

模型I/O

文章目录 什么是模型I/O模型I/O功能之输出解析器输出解析器的功能输出解析器的使用Pydantic JSON输出解析器结构化输出解析器 什么是模型I/O 模型I/O在所有LLM应用中,核心元素无疑都是模型本身。与模型进行有效的交互是实现高效、灵活和可扩展应用的关键。LangChain…

C语言练习(31)

有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。 设5名学生的学号、姓名和3门课程成绩如下&am…

【Block总结】DynamicFilter,动态滤波器降低计算复杂度,替换传统的MHSA|即插即用

论文信息 标题: FFT-based Dynamic Token Mixer for Vision 论文链接: https://arxiv.org/pdf/2303.03932 关键词: 深度学习、计算机视觉、对象检测、分割 GitHub链接: https://github.com/okojoalg/dfformer 创新点 本论文提出了一种新的标记混合器(token mix…

「AI学习笔记」深度学习的起源与发展:从神经网络到大数据(二)

深度学习(DL)是现代人工智能(AI)的核心之一,但它并不是一夜之间出现的技术。从最初的理论提出到如今的广泛应用,深度学习经历了几乎一个世纪的不断探索与发展。今天,我们一起回顾深度学习的历史…

Axure PR 9 旋转效果 设计交互

大家好,我是大明同学。 这期内容,我们将学习Axure中的旋转效果设计与交互技巧。 旋转 创建旋转效果所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个按钮元件。 创建交互 创建按钮交互状态 1.选中按钮元件&#xf…

【外文原版书阅读】《机器学习前置知识》2.用看电影推荐的例子带你深入了解向量点积在机器学习的作用

目录 3.3 Where Are You Looking, Vector? The Dot Product 个人主页:Icomi 大家好,我是Icomi,本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的内容的一个输出,希望…

论文阅读(八):结构方程模型用于研究数量遗传学中的因果表型网络

1.论文链接:Structural Equation Models for Studying Causal Phenotype Networks in Quantitative Genetics 摘要: 表型性状可能在它们之间发挥因果作用。例如,农业物种的高产可能会增加某些疾病的易感性,相反,疾病的…

每日一题——序列化二叉树

序列化二叉树 BM39 序列化二叉树题目描述序列化反序列化 示例示例1示例2 解题思路序列化过程反序列化过程 代码实现代码说明复杂度分析总结 BM39 序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。二叉树的序列化是将二叉树按照某种遍历方式…

JVM_程序计数器的作用、特点、线程私有、本地方法的概述

①. 程序计数器 ①. 作用 (是用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令) ②. 特点(是线程私有的 、不会存在内存溢出) ③. 注意:在物理上实现程序计数器是在寄存器实现的,整个cpu中最快的一个执行单元 ④. 它是唯一一个在java虚拟机规…

Attention--人工智能领域的核心技术

1. Attention 的全称与基本概念 在人工智能(Artificial Intelligence,AI)领域,Attention 机制的全称是 Attention Mechanism(注意力机制)。它是一种能够动态分配计算资源,使模型在处理输入数据…