网络编程
文章平均质量分 62
为成大道踏平坎坷
这个作者很懒,什么都没留下…
展开
-
TCP POSIX API网络协议栈实现原理
有哪些底层api接口服务器端socketbindlistenacceptrecvsendclose客户端connectepollepoll_createepoll_ctlepoll_waitTCP的三个过程建立连接tcp和udp的connect函数的作用tcp的connect 只有在服务器的状态是listen时,才能发送udp的connect只是验证一下这条路径是否通畅,不会建立连接三次握手发送在哪个函数客户端:accept函数服务器:listen和a原创 2021-09-09 20:30:35 · 420 阅读 · 0 评论 -
几种reactor模型
reactor模型组成:非阻塞的I/O+I/O多路复用特征:基于事件循环,以事件驱动或事件回调的方式实现业务逻辑表述:将连接的I/O处理转化为事件处理单reactor使用1个epoll和1个线程代表:redis 内存数据库 操作redis当中的数据结构redis6.0多线程 处理数据的解压缩 数据压缩放在多线程中处理resp协议 数据解压缩会损耗cpu 影响其他网络处理单reactor+任务队列+线程池解决网络连接和业务处理之间的相互影响,做任务队列来解耦,用线程池来消费一个线原创 2021-08-10 21:18:00 · 268 阅读 · 0 评论 -
多线程阻塞I/O模型和I/O多路复用
多线程阻塞I/O模型每一个线程处理一个fd连接。优点是:处理及时缺点是:线程利用率低,主要消耗在数据准备阶段的阻塞I/O多路复用用一个线程来检测多个io事件io复用不仅用来检测readwritebuffer,还可以检测连接状态握手挥手半关闭,keepalive检测的是状态多路复用作用在数据准备阶段,其他IO函数只需要作用在数据拷贝阶段由于使用边缘触发时,io函数只能是非阻塞的...原创 2021-08-10 20:50:59 · 215 阅读 · 0 评论 -
epoll编程细节
网络编程需要关注的问题连接建立(接受客户端的连接,服务器去连接第三方服务mysql redis)连接断开消息到达(从readbuffer中取数据)消息发送完毕(将数据发到writebuffer中)连接建立来自客户端的连接产生的fd,设置为读事件进行监测。连接上游服务时,采用一个非阻塞的I/O,第一次调用connect时返回值为-1,错误号是EINPROGRESS,说明当前连接正在继续。然后将事件注册为写事件,添加到epoll中进行管理。(服务器与上游服务建立连接三次握手的过程,第二步上游原创 2021-08-10 19:26:39 · 389 阅读 · 0 评论 -
阻塞I/O模型和非阻塞I/O模型
阻塞I/O模型和非阻塞I/O模型每个连接都存在这样的readbuffer和writebuffer。阻塞I/O模型read的时候看readbuffer里面是否有数据,有数据说明已经准备好了,数据准备阶段就绪。如果readbuffer中没有数据,则说明数据没有准备好,需要阻塞等待。准备结束后进入数据拷贝阶段,将数据从内核空间拷贝到用户空间,完成数据拷贝阶段。write的时候看writebuffer中的数据是否已满,数据满的时候说明数据还没准备好,需要阻塞等待writebuffer中有可写的空间,此时原创 2021-08-10 17:41:26 · 489 阅读 · 0 评论 -
linux服务器实现百万并发
并发量和承载的概念并发量:一个服务器能同时承载客户端的数量承载:客户端发送给服务器的请求(http或tcp等)在200ms内可以返回正确的结果影响并发量的主要因素数据库响应速度网络带宽响应内存操作日志性能服务器能同时建立的连接数量只是并发的基础,服务器处理客户端的请求包括请求、响应、处理和关闭。网络五元组源ip目的ip源端口号目的端口号协议 由于只有一台客户端不断建立连接,所以源ip是一样的;目的ip也只有一台服务器;源端口号是不确定的,由操作系统或自己指定,目的端原创 2021-07-19 17:48:43 · 2188 阅读 · 2 评论 -
I/O复用之epoll的用法和服务器流程
epoll_createint epoll_create (int size);头文件 #include<sys/epoll.h>函数说明 :创建一棵epoll树,返回一个树根节点函数参数:size:必须传一个大于0的数返回值:返回一个文件描述符,这个文件描述符就表示epoll树的树根节点epoll_ctlint epoll_ctl(int epfd,int op,int fd,struct epoll_event* event);函数说明:将fd上epoll树,从树上删除和修原创 2021-07-09 01:23:54 · 128 阅读 · 0 评论 -
I/O复用之poll的用法和服务器流程
int poll(struct pollfd *fds, nfds_t nfds, int timeout);函数说明:跟select类似,委托内核监控可读,可写,异常事件函数参数: fds:一个struct pollfd结构体数组的首地址 struct pollfd { int fd; //要监控的文件描述符,fd=-1 内核不再监控 short events; //输入参数,告诉内核要监控的事件,读事件,写事件原创 2021-07-09 00:52:32 · 149 阅读 · 0 评论 -
I/O复用select减少查找通信socket循环次数的优化
存在的问题如果需要内核监控的可读文件描述符集中,存在大量的已关闭的空余位置,但是查找通信socket的时候仍然需要遍历,那么会有多余的循环次数,且每轮都会重复无用功未改进之前的代码框架,每次客户端请求到来后,都要将产生的通信socket加入到监测内容中,同时需要监测的范围maxfd也随之变大,但是在遍历通信socket的过程中,可能有的通信socket已经出错或者客户端连接断开了,这些位置的文件描述符必然不会发生就绪事件,也就是不会存在在select传出的就绪文件描述符集中,轮询的过程中,一直遍历到最大原创 2021-07-09 00:40:37 · 134 阅读 · 0 评论