IT评测·应用市场-qidao123.com技术社区

标题: TCP/UDP与线程进程全解析:从原理到实战 [打印本页]

作者: 天空闲话    时间: 7 天前
标题: TCP/UDP与线程进程全解析:从原理到实战
TCP/UDP与线程进程全解析:从原理到实战

一、TCP与UDP协议深度解析

1. TCP协议详解

TCP(传输控制协议)是一种面向毗连的、可靠的、基于字节流的传输层通讯协议,是互联网的焦点协议之一。
焦点特性

TCP头部布局
  1. 0                   1                   2                   3
  2. 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4. |         源端口号         |         目的端口号        |
  5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  6. |                       序列号                        |
  7. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8. |                     确认应答号                      |
  9. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  10. | 数据偏移 | 保留 | 控制标志 |        窗口大小         |
  11. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  12. |        校验和         |      紧急指针      |
  13. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  14. |                   选项(可选)                   |
  15. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  16. |                   数据(可选)                   |
  17. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
TCP三次握手过程
TCP四次挥手过程
2. UDP协议详解

UDP(用户数据报协议)是一种无毗连的、不可靠的传输层协议,提供简单高效的数据传输服务。
焦点特性

UDP头部布局
  1. 0                   1                   2                   3
  2. 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4. |         源端口号         |         目的端口号        |
  5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  6. |           长度           |          校验和          |
  7. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8. |                   数据(如果有)                   |
  9. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
3. TCP与UDP对比

特性TCPUDP毗连性面向毗连无毗连可靠性可靠传输不可靠传输顺序保证保证数据顺序不保证顺序流量控制有无拥塞控制有无头部大小20-60字节8字节传输服从较低较高适用场景文件传输、网页浏览、邮件视频会议、在线游戏、DNS查询 二、线程与进程深度解析

1. 进程详解

进程定义
进程是操作系统资源分配的基本单位,是步伐的一次实行实例。每个进程都有独立的地址空间、文件描述符、环境变量等系统资源。
进程特点

进程状态转换
  1. 新建 → 就绪 ↔ 运行 → 终止
  2.           ↑    ↓
  3.           └── 阻塞
复制代码
2. 线程详解

线程定义
线程是CPU调度的基本单位,是进程内的一个实行流。同一进程内的多个线程共享进程的资源,但每个线程有自己的栈和寄存器状态。
线程特点

线程状态转换
与进程类似,但通常更频仍地在就绪和运行状态间切换
3. 多线程与多进程对比

特性多进程多线程创建开销大小切换开销大小内存隔离完全隔离共享地址空间通讯方式IPC机制共享内存安全性高(一个进程崩溃不影响其他)低(一个线程崩溃大概导致整个进程崩溃)适用场景CPU麋集型、须要高隔离性I/O麋集型、须要高并发 三、实战案例解析

1. TCP服务器/客户端实现(C语言)

TCP服务器代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #define PORT 8080
  8. #define BUFFER_SIZE 1024
  9. int main() {
  10.     int server_fd, new_socket;
  11.     struct sockaddr_in address;
  12.     int opt = 1;
  13.     int addrlen = sizeof(address);
  14.     char buffer[BUFFER_SIZE] = {0};
  15.    
  16.     // 创建socket文件描述符
  17.     if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
  18.         perror("socket failed");
  19.         exit(EXIT_FAILURE);
  20.     }
  21.    
  22.     // 设置socket选项
  23.     if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
  24.         perror("setsockopt");
  25.         exit(EXIT_FAILURE);
  26.     }
  27.    
  28.     address.sin_family = AF_INET;
  29.     address.sin_addr.s_addr = INADDR_ANY;
  30.     address.sin_port = htons(PORT);
  31.    
  32.     // 绑定socket到端口
  33.     if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
  34.         perror("bind failed");
  35.         exit(EXIT_FAILURE);
  36.     }
  37.    
  38.     // 监听连接
  39.     if (listen(server_fd, 3) < 0) {
  40.         perror("listen");
  41.         exit(EXIT_FAILURE);
  42.     }
  43.    
  44.     printf("Server listening on port %d...\n", PORT);
  45.    
  46.     // 接受连接
  47.     if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
  48.         perror("accept");
  49.         exit(EXIT_FAILURE);
  50.     }
  51.    
  52.     // 读取客户端数据
  53.     int valread = read(new_socket, buffer, BUFFER_SIZE);
  54.     printf("Received: %s\n", buffer);
  55.    
  56.     // 发送响应
  57.     char *response = "Hello from server";
  58.     send(new_socket, response, strlen(response), 0);
  59.     printf("Response sent\n");
  60.    
  61.     close(new_socket);
  62.     close(server_fd);
  63.     return 0;
  64. }
