当前位置: 首页 > article >正文

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


http://www.kler.cn/a/519831.html

相关文章:

  • css3 svg制作404页面动画效果HTML源码
  • unity.NavMesh Agent
  • 【随手笔记】FFT资料整理
  • uva 1354 Mobile Computing
  • React和Vue有什么区别,如何选择?
  • [VSCode] vscode下载安装及安装中文插件详解(附下载链接)
  • Maui学习笔记-身份认证和授权案例
  • MAX98357A一款数字脉冲编码调制(PCM)输入D类音频功率放大器
  • RACER:基于去中心化多无人机系统的快速协同探索
  • Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架构与负载均衡方案
  • AI导航工具我开源了利用node爬取了几百条数据
  • SpringBoot整合Swagger UI 用于提供接口可视化界面
  • Java进阶(一)
  • 【字节青训营-5】:初探存储系统与数据库及技术原理,解析关系型、非关系型数据库
  • 文明6mod发布并开源:更多的蛮族营地扫荡收益mod
  • 【2024年华为OD机试】 (A卷,200分)- 计算网络信号、信号强度(JavaScriptJava PythonC/C++)
  • 【架构面试】一、架构设计认知
  • 软件测试压力太大了怎么办?
  • 【Linux笔记】Day3
  • Flutter android debug 编译报错问题。插件编译报错
  • C++多线程习题:非原创增加注释(02-2)
  • PHP:动态网站开发的强大引擎
  • LLaMA-Factory 微调LLaMA3
  • 深入理解Transformer中的解码器原理(Decoder)与掩码机制
  • WordPress event-monster插件存在信息泄露漏洞(CVE-2024-11396)
  • 刷题记录 贪心算法-2:455. 分发饼干