udp和tcp的区别

目录

[UDP 和 TCP 的区别](#UDP 和 TCP 的区别)

[1. 连接性](#1. 连接性)

[2. 可靠性](#2. 可靠性)

[3. 数据传输顺序](#3. 数据传输顺序)

[4. 流量控制和拥塞控制](#4. 流量控制和拥塞控制)

[5. 效率](#5. 效率)

[6. 应用场景](#6. 应用场景)

[UDP 和 TCP 的 C/C++ 代码实现区别](#UDP 和 TCP 的 C/C++ 代码实现区别)

[1. TCP 服务器端和客户端](#1. TCP 服务器端和客户端)

[TCP 服务器端(Server)](#TCP 服务器端(Server))

[TCP 客户端(Client)](#TCP 客户端(Client))

[2. UDP 服务器端和客户端](#2. UDP 服务器端和客户端)

[UDP 服务器端(Server)](#UDP 服务器端(Server))

[UDP 客户端(Client)](#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)
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addr_len = sizeof(address);
    char buffer[1024] = {0};

    // 创建服务器 socket
    if ((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)
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080

int main() {
    int sock = 0;
    struct sockaddr_in server_address;
    char *message = "Hello from client";
    char buffer[1024] = {0};

    // 创建 socket
    if ((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;
}
2. UDP 服务器端和客户端

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

UDP 服务器端(Server)
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080
#define MAXLINE 1024

int main() {
    int sockfd;
    char buffer[MAXLINE];
    struct sockaddr_in server_address, client_address;
    socklen_t len;
    ssize_t n;

    // 创建 UDP socket
    if ((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)
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080
#define MAXLINE 1024

int main() {
    int sockfd;
    char *message = "Hello from client";
    char buffer[MAXLINE];
    struct sockaddr_in server_address;

    // 创建 UDP socket
    if ((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 是无连接的、不可靠的协议,适合实时性要求高但能容忍丢包的应用。
相关推荐
5xidixi12 分钟前
HTTP(1)
网络·网络协议·http
lingllllove2 小时前
使用 HTTP::Server::Simple 实现轻量级 HTTP 服务器
服务器·网络协议·http
一只码代码的章鱼3 小时前
计算机网络 笔记 传输层
网络·网络协议·tcp/ip·计算机网络
别致的影分身4 小时前
Linux网络 HTTP cookie 与 session
网络·网络协议·http
忆源7 小时前
SOME/IP--协议英文原文讲解4
网络·网络协议·tcp/ip
Mason Lin21 小时前
2025年1月22日(网络编程 udp)
网络·python·udp
m0_465215791 天前
TCP & UDP Service Model
服务器·网络·tcp/ip
esmember1 天前
电路研究9.2.6——合宙Air780EP中HTTP——HTTP GET 相关命令使用方法研究
网络·网络协议·http·at指令
weisian1511 天前
消息队列篇--通信协议篇--STOMP(STOMP特点、格式及示例,WebSocket上使用STOMP,消息队列上使用STOMP等)
websocket·网络协议