博客
关于我
Linux网络编程常见面试题
阅读量:793 次
发布时间:2023-02-05

本文共 5456 字,大约阅读时间需要 18 分钟。

TCP和UDP协议概述

TCP和UDP是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议。它们在数据传输时分别采用了不同的方式,适用于不同的应用场景。

TCP协议

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的协议,提供可靠的全双工字节流传输。TCP的特点包括:

  • 可靠性:TCP通过三次握手建立连接,并在数据传输过程中确保数据块按序、无差错、不丢失、不重复地到达对方,必要时会进行重发。
  • 流控制:TCP支持数据流的控制,可以根据接收方的速率需求调整发送速率。
  • 连接性:通信前需建立连接,通信结束后会进行四次握手关闭连接。

UDP协议

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的协议,数据包的传输不依赖于是否建立连接。其特点包括:

  • 无连接性:UDP不需要建立连接,数据包直接传输。
  • 尽力而为:UDP不保证数据包的可靠传输或按序传输,可能会出现丢失或重复。
  • 数据报传输:UDP采用数据报方式传输,适用于对实时性要求较高的应用场景。

TCP与UDP的对比

特性 TCP UDP
连接性 建立连接(三次握手) 无连接
可靠性 保障数据可靠传输 不保证数据可靠传输
数据传输方式 字节流传输 数据报传输
应用场景 适用于可靠性要求高的场景 适用于实时性要求高的场景

TCP和UDP的优缺点

TCP优点

  • 提供可靠的连接性,数据传输无误。
  • 支持流控制,适合大块数据传输。
  • 提供数据流量控制,避免过载。
  • 数据传输前确保连接状态,方便错误处理。
  • TCP缺点

  • 需要建立连接,增加通信开销。
  • 基础设施较为复杂,资源占用较高。
  • UDP优点

  • 无连接建立开销,传输效率高。
  • 适合短小数据报的传输,减少资源消耗。
  • 适用于对实时性要求较高的场景。
  • UDP缺点

  • 数据传输不保证可靠性,可能丢失或重复。
  • 不提供流量控制,可能导致网络过载。
  • 不支持数据顺序传输,可能乱序到达。
  • TCP/IP应用编程接口(API)

    TCP客户端代码示例

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define PORT 2345#define DSET_IP_ADDRESS "192.168.218.141"int main(int argc, char *argv) { int sockfd; char buffer[1024]; struct sockaddr_in server_addr; sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sockfd == -1) { perror("socket error"); return EXIT_FAILURE; } bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { perror("connect error."); return EXIT_FAILURE; } do { printf("Please input char: "); fgets(buffer, 1024, stdin); write(sockfd, buffer, strlen(buffer)); } while (strncmp(buffer, "quit", 4) != 0); close(sockfd); return EXIT_SUCCESS;}

    UDP客户端代码示例

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define DEST_PORT 3000#define DSET_IP_ADDRESS "192.168.1.103"int main(int argc, char *argv) { int sock_fd; int send_num; int recv_num; int dest_len; char send_buf[20] = "hello tiger"; char recv_buf[20]; struct sockaddr_in addr_serv; struct sockaddr_in addr_client; sock_fd = socket(AF_INET, SOCK_DGRAM, 0); if (sock_fd < 0) { perror("socket"); return 1; } memset(&addr_serv, 0, sizeof(addr_serv)); addr_serv.sin_family = AF_INET; addr_serv.sin_port = htons(DEST_PORT); addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS); dest_len = sizeof(struct sockaddr_in); if (bind(sock_fd, (struct sockaddr *)&addr_serv, sizeof(struct sockaddr_in)) < 0) { perror("bind"); return 1; } while (1) { printf("begin recv:\n"); recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&addr_client, &dest_len); if (recv_num < 0) { perror("again recvfrom"); return 1; } else { recv_buf[recv_num] = '\0'; printf("recv success: %s\n", recv_buf); } printf("begin send:\n"); send_num = sendto(sock_fd, recv_buf, recv_num, 0, (struct sockaddr *)&addr_client, dest_len); if (send_num < 0) { perror("sendto"); return 1; } else { printf("send success\n"); } } close(sock_fd); return 0;}

    TCP服务端代码示例

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define PORT 2345#define DSET_IP_ADDRESS "192.168.218.141"int main(int argc, char *argv) { int sockfd; char buffer[1024]; struct sockaddr_in server_addr; sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sockfd == -1) { perror("socket error"); return EXIT_FAILURE; } bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { perror("connect error."); return EXIT_FAILURE; } do { printf("Please input char:\n"); fgets(buffer, 1024, stdin); write(sockfd, buffer, strlen(buffer)); } while (strncmp(buffer, "quit", 4) != 0); close(sockfd); return EXIT_SUCCESS;}

    UDP服务端代码示例

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define SERV_PORT 3000int main(int argc, char *argv) { int sock_fd; int recv_num; int send_num; int client_len; char recv_buf[20]; struct sockaddr_in addr_serv; struct sockaddr_in addr_client; sock_fd = socket(AF_INET, SOCK_DGRAM, 0); if (sock_fd < 0) { perror("socket"); return 1; } memset(&addr_serv, 0, sizeof(addr_serv)); addr_serv.sin_family = AF_INET; addr_serv.sin_port = htons(SERV_PORT); addr_serv.sin_addr.s_addr = htonl(INADDR_ANY); client_len = sizeof(struct sockaddr_in); if (bind(sock_fd, (struct sockaddr *)&addr_serv, sizeof(struct sockaddr_in)) < 0) { perror("bind"); return 1; } while (1) { printf("begin recv:\n"); recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&addr_client, &client_len); if (recv_num < 0) { printf("bad\n"); perror("again recvfrom"); return 1; } else { recv_buf[recv_num] = '\0'; printf("recv success: %s\n", recv_buf); } printf("begin send:\n"); send_num = sendto(sock_fd, recv_buf, recv_num, 0, (struct sockaddr *)&addr_client, client_len); if (send_num < 0) { perror("sendto"); return 1; } else { printf("send success\n"); } } close(sock_fd); return 0;}

    总结

    TCP和UDP分别适用于不同的应用场景。TCP提供可靠、有序的数据传输,适合连接性要求高的场景;UDP则适合实时性要求高、对连接性要求不高的场景。选择哪种协议取决于具体的应用需求。

    转载地址:http://nmkfk.baihongyu.com/

    你可能感兴趣的文章
    Linux安装JMeter进行压力测试
    查看>>
    Linux安装KVM
    查看>>
    Linux安装Mysql5.7.23详细教程(CentOS7)
    查看>>
    Linux安装mysql:FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql
    查看>>
    Linux安装Oracle 11g和postgrepSQL数据库(附安装包)
    查看>>
    Linux安装pip没有权限,linux/unix没网环境下安装python、pip以及第三方库
    查看>>
    Linux安装postgresql及基础操作
    查看>>
    linux安装rabbitmq3.7.15教程
    查看>>
    Linux安装Redis 与 Redis基本语法
    查看>>
    Linux安装Redis及配置(超详细)
    查看>>
    Linux安装telnet - telnet不能用!提示:-bash: telnet: command not found
    查看>>
    Linux安装Tomcat
    查看>>
    Linux安装与配置
    查看>>
    Linux安装与配置SSH服务
    查看>>
    Linux安装卸载Mysql数据库
    查看>>
    linux安装卸载软件
    查看>>
    linux安装宋体
    查看>>
    LINUX安装源码软件经典三部曲
    查看>>
    linux安装目录
    查看>>
    Linux定时Job:crontab -e 与 /etc/crontab 的区别
    查看>>