跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
网络编程基础
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:网络编程基础}} '''网络编程基础'''是计算机网络领域的核心概念,涉及通过编程实现不同设备间的数据通信。本文将从基础原理、协议栈、套接字编程到实际应用逐步展开,适合初学者和需要巩固知识的开发者。 == 概述 == 网络编程指利用计算机网络协议(如TCP/IP)在应用程序之间传输数据的过程。其核心目标是: * 实现可靠或不可靠的数据传输 * 处理网络延迟、丢包等现实问题 * 提供跨平台的通信接口 关键组件包括: * '''IP地址''':设备的网络标识(如<code>192.168.1.1</code>) * '''端口''':应用程序的通信端点(0-65535) * '''协议''':通信规则(TCP/UDP/HTTP等) == 核心概念 == === OSI与TCP/IP模型 === 网络通信基于分层模型,最常用的是TCP/IP四层模型: <mermaid> graph TD A[应用层 HTTP/FTP] --> B[传输层 TCP/UDP] B --> C[网络层 IP/ICMP] C --> D[网络接口层 Ethernet/WiFi] </mermaid> === 套接字(Socket) === 套接字是网络编程的基本抽象,类型包括: * '''流式套接字'''(SOCK_STREAM):面向连接的TCP通信 * '''数据报套接字'''(SOCK_DGRAM):无连接的UDP通信 === 字节序问题 === 网络传输使用'''大端序'''(Big-Endian),与主机字节序可能不同,需用以下函数转换: * <code>htons()</code> - 主机到网络短整型 * <code>htonl()</code> - 主机到网络长整型 * <code>ntohs()</code> - 网络到主机短整型 * <code>ntohl()</code> - 网络到主机长整型 == 编程实践 == === TCP客户端/服务端示例 === 以下Python示例展示基础TCP通信: ==== 服务端代码 ==== <syntaxhighlight lang="python"> import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('0.0.0.0', 8080)) server_socket.listen(1) print("等待连接...") conn, addr = server_socket.accept() print(f"连接来自: {addr}") data = conn.recv(1024) print(f"收到数据: {data.decode()}") conn.sendall(b"Message received") conn.close() </syntaxhighlight> ==== 客户端代码 ==== <syntaxhighlight lang="python"> import socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('127.0.0.1', 8080)) client_socket.sendall(b"Hello Server!") response = client_socket.recv(1024) print(f"服务端响应: {response.decode()}") client_socket.close() </syntaxhighlight> ==== 执行流程 ==== 1. 启动服务端后进入监听状态 2. 客户端连接并发送"Hello Server!" 3. 服务端回应"Message received" 4. 客户端打印响应后关闭连接 === UDP示例 === UDP不需要建立连接,代码更简洁: <syntaxhighlight lang="python"> # UDP服务端 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('0.0.0.0', 9999)) data, addr = sock.recvfrom(1024) # 阻塞等待数据 sock.sendto(b"UDP Response", addr) </syntaxhighlight> == 高级主题 == === 非阻塞I/O === 通过设置套接字非阻塞模式实现异步通信: <syntaxhighlight lang="python"> sock.setblocking(False) # Python示例 try: data = sock.recv(1024) except BlockingIOError: print("暂无可用数据") </syntaxhighlight> === 多路复用 === 使用<code>select</code>同时监控多个套接字: <syntaxhighlight lang="python"> import select readable, _, _ = select.select([sock1, sock2], [], [], 5) for s in readable: data = s.recv(1024) print(f"从{s.getpeername()}收到数据") </syntaxhighlight> == 实际应用场景 == * '''即时通讯软件''':混合使用TCP(消息)和UDP(语音/视频) * '''物联网设备''':MQTT协议基于TCP实现轻量级通信 * '''网络游戏''':UDP传输实时位置数据,TCP处理关键指令 == 常见问题 == {| class="wikitable" |- ! 问题 !! 解决方案 |- | 连接被拒绝 || 检查服务端是否启动、防火墙设置 |- | 数据粘包 || TCP是流协议,需自定义消息边界(如长度前缀) |- | 高延迟 || 使用Nagle算法优化或选择UDP协议 |} == 性能优化 == * '''缓冲区大小''':根据MTU(通常1500字节)调整 * '''连接池''':复用TCP连接减少握手开销 * '''压缩算法''':对文本数据使用gzip/zstd压缩 数学上,TCP吞吐量可用以下公式估算: <math>Throughput \leq \frac{Window\ Size}{RTT}</math> 其中: * Window Size:通告窗口大小 * RTT:往返时间 == 扩展阅读 == * RFC 793 - TCP协议规范 * UNIX Network Programming(W. Richard Stevens著) * Beej's Guide to Network Programming(免费在线资源) [[Category:计算机科学]] [[Category:面试技巧]] [[Category:计算机网络]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)