复制代码
TCP客户端代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #define PORT 8080
  9. #define BUFFER_SIZE 1024
  10. int main() {
  11.     int sock = 0;
  12.     struct sockaddr_in serv_addr;
  13.     char buffer[BUFFER_SIZE] = {0};
  14.    
  15.     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  16.         printf("\n Socket creation error \n");
  17.         return -1;
  18.     }
  19.    
  20.     serv_addr.sin_family = AF_INET;
  21.     serv_addr.sin_port = htons(PORT);
  22.    
  23.     // 转换IP地址
  24.     if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
  25.         printf("\nInvalid address/ Address not supported \n");
  26.         return -1;
  27.     }
  28.    
  29.     // 连接服务器
  30.     if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
  31.         printf("\nConnection Failed \n");
  32.         return -1;
  33.     }
  34.    
  35.     // 发送消息
  36.     char *message = "Hello from client";
  37.     send(sock, message, strlen(message), 0);
  38.     printf("Message sent\n");
  39.    
  40.     // 读取响应
  41.     int valread = read(sock, buffer, BUFFER_SIZE);
  42.     printf("Server response: %s\n", buffer);
  43.    
  44.     close(sock);
  45.     return 0;
  46. }
复制代码
2. UDP服务器/客户端实现(C语言)

UDP服务器代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #define PORT 8080
  8. #define BUFFER_SIZE 1024
  9. int main() {
  10.     int sockfd;
  11.     struct sockaddr_in servaddr, cliaddr;
  12.     char buffer[BUFFER_SIZE];
  13.    
  14.     // 创建UDP socket
  15.     if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  16.         perror("socket creation failed");
  17.         exit(EXIT_FAILURE);
  18.     }
  19.    
  20.     memset(&servaddr, 0, sizeof(servaddr));
  21.     memset(&cliaddr, 0, sizeof(cliaddr));
  22.    
  23.     servaddr.sin_family = AF_INET;
  24.     servaddr.sin_addr.s_addr = INADDR_ANY;
  25.     servaddr.sin_port = htons(PORT);
  26.    
  27.     // 绑定socket
  28.     if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
  29.         perror("bind failed");
  30.         exit(EXIT_FAILURE);
  31.     }
  32.    
  33.     printf("UDP Server listening on port %d...\n", PORT);
  34.    
  35.     socklen_t len;
  36.     int n;
  37.    
  38.     len = sizeof(cliaddr);
  39.    
  40.     // 接收数据
  41.     n = recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr *)&cliaddr, &len);
  42.     buffer[n] = '\0';
  43.     printf("Client : %s\n", buffer);
  44.    
  45.     // 发送响应
  46.     char *response = "Hello from UDP server";
  47.     sendto(sockfd, response, strlen(response), MSG_CONFIRM, (const struct sockaddr *)&cliaddr, len);
  48.     printf("Response sent.\n");
  49.    
  50.     close(sockfd);
  51.     return 0;
  52. }
复制代码
UDP客户端代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #define PORT 8080
  9. #define BUFFER_SIZE 1024
  10. int main() {
  11.     int sockfd;
  12.     struct sockaddr_in servaddr;
  13.     char buffer[BUFFER_SIZE];
  14.    
  15.     // 创建UDP socket
  16.     if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  17.         perror("socket creation failed");
  18.         exit(EXIT_FAILURE);
  19.     }
  20.    
  21.     memset(&servaddr, 0, sizeof(servaddr));
  22.    
  23.     servaddr.sin_family = AF_INET;
  24.     servaddr.sin_port = htons(PORT);
  25.     servaddr.sin_addr.s_addr = INADDR_ANY;
  26.    
  27.     socklen_t len;
  28.    
  29.     // 发送消息
  30.     char *message = "Hello from UDP client";
  31.     sendto(sockfd, message, strlen(message), MSG_CONFIRM, (const struct sockaddr *)&servaddr, sizeof(servaddr));
  32.     printf("Message sent.\n");
  33.    
  34.     // 接收响应
  35.     int n = recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr *)&servaddr, &len);
  36.     buffer[n] = '\0';
  37.     printf("Server : %s\n", buffer);
  38.    
  39.     close(sockfd);
  40.     return 0;
  41. }
