udp和tcp的区别

devtools/2025/2/6 9:08:55/

目录

udp-和-tcp-的区别-toc" name="tableOfContents" style="margin-left:80px">UDP 和 TCP 的区别

1. 连接性

2. 可靠性

3. 数据传输顺序

4. 流量控制和拥塞控制

5. 效率

6. 应用场景

udp-和-tcp-的-cc-代码实现区别-toc" name="tableOfContents" style="margin-left:80px">UDP 和 TCP 的 C/C++ 代码实现区别

1. TCP 服务器端和客户端

TCP 服务器端(Server)

TCP 客户端(Client)

udp-服务器端和客户端-toc" name="tableOfContents" style="margin-left:120px">2. UDP 服务器端和客户端

udp-服务器端(server)-toc" name="tableOfContents" style="margin-left:160px">UDP 服务器端(Server)

udp-客户端(client)-toc" name="tableOfContents" style="margin-left:160px">UDP 客户端(Client)

主要区别:

总结:


 

udp-和-tcp-的区别" name="udp-和-tcp-的区别">UDP 和 TCP 的区别

UDP(User Datagram Protocol)和 TCP(Transmission Control Protocol)是两种不同的传输层协议,它们在数据传输的可靠性、连接性、数据传输方式等方面有显著的区别。

1. 连接性
  • TCP:面向连接,通信前必须先建立连接。发送和接收数据前需要通过三次握手(three-way handshake)来建立连接。
  • UDP:无连接,不需要建立连接。发送数据时不进行握手,直接发送。
2. 可靠性
  • TCP:提供可靠的传输保证。TCP 通过确认(ACK)机制确保数据的可靠传输。如果数据丢失或损坏,TCP 会进行重传。
  • UDP:不保证可靠性。数据包可能丢失、重复或乱序,应用程序需要自行处理丢包和错误的情况。
3. 数据传输顺序
  • TCP:保证数据按发送顺序到达接收端。如果数据包乱序,TCP 会进行重排序。
  • UDP:不保证数据的顺序,数据可能以任意顺序到达接收端。
4. 流量控制和拥塞控制
  • TCP:有流量控制和拥塞控制机制,可以根据网络状况调整数据传输速度。
  • UDP:没有流量控制和拥塞控制机制,发送速度不受限制,可能导致网络拥堵。
5. 效率
  • TCP:由于需要建立连接、数据确认、重传等机制,TCP 的开销较大,效率相对较低。
  • UDP:由于没有连接建立、确认等机制,UDP 更加轻量高效,适用于需要快速传输且能容忍丢包的场景(例如视频流、DNS 查询等)。
6. 应用场景
  • TCP:适用于要求数据可靠性和顺序的应用,如文件传输、网页浏览(HTTP/HTTPS)、电子邮件(SMTP)等。
  • UDP:适用于不需要确保可靠性和顺序的应用,如实时视频、语音通话、在线游戏、DNS 查询等。

udp-和-tcp-的-cc-代码实现区别" name="udp-和-tcp-的-cc-代码实现区别">UDP 和 TCP 的 C/C++ 代码实现区别

1. TCP 服务器端和客户端

TCP 是面向连接的协议,因此需要先建立连接。以下是一个简单的 TCP 服务器和客户端的示例。

TCP 服务器端(Server)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080int main() {int server_fd, new_socket;struct sockaddr_in address;int addr_len = sizeof(address);char buffer[1024] = {0};// 创建服务器 socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 绑定地址和端口if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 监听端口if (listen(server_fd, 3) < 0) {perror("listen failed");exit(EXIT_FAILURE);}// 接受客户端连接if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addr_len)) < 0) {perror("accept failed");exit(EXIT_FAILURE);}// 接收数据read(new_socket, buffer, 1024);printf("Received message: %s\n", buffer);// 发送响应send(new_socket, "Hello from server", strlen("Hello from server"), 0);printf("Response sent\n");close(new_socket);close(server_fd);return 0;
}
TCP 客户端(Client)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080int main() {int sock = 0;struct sockaddr_in server_address;char *message = "Hello from client";char buffer[1024] = {0};// 创建 socketif ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("Socket creation error");exit(EXIT_FAILURE);}server_address.sin_family = AF_INET;server_address.sin_port = htons(PORT);// 转换 IPv4 地址if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {perror("Invalid address");exit(EXIT_FAILURE);}// 连接服务器if (connect(sock, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {perror("Connection failed");exit(EXIT_FAILURE);}// 发送消息send(sock, message, strlen(message), 0);printf("Message sent\n");// 接收响应read(sock, buffer, 1024);printf("Received from server: %s\n", buffer);close(sock);return 0;
}
udp-服务器端和客户端" name="2-udp-服务器端和客户端">2. UDP 服务器端和客户端

UDP 是无连接的协议,因此不需要建立连接。以下是一个简单的 UDP 服务器和客户端的示例。

