网络协议基础与TCP/IP详解
1. 技术分析
1.1 网络协议概述
网络协议是计算机通信的规则:
协议层次 物理层: 传输介质 数据链路层: MAC地址、帧 网络层: IP地址、路由 传输层: TCP/UDP 应用层: HTTP、DNS TCP/IP模型: 网络接口层 网络层 传输层 应用层
1.2 TCP协议
TCP特性 面向连接: 三次握手建立连接 可靠传输: 确认重传机制 流量控制: 滑动窗口 拥塞控制: 慢启动、拥塞避免 TCP状态机: LISTEN -> SYN_SENT -> SYN_RCVD -> ESTABLISHED ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
1.3 UDP协议
| 特性 | TCP | UDP |
|---|
| 连接 | 面向连接 | 无连接 |
| 可靠性 | 可靠 | 不可靠 |
| 传输效率 | 低 | 高 |
| 适用场景 | 文件传输 | 实时通信 |
2. 核心功能实现
2.1 TCP客户端
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8080 int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket failed"); exit(1); } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr); if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("connect failed"); close(sockfd); exit(1); } const char *message = "Hello, Server!"; send(sockfd, message, strlen(message), 0); char buffer[1024]; ssize_t bytes_read = recv(sockfd, buffer, sizeof(buffer), 0); if (bytes_read > 0) { buffer[bytes_read] = '\0'; printf("Received: %s\n", buffer); } close(sockfd); return 0; }
2.2 TCP服务器
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 8080 int main() { int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd < 0) { perror("socket failed"); exit(1); } struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(PORT); if (bind(server_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind failed"); close(server_fd); exit(1); } if (listen(server_fd, 5) < 0) { perror("listen failed"); close(server_fd); exit(1); } printf("Server listening on port %d...\n", PORT); while (1) { struct sockaddr_in client_addr; socklen_t client_len = sizeof(client_addr); int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len); if (client_fd < 0) { perror("accept failed"); continue; } char buffer[1024]; ssize_t bytes_read = recv(client_fd, buffer, sizeof(buffer), 0); if (bytes_read > 0) { buffer[bytes_read] = '\0'; printf("Received from client: %s\n", buffer); const char *response = "Hello, Client!"; send(client_fd, response, strlen(response), 0); } close(client_fd); } close(server_fd); return 0; }
2.3 HTTP服务器
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 80 const char *http_response = "HTTP/1.1 200 OK\r\n" "Content-Type: text/html\r\n" "Content-Length: 45\r\n" "\r\n" "<html><body><h1>Hello, HTTP Server!</h1></body></html>"; int main() { int server_fd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr = { .sin_family = AF_INET, .sin_addr.s_addr = INADDR_ANY, .sin_port = htons(PORT) }; bind(server_fd, (struct sockaddr *)&addr, sizeof(addr)); listen(server_fd, 10); printf("HTTP Server listening on port %d...\n", PORT); while (1) { int client_fd = accept(server_fd, NULL, NULL); char buffer[1024]; recv(client_fd, buffer, sizeof(buffer), 0); printf("Request:\n%s\n", buffer); send(client_fd, http_response, strlen(http_response), 0); close(client_fd); } close(server_fd); return 0; }
3. 性能对比
3.1 TCP vs UDP
3.2 拥塞控制算法对比
| 算法 | 特点 | 适用场景 |
|---|
| 慢启动 | 初始增长快 | 网络空闲 |
| 拥塞避免 | 线性增长 | 稳定网络 |
| TCP Reno | 快速恢复 | 通用 |
| TCP Cubic | 高速网络优化 | 数据中心 |
3.3 HTTP版本对比
| 版本 | 特性 | 性能 |
|---|
| HTTP/1.1 | 持久连接 | 中 |
| HTTP/2 | 多路复用 | 高 |
| HTTP/3 | QUIC协议 | 很高 |
4. 最佳实践
4.1 Socket编程
// 设置TCP_NODELAY int optval = 1; setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(optval)); // 设置SO_REUSEADDR setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); // 设置非阻塞IO int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
4.2 网络调试
# 查看网络连接 netstat -anp # 测试网络连通性 ping example.com # 端口扫描 nc -zv localhost 8080 # 抓包分析 tcpdump -i eth0 port 80
5. 总结
网络协议是互联网的基础:
- TCP:面向连接的可靠传输
- UDP:无连接的高效传输
- HTTP:应用层协议
- 拥塞控制:TCP的核心机制
对比数据如下:
- TCP适合文件传输等可靠场景
- UDP适合实时音视频等低延迟场景
- HTTP/2比HTTP/1.1性能提升50%以上
- TCP_NODELAY可减少小包延迟