项目八股

synapse331 / 2023-08-19 / 原文

项目涉及知识点

C++11新特性:auto类型推导、lambda匿名捕获、范围for循环、智能指针、constexpr、右值引用完美转发移动构造、nullptr
多线程编程:线程互斥、同步、线程池、任务队列
网络编程:http,tcp/ip,epoll/poll/select区别、socket流程,epoll底层实现
linux文件io:
服务器日志:

项目表述

项目是浏览器服务器架构,最基本要求是浏览器发送一个http请求,服务器要能建立起这个tcp连接接收这个http请求并且解析它的内容,然后根据内容进行操作响应,并且要能返回给浏览器请求的结果。实际情况是提出了更高的要求,比如要能够同时监听处理多个请求,用户注册登录查看图片上传下载这些服务器拓展功能,利用一些技术来实现更高的要求。

重难点主要是线程池提交任务设计(包括线程安全的问题),http解析和响应的大段逻辑设计,还有定时器超时跟延时的操作逻辑。

具体来说,首先基于epoll io复用技术使得单个线程能同时监听多个tcp请求,然后引入线程池,将请求任务打包提交给任务队列让工作线程去执行缓解主线程的压力。
对于请求任务,将其分成了解析和响应两个阶段,解析请求通过正则表达式和有限状态机实现,正则表达式在解析请求行、请求头请求体过程中负责匹配关键字符获取到例如请求类型请求url,content length等等,有限状态机负责在每一次进入解析循环中在不同状态切换跳过已经解析的阶段,使得结构上紧凑。
设计解析代码的时候需要针对不同的请求可能请求的内容都进行设计,比如在我的项目里用到了POST请求跟GET请求,这个POST请求就用于用户注册登录以及上传文件,对于第一种,用户注册登录,请求体里会有key=value这种键值对内容表示用户名跟密码,解析得到了这个需要调用数据库进行增加查找操作。对于第二种,上传文件,解析时只需要它的名称部分,那请求体的内容需要用一个额外的string存储,再利用文件流将其写入到磁盘上。
GET请求
响应阶段采用将响应结果和响应的内容写入socket的发送缓冲区进行传输,响应结果就是按响应状态行,响应头,响应体的顺序写,响应的内容写入发送缓冲区。响应内容对于客户端看到的东西影响是最大的,浏览器接收到响应后,会根据响应头中的内容类型(Content-Type)确定如何处理响应体。并发请求并发解析渲染都是浏览器本身在完成,服务器响应体写入的代码逻辑需要根据请求内容进行返回。

数据库优化,缓冲区优化,心跳检测,

项目八股:
解释一下TCP、UDP区别
解释一下http
解释一下tcp三次握手四次挥手
多进程多线程

IO复用
设计模式