udp-服务器端(server)" name="udp-服务器端(server)">UDP 服务器端(Server)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080
#define MAXLINE 1024int main() {int sockfd;char buffer[MAXLINE];struct sockaddr_in server_address, client_address;socklen_t len;ssize_t n;// 创建 UDP socketif ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("Socket creation failed");exit(EXIT_FAILURE);}memset(&server_address, 0, sizeof(server_address));server_address.sin_family = AF_INET;server_address.sin_addr.s_addr = INADDR_ANY;server_address.sin_port = htons(PORT);// 绑定地址和端口if (bind(sockfd, (const struct sockaddr *)&server_address, sizeof(server_address)) < 0) {perror("Bind failed");exit(EXIT_FAILURE);}len = sizeof(client_address);n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, (struct sockaddr *)&client_address, &len);buffer[n] = '\0';printf("Client message: %s\n", buffer);sendto(sockfd, "Hello from server", strlen("Hello from server"), MSG_CONFIRM, (const struct sockaddr *)&client_address, len);printf("Response sent\n");close(sockfd);return 0;
}
udp-客户端(client)" name="udp-客户端(client)">UDP 客户端(Client)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080
#define MAXLINE 1024int main() {int sockfd;char *message = "Hello from client";char buffer[MAXLINE];struct sockaddr_in server_address;// 创建 UDP socketif ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("Socket creation failed");exit(EXIT_FAILURE);}memset(&server_address, 0, sizeof(server_address));server_address.sin_family = AF_INET;server_address.sin_port = htons(PORT);// 转换 IPv4 地址if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {perror("Invalid address");exit(EXIT_FAILURE);}// 发送消息sendto(sockfd, message, strlen(message), MSG_CONFIRM, (const struct sockaddr *)&server_address, sizeof(server_address));printf("Message sent\n");// 接收响应ssize_t n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, NULL, NULL);buffer[n] = '\0';printf("Received from server: %s\n", buffer);close(sockfd);return 0;
}

主要区别:

  1. 连接

    • TCP:需要调用 connect() 和 accept() 建立连接。
    • UDP:不需要建立连接,直接使用 sendto() 和 recvfrom()
  2. 数据传输

    • TCP:发送数据时会自动保证数据的顺序和可靠性。
    • UDP:没有顺序和可靠性保证,发送的数据包直接传输。
  3. 接收数据

    • TCPread() 或 recv() 接收的数据来自已连接的套接字。
    • UDPrecvfrom() 接收的数据来自任何发送方,不需要建立连接。

总结:

  • TCP 是面向连接的、可靠的协议,适合需要数据完整性和顺序的应用。
  • UDP 是无连接的、不可靠的协议,适合实时性要求高但能容忍丢包的应用。

http://www.ppmy.cn/devtools/156499.html

相关文章

Vue.js 异步、延迟组件加载

Vue.js 异步、延迟组件加载 今天我们来聊聊 Vue 3 中的一个非常实用的优化技巧&#xff1a;异步/延迟组件加载。我们将通过 Vue 3 的一些语法糖来提升性能&#xff0c;特别是在渲染大量组件时&#xff0c;异步加载将大大减少页面的初次加载时间。 什么是异步组件加载&#xf…

Kafka分区策略实现

引言 Kafka 的分区策略决定了生产者发送的消息会被分配到哪个分区中&#xff0c;合理的分区策略有助于实现负载均衡、提高消息处理效率以及满足特定的业务需求。 轮询策略&#xff08;默认&#xff09; 轮询策略是 Kafka 默认的分区策略&#xff08;当消息没有指定键时&…

怎么获得小学、初中高中教材的pdf版【转载】

教材pdf下载步骤&#xff1a; 步骤操作概述示例图步骤一&#xff1a;进入官网进入 国家智慧教育公共服务平台&#xff1a;https://www.smartedu.cn/&#xff0c;进行登录或注册步骤二&#xff1a;选择教材点击中小学智慧教育&#xff0c;点击教材&#xff0c;选择自己喜欢的教…

使用 Docker Compose 一键启动 Redis、MySQL 和 RabbitMQ

目录 一、Docker Compose 简介 二、服务配置详解 1. Redis 配置 2. MySQL 配置 3. RabbitMQ 配置 三、数据持久化与时间同步 四、部署与管理 五、总结 目录挂载与卷映射的区别 现代软件开发中&#xff0c;微服务架构因其灵活性和可扩展性而备受青睐。为了支持微服务的…

33.Word:国家中长期人才发展规划纲要【33】

目录 NO1.2样式​ NO3​ 图表 ​ NO4.5.6​ 开始→段落标记视图→导航窗格→检查有无遗漏 NO1.2样式 F12/另存为&#xff1a;Word.docx&#xff1a;考生文件夹样式的复制样式的修改 样式的应用&#xff08;没有相似/超级多的情况下&#xff09;——替换 [ ]通配符&#x…

每日 Java 面试题分享【第 18 天】

欢迎来到每日 Java 面试题分享栏目&#xff01; 订阅专栏&#xff0c;不错过每一天的练习 今日分享 3 道面试题目&#xff01; 评论区复述一遍印象更深刻噢~ 目录 问题一&#xff1a;什么是 Java 中的双亲委派模型&#xff1f;问题二&#xff1a;Java 中 wait() 和 sleep()…

基于 Redis GEO 实现条件分页查询用户附近的场馆列表

&#x1f3af; 本文档详细介绍了如何使用Redis GEO模块实现场馆位置的存储与查询&#xff0c;以支持“附近场馆”搜索功能。首先&#xff0c;通过微信小程序获取用户当前位置&#xff0c;并将该位置信息与场馆的经纬度数据一同存储至Redis中。利用Redis GEO高效的地理空间索引能…

11.10 LangChain对话记忆管理实战:从入门到生产级ConversationBufferMemory应用指南

LangChain对话记忆管理实战:从入门到生产级ConversationBufferMemory应用指南 关键词: LangChain对话记忆管理、ConversationBufferMemory实战、多轮对话系统、Redis持久化存储、AI应用性能优化 一、ConversationBufferMemory核心价值解析 在开发对话式AI应用时,上下文管…