当前位置: 首页 > news >正文

网络协议基础与TCP/IP详解

网络协议基础与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协议

特性TCPUDP
连接面向连接无连接
可靠性可靠不可靠
传输效率
适用场景文件传输实时通信

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

指标TCPUDP
延迟
吞吐量
可靠性

3.2 拥塞控制算法对比

算法特点适用场景
慢启动初始增长快网络空闲
拥塞避免线性增长稳定网络
TCP Reno快速恢复通用
TCP Cubic高速网络优化数据中心

3.3 HTTP版本对比

版本特性性能
HTTP/1.1持久连接
HTTP/2多路复用
HTTP/3QUIC协议很高

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. 总结

网络协议是互联网的基础:

  1. TCP:面向连接的可靠传输
  2. UDP:无连接的高效传输
  3. HTTP:应用层协议
  4. 拥塞控制:TCP的核心机制

对比数据如下:

  • TCP适合文件传输等可靠场景
  • UDP适合实时音视频等低延迟场景
  • HTTP/2比HTTP/1.1性能提升50%以上
  • TCP_NODELAY可减少小包延迟
http://www.gsyq.cn/news/1341342.html

相关文章:

  • 3步让PS手柄在Windows上完美运行:DS4Windows终极配置指南
  • ZeroOmega:3分钟掌握浏览器代理切换的终极免费工具
  • 鸿蒙生鲜电商页面构建:商品网格与配送档期模块详解
  • 2025-2026年上海靠谱搬家公司推荐:五大排行全程托管省心搬家评测性价比高适用场景 - 品牌推荐
  • TriPlayer:重新定义Switch后台音频的智能播放解决方案
  • Honey Select 2终极增强补丁:新手快速上手指南
  • NY382固态MT29F32T08GSLBHL8-24QM:B
  • NY379固态MT29F32T08GSLBHL8-36QA:B
  • Hanime1Plugin全景解析:Android动漫观看体验的技术革新
  • 终极免费方案:一键解密网易云音乐NCM格式,轻松获得MP3文件
  • 操作系统基础概念与架构
  • 好用的AI写作辅助网站推荐(2026最新版)
  • 开发职场无效会议时长统计分析程序,统计会议低效时长,给出会议精简优化方案。
  • 别再乱加“impressionism”!Midjourney印象派风格生效的3个前置条件,90%新手忽略第2条
  • 【AI绘画构图生死线】:为什么你的提示词再精准也出不了大片?——透视层级、视觉动线与负空间权重分配全拆解
  • 日薪2700的护网HW面试,以及HW全面熟悉必看流程
  • ElevenLabs河南话模型未开放的隐藏参数曝光!3个未文档化flag让合成自然度提升40%(仅限本周内可用)
  • 如何实现远程桌面隐私模式:RustDesk隐藏操作的专业指南
  • 股票打分制方法论
  • 2026 最新 Web 安全入门教程 零基础全面吃透 Web 攻防
  • 2026年5月新发布:锡林浩特近视防控实力商家深度解析与选择指南 - 2026年企业推荐榜
  • 从7年开发到AI大模型工程师:我的转型踩坑与逆袭之路!附企业级项目避坑指南
  • 在Nodejs后端服务中集成Taotoken聚合大模型API
  • curtains.js实战案例:AJAX导航与平面移除的高级应用
  • 11. 架构:前端工程化与状态管理实战
  • FFXVIFix终极优化指南:5分钟解锁《最终幻想16》完美游戏体验
  • 3小时重构视觉可信度:Midjourney拟物化风格紧急修复指南——含光照角度校准、微纹理叠加、物理反射模拟速查表
  • ChatGPT-web-midjourney-proxy 项目常见问题解决方案
  • 10分钟掌握XGBoost:机器学习竞赛的终极梯度提升库
  • (STM32)STM32的GPIO口输入输出模式