一、网络编程基础

1.网络io、fd、tcp连接、事件、业务的联系?

网络io:数据收、发,对事件的处理。

收:数据由外部网络--经网卡到内核空间--拷贝到用户空间。

发:数据由用户空间-拷贝到网卡-发送到外部网络。

fd是io操作的的唯一抽象标识,fd与tcp的生命周期大体一致,是一对一的关系。

事件:可读事件(EPOLLIN)、可写事件(EPOLLOUT)

io的生命周期包含无数个事件,服务器、reactor(事件驱动框架)管理的是事件。

2.什么是IO多路复用,select、poll、epoll的区别?

IO多路复用:一个进程、线程,监控多个fd。

select、poll都需要把fd集合拷贝到内核空间,再通过轮询得到就绪事件。(面临大量io时,拷贝、轮询会过度占用cup)

epoll零拷贝、无需轮询,红黑树管理fd总集合,双向链表管理就绪fd,快速得到就绪事件,cup占用更少。

select的参数多、版本较低时并发工具,poll适用于并发量小的场景;epoll专门用于高并发。

select:

poll:

epoll:

3.epoll的水平触发LT、边沿触发ET的区别、使用场景?

LT:内核缓冲区有数据可读就一直触发。

ET:内核缓冲区发生 无数据到有数据 的状态变化时触发(若内核缓冲区有数据,又有新的数据追加进来,也可触发)。

ET+循环recv+非阻塞 为常用模式

使用场景:

非阻塞io就用ET(经典模式)

数据包大小不确定时:ET (低触发、高吞吐)

数据包大小确定时:LT (代码简洁)

设置位置:epoll_event结构体中events

注意:

ET非阻塞情况下需要 管理好fd的生命周期,二次清理关闭fd,避免非必要错误打印。

如:recv返回-1时 -- 缓冲区暂满、error的分类处理

main中recv部分二次清理fd:

二、网络编程进阶

1.什么是reactor,为什么需要reactor,比epoll有什么优势?

reactor是基于epoll实现的 事件驱动网络框架。

框架的优势:

为每个io分配缓冲区、长度,绑定回调函数、status、is_close等,实现状态管理:

遇到什么事件就调用对应回调函数:

EPOLLIN--accept_cb(监听sockfd)、recv_cb(clientfd)  EPOLLOUT--send_cb

实现网络io与业务的隔离:只做事件管理、数据收发等,至于请求的处理、响应单独封装调用。

注意:

若需要连续调用recv、send,通过set_event管理EPOLLIN、EPOLLOUT实现。

网络io部分--send:只负责发送数据,不管内容,set_event管理EPOLLIN/EPOLLOUT,实现连续send

业务逻辑:只负责数据组装,不管发送,包含status管理

2.如何实现一个webserver?

reactor.c控制网络部分,只需要稍微改动。

webserever.c封装http_request、http_response实现业务逻辑。

可封装server.h完成连接

三、每秒处理请求量QPS

工具:wrk        wrk -c50 -t10 -d10 http://192.168.202.130:2000/  (50tcp连接、10线程、10s)

注意:测试打印会严重影响性能  有打印(9k) 无打印(9w)。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