(一)内核态与用户态
操作系统为隔离资源访问权限,划分出内核态与用户态。应用程序默认运行于用户态,仅能访问受限资源;执行 IO 等底层操作时需切换至内核态,因内核态拥有硬件访问与系统资源管理的最高权限。
从用户态到内核态的切换通过系统调用实现,操作系统会校验操作合法性。此机制隔离用户程序与系统核心,提升稳定性。例如文件读取:用户态程序无法直接访问磁盘,通过系统调用进入内核态后,由内核文件系统与磁盘驱动协作完成操作。
(二)应用程序接收网络数据流程
- 数据传输路径:网络数据先抵达网卡,经物理层和数据链路层处理后,进入内核态 Socket 缓冲区,再通过内核态到用户态的切换,拷贝至用户缓冲区供应用程序处理。
- 关键作用:网卡是数据入口并做初步处理;内核 Socket 缓冲区暂存数据并按协议栈预处理;用户缓冲区是应用程序直接操作的数据区域。
(三)同步 / 异步与阻塞 / 非阻塞
- 同步与异步:同步需等待操作完成才继续执行,逻辑简单但并发效率低;异步无需等待,通过回调或事件通知获取结果,并发能力强但实现复杂。
- 阻塞与非阻塞:阻塞时进程 / 线程暂停等待 IO 完成;非阻塞时 IO 操作立即返回状态,程序可轮询检查,避免阻塞但需控制轮询间隔。
二、计算机网络概述
(一)计算机网络定义
计算机网络是通过通信设备和线路连接地理分散的计算机,借助网络软件实现数据通信与资源共享的系统,打破地理限制,实现信息交换与软硬件资源共享。
(二)网络分类(按地域)
|-----------|---------------|--------------------|---------------------|
| 类型 | 范围 | 特点 | 典型应用 |
| 局域网(LAN) | 办公室、校园等几千米内 | 高传输速率、低误码率、易管理 | 企业内部资源共享、校园网教学资源访问 |
| 城域网(MAN) | 城市范围,几十到上百千米 | 速率介于 LAN 和 WAN 之间 | 城市政务网、教育城域网 |
| 广域网(WAN) | 跨国家 / 大洲 | 传输距离长,速率相对较低 | 互联网、跨国企业异地互联 |
| 万维网 | 基于互联网的应用服务 | 通过 HTTP 协议访问网页资源 | 电子商务、社交媒体、在线教育 |
(三)IP 与域名
IP 地址
- IPv4:32 位,点分十进制表示,地址空间约 43 亿个,分公网和局域网 IP,面临地址枯竭问题。
- IPv6:128 位,冒分十六进制表示,地址空间极大,且在安全性、性能等方面有改进。
- 域名:IP 地址的易记文本表示,通过 DNS 解析为 IP 地址。解析过程为用户输入域名后,浏览器向 DNS 服务器查询,最终获取 IP 地址建立连接。
三、网络 IO 模型
(一)IO 定义
IO 即输入 / 输出操作,是程序与外部设备、其他程序或网络主机间的数据交换过程,如键盘输入、文件读写、网络数据收发等。
(二)IO 模型应用场景
- 网络编程:管理网络通信,不同模型适配不同并发需求,如 Nginx 用 IO 多路复用处理高并发 HTTP 请求。
- 文件操作:管理文件读写,优化磁盘 IO 性能,如大数据处理用异步 IO 提升效率。
- 数据库管理:影响数据库性能,如 MySQL 的 InnoDB 用预读和异步 IO 优化读写。
- 标准输入输出:命令行程序的键盘输入和屏幕输出,依赖操作系统缓冲区管理。
(三)主要 IO 模型
- 阻塞 IO 模型
- 工作原理:IO 操作未完成时,进程 / 线程阻塞等待。
cpp
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
char buffer[1024];
int fd = open("file.txt", O_RDONLY);
// 阻塞读取文件,若数据未就绪则等待
ssize_t bytes_read = read(fd, buffer, sizeof(buffer));
printf("Read %zd bytes\n", bytes_read);
close(fd);
return 0;
}
- 特点:实现简单,高并发下资源浪费严重。
非阻塞 IO 模型
- 工作原理:IO 操作未完成时立即返回错误,程序轮询检查。
cpp
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
int main() {
char buffer[1024];
int fd = open("file.txt", O_RDONLY | O_NONBLOCK);
while (1) {
ssize_t bytes_read = read(fd, buffer, sizeof(buffer));
if (bytes_read > 0) {
printf("Read %zd bytes\n", bytes_read);
break;
} else if (bytes_read == -1 && errno != EAGAIN) {
perror("Read error");
break;
}
// 无数据时执行其他任务
usleep(100000);
}
close(fd);
return 0;
- 特点:避免阻塞,轮询消耗 CPU 资源。
IO 多路复用模型
- 工作原理:通过系统调用监控多个 IO 通道,就绪后再处理。
cpp
event.data.fd = fd;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &event);
while (1) {
int n = epoll_wait(epoll_fd, events, 10, -1);
for (int i = 0; i < n; i++) {
if (events[i].data.fd == fd && events[i].events & EPOLLIN) {
char buffer[1024];
ssize_t bytes_read = read(fd, buffer, sizeof(buffer));
printf("Read %zd bytes\n", bytes_read);
close(fd);
return 0;
}
- 特点:高效管理多 IO 通道,适合高并发场景,如 Nginx 基于 epoll 实现高性能。
- 信号驱动 IO 模型
- 工作原理:注册信号处理函数,IO 就绪时内核发送信号触发处理。
- 特点:无需轮询,信号处理复杂,兼容性有限。
异步 IO 模型
- 工作原理:内核完成 IO 操作后通过回调通知应用程序。
- 特点:IO 与程序任务并行,并发性能优,实现复杂需系统和语言支持。
四、网络体系结构与协议
(一)网络体系结构
OSI 七层模型从下到上为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,各层功能明确,协同完成网络通信。TCP/IP 协议族更简洁,对应四层为网络接口层、网络层、传输层、应用层。
(二)各层核心内容
- 物理层:处理物理介质信号传输,定义电气、机械等特性,涉及网卡、中继器等设备。
- 数据链路层:将比特流组织成帧,进行差错检测和介质访问控制,协议有以太网、PPP,设备有交换机。
- 网络层:负责跨网络路由和寻址,核心协议为 IP,还有 ICMP 等辅助协议,设备为路由器。
- 传输层:提供端到端数据传输服务,TCP 面向连接且可靠,UDP 无连接且高效,通过端口号标识应用程序。
- 会话层:管理应用程序会话连接,功能多由应用层或传输层结合程序逻辑实现。
- 表示层:处理数据格式转换、加密解密和压缩解压,保障数据正确理解。
- 应用层:直接为用户程序提供服务,协议有 HTTP/HTTPS、FTP、SMTP、DNS 等。
(三)TCP/IP 协议族概述
各层对应 OSI 模型及核心协议:网络接口层对应物理层和数据链路层,含以太网等协议;网络层以 IP 为核心;传输层有 TCP 和 UDP;应用层集成各类用户协议,简洁实用,适应不同网络环境。
(四)网络 IO 模型与协议关联
TCP 因复杂可靠性机制,高并发下常用 IO 多路复用或异步 IO;UDP 简单,适用非阻塞或 IO 多路复用。协议分层处理会影响 IO 延迟,高效 IO 模型可减少切换和拷贝开销提升效率。