复制代码
3. 多线程服务器实现(C语言)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <pthread.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #define PORT 8080
  9. #define BUFFER_SIZE 1024
  10. #define MAX_CLIENTS 10
  11. void *handle_client(void *arg) {
  12.     int client_socket = *(int *)arg;
  13.     char buffer[BUFFER_SIZE] = {0};
  14.    
  15.     // 读取客户端数据
  16.     int valread = read(client_socket, buffer, BUFFER_SIZE);
  17.     printf("Thread %lu received: %s\n", pthread_self(), buffer);
  18.    
  19.     // 发送响应
  20.     char *response = "Hello from server thread";
  21.     send(client_socket, response, strlen(response), 0);
  22.    
  23.     close(client_socket);
  24.     free(arg);
  25.     return NULL;
  26. }
  27. int main() {
  28.     int server_fd, new_socket;
  29.     struct sockaddr_in address;
  30.     int opt = 1;
  31.     int addrlen = sizeof(address);
  32.    
  33.     // 创建socket
  34.     if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
  35.         perror("socket failed");
  36.         exit(EXIT_FAILURE);
  37.     }
  38.    
  39.     // 设置socket选项
  40.     if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
  41.         perror("setsockopt");
  42.         exit(EXIT_FAILURE);
  43.     }
  44.    
  45.     address.sin_family = AF_INET;
  46.     address.sin_addr.s_addr = INADDR_ANY;
  47.     address.sin_port = htons(PORT);
  48.    
  49.     // 绑定socket
  50.     if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
  51.         perror("bind failed");
  52.         exit(EXIT_FAILURE);
  53.     }
  54.    
  55.     // 监听
  56.     if (listen(server_fd, MAX_CLIENTS) < 0) {
  57.         perror("listen");
  58.         exit(EXIT_FAILURE);
  59.     }
  60.    
  61.     printf("Multi-threaded server listening on port %d...\n", PORT);
  62.    
  63.     while (1) {
  64.         int *client_socket = malloc(sizeof(int));
  65.         if ((*client_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
  66.             perror("accept");
  67.             continue;
  68.         }
  69.         
  70.         printf("New client connected\n");
  71.         
  72.         // 创建线程处理客户端
  73.         pthread_t thread_id;
  74.         if (pthread_create(&thread_id, NULL, handle_client, client_socket) != 0) {
  75.             perror("pthread_create");
  76.             close(*client_socket);
  77.             free(client_socket);
  78.         }
  79.         
  80.         // 分离线程,使其结束后自动释放资源
  81.         pthread_detach(thread_id);
  82.     }
  83.    
  84.     close(server_fd);
  85.     return 0;
  86. }
复制代码
四、性能优化与最佳实践

1. TCP/UDP性能优化

TCP优化技巧
UDP优化技巧
2. 多线程编程最佳实践

五、常见标题与办理方案

1. TCP粘包标题

标题描述:TCP是字节流协议,不维护消息边界,大概导致多条消息粘在一起。
办理方案
2. UDP丢包标题

标题描述:UDP不保证可靠传输,网络拥塞时大概出现丢包。
办理方案
3. 多线程竞争条件

标题描述:多个线程同时访问共享资源导致数据不一致。
办理方案
六、总结

TCP和UDP作为传输层两大协议各有优劣:TCP提供可靠传输但开销较大,UDP轻量高效但不保证可靠性。线程和进程作为并发编程的两大模型也各有适用场景:多进程隔离性好但开销大,多线程轻量但须要谨慎处置处罚共享数据。
在现实开发中,应根据应用场景选择符合的技能组合:

把握这些底层原理和实现技能,可以大概资助开发者构建高性能、高可靠的网络应用系统。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4