linux C — udp,tcp通信

(一)内核态与用户态​

操作系统为隔离资源访问权限,划分出内核态与用户态。应用程序默认运行于用户态,仅能访问受限资源;执行 IO 等底层操作时需切换至内核态,因内核态拥有硬件访问与系统资源管理的最高权限。​

从用户态到内核态的切换通过系统调用实现,操作系统会校验操作合法性。此机制隔离用户程序与系统核心,提升稳定性。例如文件读取:用户态程序无法直接访问磁盘,通过系统调用进入内核态后,由内核文件系统与磁盘驱动协作完成操作。​

(二)应用程序接收网络数据流程​

  1. 数据传输路径:网络数据先抵达网卡,经物理层和数据链路层处理后,进入内核态 Socket 缓冲区,再通过内核态到用户态的切换,拷贝至用户缓冲区供应用程序处理。
  2. 关键作用:网卡是数据入口并做初步处理;内核 Socket 缓冲区暂存数据并按协议栈预处理;用户缓冲区是应用程序直接操作的数据区域。

(三)同步 / 异步与阻塞 / 非阻塞​

  1. 同步与异步:同步需等待操作完成才继续执行,逻辑简单但并发效率低;异步无需等待,通过回调或事件通知获取结果,并发能力强但实现复杂。
  2. 阻塞与非阻塞:阻塞时进程 / 线程暂停等待 IO 完成;非阻塞时 IO 操作立即返回状态,程序可轮询检查,避免阻塞但需控制轮询间隔。

二、计算机网络概述​

(一)计算机网络定义​

计算机网络是通过通信设备和线路连接地理分散的计算机,借助网络软件实现数据通信与资源共享的系统,打破地理限制,实现信息交换与软硬件资源共享。​

(二)网络分类(按地域)​

|-----------|---------------|--------------------|---------------------|
| 类型​ | 范围​ | 特点​ | 典型应用​ |
| 局域网(LAN)​ | 办公室、校园等几千米内​ | 高传输速率、低误码率、易管理​ | 企业内部资源共享、校园网教学资源访问​ |
| 城域网(MAN)​ | 城市范围,几十到上百千米​ | 速率介于 LAN 和 WAN 之间​ | 城市政务网、教育城域网​ |
| 广域网(WAN)​ | 跨国家 / 大洲​ | 传输距离长,速率相对较低​ | 互联网、跨国企业异地互联​ |
| 万维网​ | 基于互联网的应用服务​ | 通过 HTTP 协议访问网页资源​ | 电子商务、社交媒体、在线教育​ |

(三)IP 与域名​

IP 地址​
  • IPv4:32 位,点分十进制表示,地址空间约 43 亿个,分公网和局域网 IP,面临地址枯竭问题。
  • IPv6:128 位,冒分十六进制表示,地址空间极大,且在安全性、性能等方面有改进。
  1. 域名:IP 地址的易记文本表示,通过 DNS 解析为 IP 地址。解析过程为用户输入域名后,浏览器向 DNS 服务器查询,最终获取 IP 地址建立连接。

三、网络 IO 模型​

(一)IO 定义​

IO 即输入 / 输出操作,是程序与外部设备、其他程序或网络主机间的数据交换过程,如键盘输入、文件读写、网络数据收发等。​

(二)IO 模型应用场景​

  1. 网络编程:管理网络通信,不同模型适配不同并发需求,如 Nginx 用 IO 多路复用处理高并发 HTTP 请求。
  2. 文件操作:管理文件读写,优化磁盘 IO 性能,如大数据处理用异步 IO 提升效率。
  3. 数据库管理:影响数据库性能,如 MySQL 的 InnoDB 用预读和异步 IO 优化读写。
  4. 标准输入输出:命令行程序的键盘输入和屏幕输出,依赖操作系统缓冲区管理。

(三)主要 IO 模型​

  1. 阻塞 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 实现高性能。
  1. 信号驱动 IO 模型
  • 工作原理:注册信号处理函数,IO 就绪时内核发送信号触发处理。
  • 特点:无需轮询,信号处理复杂,兼容性有限。
异步 IO 模型​
  • 工作原理:内核完成 IO 操作后通过回调通知应用程序。
  • 特点:IO 与程序任务并行,并发性能优,实现复杂需系统和语言支持。

四、网络体系结构与协议​

(一)网络体系结构​

OSI 七层模型从下到上为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,各层功能明确,协同完成网络通信。TCP/IP 协议族更简洁,对应四层为网络接口层、网络层、传输层、应用层。​

(二)各层核心内容​

  1. 物理层:处理物理介质信号传输,定义电气、机械等特性,涉及网卡、中继器等设备。
  2. 数据链路层:将比特流组织成帧,进行差错检测和介质访问控制,协议有以太网、PPP,设备有交换机。
  3. 网络层:负责跨网络路由和寻址,核心协议为 IP,还有 ICMP 等辅助协议,设备为路由器。
  4. 传输层:提供端到端数据传输服务,TCP 面向连接且可靠,UDP 无连接且高效,通过端口号标识应用程序。
  5. 会话层:管理应用程序会话连接,功能多由应用层或传输层结合程序逻辑实现。
  6. 表示层:处理数据格式转换、加密解密和压缩解压,保障数据正确理解。
  7. 应用层:直接为用户程序提供服务,协议有 HTTP/HTTPS、FTP、SMTP、DNS 等。

(三)TCP/IP 协议族概述​

各层对应 OSI 模型及核心协议:网络接口层对应物理层和数据链路层,含以太网等协议;网络层以 IP 为核心;传输层有 TCP 和 UDP;应用层集成各类用户协议,简洁实用,适应不同网络环境。​

(四)网络 IO 模型与协议关联​

TCP 因复杂可靠性机制,高并发下常用 IO 多路复用或异步 IO;UDP 简单,适用非阻塞或 IO 多路复用。协议分层处理会影响 IO 延迟,高效 IO 模型可减少切换和拷贝开销提升效率。