首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

udp和tcp的区别

  • 25-02-16 03:40
  • 3665
  • 11444
blog.csdn.net

目录

UDP 和 TCP 的区别

1. 连接性

2. 可靠性

3. 数据传输顺序

4. 流量控制和拥塞控制

5. 效率

6. 应用场景

UDP 和 TCP 的 C/C++ 代码实现区别

1. TCP 服务器端和客户端

TCP 服务器端(Server)

TCP 客户端(Client)

2. UDP 服务器端和客户端

UDP 服务器端(Server)

UDP 客户端(Client)

主要区别:

总结:


 

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 的 C/C++ 代码实现区别

1. TCP 服务器端和客户端

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

TCP 服务器端(Server)
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #define PORT 8080
  7. int main() {
  8. int server_fd, new_socket;
  9. struct sockaddr_in address;
  10. int addr_len = sizeof(address);
  11. char buffer[1024] = {0};
  12. // 创建服务器 socket
  13. if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
  14. perror("socket failed");
  15. exit(EXIT_FAILURE);
  16. }
  17. address.sin_family = AF_INET;
  18. address.sin_addr.s_addr = INADDR_ANY;
  19. address.sin_port = htons(PORT);
  20. // 绑定地址和端口
  21. if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
  22. perror("bind failed");
  23. exit(EXIT_FAILURE);
  24. }
  25. // 监听端口
  26. if (listen(server_fd, 3) < 0) {
  27. perror("listen failed");
  28. exit(EXIT_FAILURE);
  29. }
  30. // 接受客户端连接
  31. if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addr_len)) < 0) {
  32. perror("accept failed");
  33. exit(EXIT_FAILURE);
  34. }
  35. // 接收数据
  36. read(new_socket, buffer, 1024);
  37. printf("Received message: %s\n", buffer);
  38. // 发送响应
  39. send(new_socket, "Hello from server", strlen("Hello from server"), 0);
  40. printf("Response sent\n");
  41. close(new_socket);
  42. close(server_fd);
  43. return 0;
  44. }
TCP 客户端(Client)
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #define PORT 8080
  7. int main() {
  8. int sock = 0;
  9. struct sockaddr_in server_address;
  10. char *message = "Hello from client";
  11. char buffer[1024] = {0};
  12. // 创建 socket
  13. if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  14. perror("Socket creation error");
  15. exit(EXIT_FAILURE);
  16. }
  17. server_address.sin_family = AF_INET;
  18. server_address.sin_port = htons(PORT);
  19. // 转换 IPv4 地址
  20. if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {
  21. perror("Invalid address");
  22. exit(EXIT_FAILURE);
  23. }
  24. // 连接服务器
  25. if (connect(sock, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
  26. perror("Connection failed");
  27. exit(EXIT_FAILURE);
  28. }
  29. // 发送消息
  30. send(sock, message, strlen(message), 0);
  31. printf("Message sent\n");
  32. // 接收响应
  33. read(sock, buffer, 1024);
  34. printf("Received from server: %s\n", buffer);
  35. close(sock);
  36. return 0;
  37. }
2. UDP 服务器端和客户端

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

UDP 服务器端(Server)
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #define PORT 8080
  7. #define MAXLINE 1024
  8. int main() {
  9. int sockfd;
  10. char buffer[MAXLINE];
  11. struct sockaddr_in server_address, client_address;
  12. socklen_t len;
  13. ssize_t n;
  14. // 创建 UDP socket
  15. if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  16. perror("Socket creation failed");
  17. exit(EXIT_FAILURE);
  18. }
  19. memset(&server_address, 0, sizeof(server_address));
  20. server_address.sin_family = AF_INET;
  21. server_address.sin_addr.s_addr = INADDR_ANY;
  22. server_address.sin_port = htons(PORT);
  23. // 绑定地址和端口
  24. if (bind(sockfd, (const struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
  25. perror("Bind failed");
  26. exit(EXIT_FAILURE);
  27. }
  28. len = sizeof(client_address);
  29. n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, (struct sockaddr *)&client_address, &len);
  30. buffer[n] = '\0';
  31. printf("Client message: %s\n", buffer);
  32. sendto(sockfd, "Hello from server", strlen("Hello from server"), MSG_CONFIRM, (const struct sockaddr *)&client_address, len);
  33. printf("Response sent\n");
  34. close(sockfd);
  35. return 0;
  36. }
UDP 客户端(Client)
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #define PORT 8080
  7. #define MAXLINE 1024
  8. int main() {
  9. int sockfd;
  10. char *message = "Hello from client";
  11. char buffer[MAXLINE];
  12. struct sockaddr_in server_address;
  13. // 创建 UDP socket
  14. if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  15. perror("Socket creation failed");
  16. exit(EXIT_FAILURE);
  17. }
  18. memset(&server_address, 0, sizeof(server_address));
  19. server_address.sin_family = AF_INET;
  20. server_address.sin_port = htons(PORT);
  21. // 转换 IPv4 地址
  22. if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {
  23. perror("Invalid address");
  24. exit(EXIT_FAILURE);
  25. }
  26. // 发送消息
  27. sendto(sockfd, message, strlen(message), MSG_CONFIRM, (const struct sockaddr *)&server_address, sizeof(server_address));
  28. printf("Message sent\n");
  29. // 接收响应
  30. ssize_t n = recvfrom(sockfd, (char *)buffer, MAXLINE, MSG_WAITALL, NULL, NULL);
  31. buffer[n] = '\0';
  32. printf("Received from server: %s\n", buffer);
  33. close(sockfd);
  34. return 0;
  35. }

主要区别:

  1. 连接:

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

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

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

总结:

  • TCP 是面向连接的、可靠的协议,适合需要数据完整性和顺序的应用。
  • UDP 是无连接的、不可靠的协议,适合实时性要求高但能容忍丢包的应用。
注:本文转载自blog.csdn.net的Ljw...的文章"https://blog.csdn.net/2401_83427936/article/details/143819423"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

129
网络与通信
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top