
Linux网络编程常见面试题
提供可靠的连接性,数据传输无误。 支持流控制,适合大块数据传输。 提供数据流量控制,避免过载。 数据传输前确保连接状态,方便错误处理。 需要建立连接,增加通信开销。 基础设施较为复杂,资源占用较高。 无连接建立开销,传输效率高。 适合短小数据报的传输,减少资源消耗。 适用于对实时性要求较高的场景。 数据传输不保证可靠性,可能丢失或重复。 不提供流量控制,可能导致网络过载。 不支持数据顺序传输,可能乱序到达。
发布日期:2025-04-10 09:26:19
浏览次数:7
分类:精选文章
本文共 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则适合实时性要求高、对连接性要求不高的场景。选择哪种协议取决于具体的应用需求。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月28日 00时49分14秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux设备共享,Linux中的存储设备共享之target
2023-02-05
Linux设备模型(5)_device和device driver
2023-02-05
Linux设备驱动开发学习(4):字符设备驱动(未完)
2023-02-05
linux设置时区和自动同步时间
2023-02-05
Linux语言配置
2023-02-05
Linux课题实践四——ELF文件格式分析
2023-02-05
Linux调优工具tuned
2023-02-05
Linux调度器 - 进程优先级
2023-02-05
Linux负载CPU、内存、磁盘IO、网络IO状态分析详解
2023-02-05
Linux账号安全——用户登陆权限
2023-02-05
Linux资产管理与服务器运行状态监控脚本
2023-02-05
Linux超级强大的十六进制dump工具:XXD命令,我教你应该如何使用!
2023-02-05
Linux路径格式与Window路径格式的转换(附Python代码)
2023-02-05
linux踢掉线上用户
2023-02-05
Linux踢掉远程登录用户
2023-02-05
Linux软RAID(MDAMD)使用实战
2023-02-05
Linux软件包源码编译安装实战
2023-02-05
linux软件包的一般安装方法
2023-02-05
Linux软件包管理与Vim编辑器指南
2023-02-05
linux软件包:RPM包、源码包、yum在线
2023-02-05