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

    @Override
    public void onOpen(ServerHandshake handshakedata) {
        System.out.println("Connected to server");
        // 发送消息到服务器
        send("Hello, Server!");
    }

    @Override
    public void onMessage(String message) {
        System.out.println("Received from server: " + message);
    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("Connection closed: " + reason);
    }

    @Override
    public 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!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot基于Spring Boot的智慧养老服务系统的设计与实现

系统介绍: 智慧养老服务系统是一种运用现代科技手段,整合各类养老资源,为老年人提供全方位、个性化服务的综合性平台。该系统通过智能化设备、大数据分析、云计算等技术,实现对老年人健康状况、生活需求的实时监控与精准匹配&…

深圳大学-智能网络与计算-实验一:RFID原理与读写操作

实验目的与要求 掌握超高频RFID标签的寻卡操作。掌握超高频RFID标签的读写操作。掌握超高频RFID标签多张卡读取时的防冲突机制。 方法,步骤 软硬件的连接与设置超高频RFID寻卡操作超高频RFID防冲突机制超高频RFID读写卡操作 实验过程及内容 一.软硬…

python实现http文件服务器访问下载

//1.py import http.server import socketserver import os import threading import sys# 获取当前脚本所在的目录 DIRECTORY os.path.dirname(os.path.abspath(__file__))# 设置服务器的端口 PORT 8000# 自定义Handler,将根目录设置为脚本所在目录 class MyHTT…

【unity游戏开发之InputSystem——02】InputAction的使用介绍(基于unity6开发介绍)

文章目录 前言一、InputAction简介1、InputAction是什么?2、示例 二、监听事件started 、performed 、canceled1、启用输入检测2、操作监听相关3、关键参数 CallbackContext4、结果 三、InputAction参数相关1、点击齿轮1.1 Actions 动作(1)动…

Python 在Word中添加、或删除超链接

在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超链接,用户可以轻松地导航到相关信息,从而增强文档的互动性和可读性。本文将介绍如何使用Python在Word中添加超链接、或删除Word文档中的超…

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看当前数据库是那个,删除数据库,使用数据库;查看当前数据库有哪些表

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库,创建表,创建表中的字段,创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后,那么我们就需要给这个表中 添加数…

Unity自学之旅05

Unity自学之旅05 Unity学习之旅⑤📝 AI基础与敌人行为🥊 AI导航理论知识(基础)开始实践 🎃 敌人游戏机制追踪玩家攻击玩家子弹碰撞完善游戏失败条件 🤗 总结归纳 Unity学习之旅⑤ 📝 AI基础与敌…

UDP 广播组播点播的区别及联系

1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址,又叫多播地址,他的前四位必须是1110,所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…

css粘性定位超出指定宽度失效问题

展示效果 解决办法&#xff1a;外层容器添加display:grid即可 完整代码 <template><div class"box"><div class"line" v-for"items in 10"><div class"item" v-for"item in 8">drgg</div>&…

携程旅行 登录分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 所有加密流程基本一样就说…

(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计

源码 论文 下载地址&#xff1a; ​​​​c​​​​​​c基于JAVA的网络通讯系统设计与实现(源码系统论文&#xff09;https://download.csdn.net/download/weixin_39682092/90299782https://download.csdn.net/download/weixin_39682092/90299782 第1章 绪论 1.1 课题选择的…

PageView组件的功能和用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了如何屏蔽事件关的内容,本章回中将介绍PageView Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的PageView是指左右滑动或者上下滑动显示不同的页面&#xff0c;Flutter把它…

《Memory Barriers a Hardware View for Software Hackers》阅读笔记

CPU 设计者引入内存屏障&#xff08;memory barriers&#xff09;是为了应对在多处理器系统&#xff08;SMP&#xff09;中&#xff0c;内存引用重排序可能导致的同步问题。尽管重排序可以提高性能&#xff0c;但在某些情况下&#xff08;如同步原语&#xff09;&#xff0c;正…

网络编程-网络原理HTTP1

文章目录 HTTP请求/响应的基本结构认识URLURL是什么和基本格式关于encoding机制 认识方法(method)GET方法简介GET方法的特点POST方法简介POST方法的特点GET和POST的区别(经典面试题)关于GET和POST的补充说明Restful风格 上节主要是对http协议的一些最基本的概念做出一些说明, 然…

Facebook广告点击率CTR太低 如何优化

在投放Facebook广告的过程中&#xff0c;点击率CTR是一个衡量广告效果的重要指标&#xff0c;和广告质量、受众定位准确性、转化率等息息相关&#xff0c;因此&#xff0c;提升CTR是一个重要的广告优化流程。 一、什么是Facebook广告点击率&#xff0c;如何查看&#xff1f; C…

编写、应用中断例程

实验内容、程序清单及运行结果 编写、应用中断例程&#xff08;课本实验13&#xff09; 编写并安装int 7ch中断例程&#xff0c;功能为显示一个用0结束的字符串&#xff0c;中断例程安装在0:200处。 assume cs:code data segment db welcome to masm!,0 data ends code s…

WPF基础 | WPF 基础概念全解析:布局、控件与事件

WPF基础 | WPF 基础概念全解析&#xff1a;布局、控件与事件 一、前言二、WPF 布局系统2.1 布局的重要性与基本原理2.2 常见布局面板2.3 布局的测量与排列过程 三、WPF 控件3.1 控件概述与分类3.2 常见控件的属性、方法与事件3.3 自定义控件 四、WPF 事件4.1 路由事件概述4.2 事…

ssh密钥登录GitHub时一直提示“Error: Permission denied (publickey)”

起因 环境&#xff1a;Windows10 背景&#xff1a;之前就是按照官方说明创建个rsa密钥&#xff0c;在git后台添加上&#xff0c;就行了&#xff0c;近期怎么添加怎么失败&#xff0c;总是“Error: Permission denied (publickey)”的提示&#xff01; 尝试 各种尝试&#xf…

ESP32S3基于espidf lvgl驱动i2c ssd1306/sh1106/7屏幕使用

ESP32S3基于espidf lvgl驱动i2c ssd1306/sh1106/7屏幕使用 &#x1f516;个人使用的espidf版本&#xff1a;V5.4&#xff0c;lvgl组件版本&#xff1a;8.3.0&#xff08;可在idf_component.yml文件中看到&#xff09; 对于 i2c ssd1306接口屏幕&#xff0c;可以直接使用自带的d…

C++ 复习总结记录十

C 复习总结记录十 主要内容 1、stack 介绍和使用 2、queue 介绍和使用 3、priority_queue 介绍和使用 4、容器适配器 一 stack 的介绍和使用 stack 文档介绍 1、 stack 是容器适配器&#xff0c;专用于后进先出的操作&#xff0c;只能从容器尾端进行元素插入和提取 2、…