当前位置: 首页 > article >正文

HTTP分析

  • 1.WebServer:

通过HTTP协议和客户端进行通信,接收,存储,处理HTTP请求,并且做出相应,给出图片,网页,视频,或者error。

  • 2.怎么通信:

IP+端口号,要TCP三次握手,然后生成HTTP请求报文,通过TCP/IP发送到服务器上。

  • 3.如何接收HTTP请求报文:

socket–>bind–>listen
客户端会connect正在listen的port
监听到的连接会排队等待被accept
每当listenfd listen到了新用户连接,都要告诉
并且要他accept,并且分配一个逻辑单元处理。
初级:一个新连接对应一个进程 一对一
中级:多进程,父进程fork给子进程
高级:多线程,或线程池
顶级:I/O多路复用 select poll epoll

epoll可以1.listenfd    2.连接socket

但是I/O复用还是阻塞的,可以用线程池,
为每个就绪的fd分配一个池内线程来处理
epoll流程:create–>ctl注册–>wait

  • server处理三类:I/O事件、信号、定时事件

Reactor: I/O 多路复用监听事件,收到事件后,根据事件类型分配(Dispatch)给某个进程 / 线程。I/O处理单元就负责fd是否可读可写,处理还得是工作线程。
Proactor:来了事件,我操作系统来处理,处理完通知应用进程,异步。所有的I/O操作都给主线程和内核(os),工作线程只负责处理逻辑。

本项目:同步I/O模拟Proactor
  • 4.如何处理、响应HTTP请求报文?
    用线程池(半同步版反应堆)来并发处理用户请求,listenfd上监听的通过accept接手之后,返回一个新的fd名为connfd用于和用户通信。之后再通过发现这个connfd上可读。就会把请求报文读进读缓存内,然后将指针插入线程池的请求队列中。

  • 5.什么是线程池,为什么要用个池子?数量怎么确定?
    就是个pthread类型的数组而已。
    create创建的m个线程
    都用来执行worker函数,来应对HTTP请求
    detech就可以脱离,会自动回收。
    加锁 加锁 加锁
    因为启动新线程需要性能开销的。
    线程数目限制因素就是CPU cores
    CPU密集型最好就pthread=cores
    IO密集就要pthread>cores

最佳线程数 =
CPUCores数 * 当前CPU的利用率 * (1 + CPU等待时间 / CPU处理时间)

  • 6.具体讲讲怎么处理HTTP请求:
void http_conn::process() {
    HTTP_CODE read_ret = process_read();
    if(read_ret == NO_REQUEST) {
        modfd(m_epollfd, m_sockfd, EPOLLIN);
        return;
    }
    bool write_ret = process_write(read_ret);
    if(!write_ret)
        close_conn();
    modfd(m_epollfd, m_sockfd, EPOLLOUT);
}

我们可以发现,就是在connfd的读缓冲区内,有客户端发来的请求报文。有GET和POST,
GET:从服务器获取资源
POST:根据报文body对指定资源处理,留言
而上述的process_read函数就可以解析GET和POST。

而如何解析,通过主从状态机:
从状态机:只负责读报文的一行
主状态机:负责对从状态机读的那一行解析。
parse_request_line(text)—>
parse_headers(text);—>
parse_content(text);
解析请求行,请求头部,请求体。

具体GET的示例:就是输入了http://1.92.129.219:9006/之后返回一个html就已经是GET了
按了button,就会发送POST,POST账号和密码。(分析html代码 button的method=“post”)


http://www.kler.cn/a/283784.html

相关文章:

  • 编写红绿起爆线指标(附带源码下载)
  • 蓝桥杯每日真题 - 第7天
  • 性能优化、安全
  • three.js 杂记
  • 算法——移除链表元素(leetcode203)
  • springboot项目中,使用ProGuard 对代码进行混淆
  • 高级java每日一道面试题-2024年8月30日-数据库篇-数据库的三范式是什么?
  • Java技术栈 —— Spark入门(三)之实时视频流
  • Dubbo如何传递链路追踪id?
  • 小琳AI课堂:使用ChatGPT API搭建系统(二)
  • innovus:如何让部分sink长到target insertion delay的长度
  • 关于OBI 在unity URP环境下使用的正确步骤
  • 网络编程(学习)2024.8.27
  • jQuery基础——选择器的补充方法——过滤方法、查找方法
  • python使用multiprocessing多进程通讯
  • 各种各样的正则表达式
  • 92. UE5 RPG 使用C++创建GE实现灼烧的负面效果
  • 达梦数据库-DM8 企业版安装指南
  • [java][代码] java中date格式化输出时间字符串
  • 《征服数据结构》LFU缓存
  • Vatee万腾平台:打造企业智能化转型的坚实后盾
  • 【Android】UIMode
  • fpga图像处理实战-双三次插值算法
  • Jmeter提取token并设置为全局变量
  • 聊聊STM32 MCU的BOOT0和BOOT1引脚
  • 浅谈Vue3和React18