1. 什么是WebServer?

<aside> 💡 Web服务器是一种软件程序,它在Internet上提供Web服务。它接收来自Web浏览器的HTTP请求,并从服务器上提供响应。Web服务器通常用于托管网站、应用程序和服务,它们可以处理动态和静态内容,并提供访问控制、安全性和其他功能。常见的Web服务器包括Apache、Nginx和Microsoft IIS

</aside>

2. 如何通信?

<aside> 💡 一个WebServer如何和用户进行通信,就需要在浏览器输入域名或者IP地址:端口号,浏览器会先将你的域名解析成响应的IP地址(DNS)或者直接根据你的IP:Port向对应的Web服务器发送一个HTTP请求。这个过程需要TCP协议的三次握手建立和目标Web服务器的连接,然后HTTP协议生成针对该Web服务器的HTTP请求报文,这个报文里面包括了请求行、请求头部、空行和请求数据四个部分(后面再细讲),通过TCP/IP协议发送到Web服务器上。

</aside>

3. 如何实现高并发的WebServer?

<aside> 💡 如何实现一个高并发的WebServer,肯定要涉及到I/O多路复用技术。

Web服务器端通过socket监听来自用户的请求。远端的很多用户会尝试去connect()这个Web Server上正在listen的这个port,而监听到的这些连接会排队等待被accept()。由于用户连接请求是随机到达的异步事件,每当监听socket(listenfd)listen到新的客户连接并且放入监听队列,我们都需要告诉我们的Web服务器有连接来了,accept这个连接,并分配一个逻辑单元来处理这个用户请求。而且,我们在处理这个请求的同时,还需要继续监听其他客户的请求并分配其另一逻辑单元来处理(并发,同时处理多个事件,后面会提到使用线程池实现并发)。

这里,服务器通过epoll这种I/O复用技术(还有select和poll)来实现对监听socket(listenfd)和连接socket(客户请求)的同时监听。注意I/O复用虽然可以同时监听多个文件描述符,但是它本身是阻塞的,并且当有多个文件描述符同时就绪的时候,如果不采取额外措施,程序则只能按顺序处理其中就绪的每一个文件描述符,所以为提高效率,我们将在这部分通过线程池来实现并发(多线程并发),为每个就绪的文件描述符分配一个逻辑单元(线程)来处理。

服务器程序通常需要处理三类事件:I/O事件,信号及定时事件。有两种事件处理模式:

所以,Reactor 可以理解为「来了事件操作系统直接通知,自己啥也不干,让子线程来处理读写」,而 Proactor 可以理解为「来了事件操作系统来处理,处理完再通知主线程」。这里的「事件」就是有新连接、有数据可读、有数据可写的这些 I/O 事件。这里的「处理」包含从驱动读取到内核以及从内核读取到用户空间。

</aside>

原文链接:https://blog.csdn.net/weixin_51322383/article/details/130470806

4. 框架

Untitled

参考:https://github.com/qinguoyi/TinyWebServer