免费网页制作教程视频,杭州seo网络推广,重庆建网站培训机构,盗用别人的图片做网站犯法网络组件系列文章目录
第四章 网络设计与redis、memcached、nginx组件 文章目录 网络组件系列文章目录文章的思维导图前言一、网络相关的问题#xff0c;网络开发中要处理那些问题#xff1f;网络操作IO连接建立连接断开消息到达消息发送网络操作IO特性 二、网络中IO检测IO函…网络组件系列文章目录
第四章 网络设计与redis、memcached、nginx组件 文章目录 网络组件系列文章目录文章的思维导图前言一、网络相关的问题网络开发中要处理那些问题网络操作IO连接建立连接断开消息到达消息发送网络操作IO特性 二、网络中IO检测IO函数检测IO MULTIPLXINGIO多路复用EPOLL 原理图EPOLL2.EPOLL 函数 总结 文章的思维导图 前言
本文要介绍网络开发当中常用的网络IO和网络IO处理的数据以及几种常用的reactor 模型 一、网络相关的问题网络开发中要处理那些问题
网络操作IO
1.连接建立 2.连接断开 3.消息到达 4.消息发送 以上的四个问题归根到底还是网络IO问题网络IO 函数两大特性IO函数检测状态IO函数进行操作 IO函数的检测 该检测是精确的检测它能过够通过函数返回值和errno 的值体现出函数的状态 IO函数的操作 connect listen accept read write 等函数都能够操作对应的数据
网络中IO 函数本身就被检测功能和操作功能。
连接建立
连接建立分为主动建立和被动建立连接 主动建立连接服务器和第三方通过connet 建立连接被动建立连接服务器 需要socket bind listen acceopt 监听客户端 connectlisten accept是关于网络的连接建立。accept检测全连接队列中是否有tcb如果有则从中取出一个节点返回一个对象clientfd以及客户端的IP地址。connect是对于客户端而言如果客户端收到ACK即连接建立成功。对应三次握手
连接断开
连接断开范围主动断开和被动断开 主动断开 主动调用 close() 或shutdown() 被动i断开 通过read 和write返回值和状态检测
消息到达
网络中消息发送一般使用read() 读取数据 read 返回值为-1 且errno EWOULDBLOCK 说明read buffer 为空。
消息发送
网络中消息发送一般使用write(); write 返回值为-1 且errno EWOULDBLOCK 说明writebuf 满了。
read是把数据从内核态read buffe拷贝到用户态中当期为0代表read buffer中读到EOF通过read 返回值和errno 确定read buffer 状态 write是把数据从用户态拷贝到内核态write buffe中 通过write 返回值和errno 确定write buffer 状态。
网络设备中读写理解 以电脑CPU为中心。从外界的设备(键盘磁盘等等)向CPU传递信息就是“读操作”由CPU向外界设备(屏幕磁盘等等)传递信息就是“写操作”。
客户端读端 -- 服务端写端(write buffer)
客户端 写端服务端读端read buffer网络操作IO特性
操作IO函数分为阻塞和非阻塞。 阻塞位置 阻塞在网络线程连接的fd 阻塞属性决定了IO函数是否阻塞
阻塞非阻塞区别 在数据准备阶段。阻塞IO在系统调用read 数据的时候readbuffer 为空则阻塞追到数据准备好。阻塞到内核当中。非阻塞 数据准备阶段无论是否有数据系统调用就立刻返回。
二、网络中IO检测
IO函数检测
IO函数本身可以检测 IO的状态但是只能检测一个 fd 对应的状态
IO MULTIPLXING
只检测IP的就绪状态同时可以检测多条链路的就绪状态可以检测多个IO的就绪状态他从来不操作IO IO 多路复用的检测是笼统的检测只能检测出可读、可写、错误、断开等笼统的事件
IO多路复用
IO多路复用是系统调用的数据准备阶段
EPOLL 原理图 调用 epoll_create 会创建一个 epoll 对象调用epoll_ctl 添加到 epoll 中的事件都会与网卡驱动程序建立回 调关系相应事件触发时会调用回调函数 ep_poll_callback 将触发的事件拷贝到 rdlist 双向 链表中调用 epoll_wait 将会把 rdlist 中就绪事件拷贝到用户态中
EPOLL 代码如下示例 epoll 中相关的结构 struct eventpoll {
// ...
struct rb_root rbr; // 管理 epoll 监听的事件
struct list_head rdllist; // 保存着 epoll_wait
返回满⾜条件的事件
// ...
};struct epitem {
// ...
struct rb_node rbn; // 红⿊树节点
struct list_head rdllist; // 双向链表节点
struct epoll_filefd ffd; // 事件句柄信息
struct eventpoll *ep; // 指向所属的eventpoll对
象
struct epoll_event event; // 注册的事件类型
// ...
};struct epoll_event { // 事件结构体 把事件类型和句柄关联
__uint32_t events; // epollin epollout epollet(边缘触发)
epoll_data_t data; // 保存 关联数据
};typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
}epoll_data_t;2.EPOLL 函数 创建epoll对象每个线程当中只有一个epoll 对象 int epoll_create(int size); 该处使用的url网络请求的数据。 操作epoll 事件 节点存储在红黑树中 操作方法 EPOLL_CTL_ADD EPOLL_CTL_MOD EPOLL_CTL_DEL 操作的事件类型 event.events: EPOLLIN 注册读事件 EPOLLOUT 注册写事件 EPOLLET 注册边缘触发模式默认是水平触发 int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);获取就绪事件把就绪事件从内核中copy 到用户态度。内核中就绪事件存储在双向链表中 int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);
获取就绪事件状态 events[i].events: EPOLLIN 触发读事件 EPOLLOUT 触发写事件 EPOLLERR 连接发生错误 EPOLLRDHUP 连接读端关闭 EPOLLHUP 连接双端关闭
epfd: epoll 对象 struct epoll_event* events 内核中copy 就绪事件存储在用户态地址 int maxevents 预取就绪事件的个数
timeout : 设置此值可以产生阻塞和非阻塞的性质 IO多路复用没有阻塞状态可以通过timeout 值设置出现对应的特性 timeout -1 一直阻塞直到网络事件到达 imeout 0 不管是否有事件就绪立刻返回 timeout 1000 最多等待 1 s如果1 s内没有事件触发则返回
总结
提示这里对文章进行总结
略二归的时候写感想