网络编程
服务端开发的本质是处理网络 I/O:接收客户端请求、解析协议、处理业务、返回响应。理解网络编程的底层原理,是构建高性能服务的基础。
网络分层模型
OSI 七层模型
OSI(Open Systems Interconnection)七层模型是 ISO 制定的标准网络架构,理论完备但工程实践复杂。
应用层:为应用提供服务,如 HTTP、FTP、SMTP。
表示层:数据格式化、加密解密,如 SSL/TLS。
会话层:建立、管理、终止会话,如 NetBIOS。
传输层:端到端通信,如 TCP、UDP。
网络层:路由转发,如 IP、ICMP。
数据链路层:帧传输、错误检测,如 Ethernet、Wi-Fi。
物理层:比特传输,如电缆、光纤。
TCP/IP 四层模型
TCP/IP 模型是互联网的实际标准,将 OSI 七层合并为四层。
应用层:对应 OSI 的应用层、表示层、会话层,如 HTTP、DNS、SSH。
传输层:端到端通信,如 TCP、UDP。
网络层:路由转发,如 IP、ICMP。
网络接口层:对应 OSI 的数据链路层、物理层,如 Ethernet、Wi-Fi。
Socket 编程基础
Socket 是网络编程的抽象,屏蔽了底层协议细节。一个 Socket 连接由五元组标识:源 IP、源端口、目的 IP、目的端口、协议。
Socket 类型
流式套接字(SOCK_STREAM)基于 TCP,提供可靠、面向连接的字节流服务。
数据报套接字(SOCK_DGRAM)基于 UDP,提供不可靠、无连接的数据报服务。
原始套接字(SOCK_RAW)绕过传输层,直接操作 IP 层,需要 root 权限。
TCP 连接建立
三次握手:客户端发送 SYN,服务端回复 SYN+ACK,客户端回复 ACK。
ISN(Initial Sequence Number)是初始序列号,随机生成,防止序列号猜测攻击。
TCP 连接终止
四次挥手:主动方发送 FIN,被动方回复 ACK,被动方发送 FIN,主动方回复 ACK。
TIME_WAIT 状态持续 2MSL(Maximum Segment Lifetime,约 60 秒),确保最后的 ACK 能够到达,确保旧连接的报文段在网络中消失。
I/O 模型
阻塞 I/O:进程阻塞直到数据准备好并拷贝到用户空间。简单直观,但一个线程只能处理一个连接。
非阻塞 I/O:进程立即返回,不管数据是否准备好。进程需要不断轮询,浪费 CPU。
I/O 多路复用:select/poll/epoll 同时监控多个文件描述符,任一描述符就绪时返回。一个线程处理多个连接。
信号驱动 I/O:内核就绪时发送 SIGIO 信号,进程在信号处理函数中处理 I/O。
异步 I/O:进程发起 I/O 后立即返回,I/O 完成后内核通知进程。真正的异步,但支持有限。
网络性能优化
零拷贝:减少数据拷贝次数和上下文切换,提升 I/O 性能。
I/O 多路复用:使用 epoll 等机制,单线程处理大量连接。
TCP 参数调优:调整缓冲区大小、超时时间、拥塞控制参数。
连接池:复用连接,减少连接建立和关闭的开销。