IO-Linux接受数据包的过程
2021-08-31 11:17:49 3 举报
Linux接受数据包的过程主要包括以下几个步骤:首先,网卡接收到数据包后,会将数据包存储在内核缓冲区中。然后,内核会通过硬件中断通知CPU有新的数据包到达。接着,CPU会调用网络协议栈中的函数来处理这个数据包。这个过程可能包括解析数据包头部、检查校验和、查找路由表等操作。如果数据包是发给本机的,那么网络协议栈会将数据包传递给上层应用程序;如果数据包是发给其他机器的,那么网络协议栈会将数据包发送出去。最后,当所有数据处理完成后,内核会释放缓冲区中的内存空间。这个过程是异步的,不会影响到其他任务的执行。
作者其他创作
大纲/内容
一旦 buffer 存满了,就会造成 通讯阻塞,新来的包会被丢弃,长时间不做处理,会造成超时
epoll 1
每一个 socket 是一个四元组,持有自身特定的属性。读写数据分别在不同的区域缓存。
数据段
四层连接的处理,是在硬件层级解决的。只要端口开启了监听,就可以处理如 tcp 三次握手、四次分手这样的流程,也就是建立连接
搬运数据
epoll将数据从红黑树中,搬运到 list
数据被搬运到内核空间
epoll 2
epoll
socket buffer
epoll_wait
内存块 44kb
代码块
创建一个 epoll ,返回 fd
红黑树
通知DMA搬运数据
真实地址
向 epoll 的 fd 中添加、修改、删除 特定事件的 fd,如监听特定端口的事件
线性地址
epoll 在 kernel 内存中
mmap就是将kernel中的内存块,直接映射到用户空间的内存地址中
内存块 14kb
中断信号
优势:1. 用户空间不知道内存数据的真实地址,安全性高,耦合性低。2. 内存块的4kb是因为每次磁盘读取 4kb 的数据到内存。这么做的原因是为了在处理一段代码时,如果每次值从磁盘读取 1字节的数据,那磁盘的读取效率太低。所以会预先读取,规定一次读 4kb。3. 一个应用在运行时,不需要将磁盘中所有数据都一次读到内存中,而是随用随读,大大减轻了内存的压力。
DMA
epoll_ctl
内存
kernel 空间
虚拟内存
用户空间
触发回调函数
buffer
数据经过网卡,进入网卡的 buffer 中,发起一个中断
list
1. 只要 send_queue 是空的,那么 这个 socket 就是可写的。2. 但 是否要写,就取决于用户了。
0||||max(内存)
内存块 (kernel)4kb
kernel
内核
user
回调函数
网卡触发中断信号 3个级别:1. package,一个包触发一次2. buffer 满了 触发一次3. 轮序
recv-queue
数据
send-queue
epoll_create
收藏
收藏
0 条评论
回复 删除
下一页