http服务详解(1)——一次完整的http服务请求处理过程

前言:要熟练掌握一个服务,首先需要非常了解这个服务的工作过程,这篇就详细解释了http服务的请求处理过程。

一次完整的http请求处理过程

(1)流程图

(2)过程详解

0、DNS域名解析:递归查询、迭代查询

  递归查询:客户端向第一个服务器查询,给最终结果

  迭代查询:第一个服务器向根查询

1 、建立连接:接收或拒绝连接请求:三次握手的过程

提高HTTP 连接性能:

  并行连接:通过多条TCP 连接发起并发的HTTP 请求

  持久连接:keep-alive, 长连接,重用TCP 连接,以消除连接和关闭的时延, 以事务个数和时间来决定是否关闭连接

  管道化连接:通过共享TCP 连接发起并发的HTTP 请求

  复用的连接:交替传送请求和响应报文(实验阶段,还未实现)

① 串行连接

② 并行连接

③ 持久连接

④ 管道化连接

 

2 、接收请求:接收客户端请求报文中对某资源的一次请求的过程,请求报文

Web 访问响应模型(Web I/O)

  单进程I/O 模型启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应,太古老了

  多进程I/O 模型 : 并行启动多个进程, 每个进程响应一个连接请求

  复用I/O 结构 :启动一个进程,同时响应N 个连接请求连接池

    实现方法: 多线程模型和事件驱动

    多线程模型:一个进程生成N个线程,每线程响应一个连接请求

    事件驱动:一个进程处理N 个请求,Nginx

      进程:比如复制的工作,项目小组,耗资源

      线程:比如人,轻量级

      一个进程必有一个线程,一个进程可以有多个线程

  复用的多进程I/O 模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N 个请求


3 、处理请求

服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息 ,根据方法,资源,首部和可选的主体部分对请求进行处理

  元数据:请求报文首部

  <method> <URL> <VERSION>

  HEADERS 格式 name:value

  <request body>

示例:

  Host: www.along.com 请求的主机名称

  Server: Apache/2.4.7

  HTTP 常用请求方式,Method:

  GET 、POST 、HEAD 、PUT 、DELETE 、TRACE 、OPTIONS

 

4 、访问资源:

服务器获取请求报文中请求的资源web 服务器,即存放了web 资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源

资源放置于本地文件系统特定的路径:DocRoot 服务的根

  DocRoot ---> /var/www/html

  例:/var/www/html/images/logo.jpg

  http://www.along.com/images/logo.jpg

web 服务器资源路径映射方式:下篇会详解

  (a) docroot

  (b) alias

  (c) 虚拟主机docroot

  (d) 用户家目录docroot

 

5、构建响应报文

一旦Web 服务器识别出了资源,就执行请求方法中描述中的动作,并返回响应报文。响应报文中 ,包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体。

1)响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括:

  描述了响应主体MIME 类型的Content-Type 首部

  描述了响应主体长度大小的Content-Length

  实际报文的主体内容

2)URL 重定向:web 服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径

  永久重定向:http://www.360buy.com ---> http://www.jd.com

  临时重定向:http://www.taobao.com  ---> https://www.taobao.com

3)MIME 类型:多媒体的邮件扩展

Web 服务器要负责确定响应主体的MIME 类型。有很多配置服务器的方法可以将MIME 类型与资源管理起来

  魔法分类(扫描首部信息):Apache web 服务器可以扫描每个资源的内容,并将其与一个已知模式表,首部( 被称为魔法文件) 进行匹配,以决定每个文件的MIME 类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名的时候

  显式分类:可以对Web 服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个MIME 类型,例如:php,Apache不识别,强制识别

  类型协商: 有些Web 服务器经过配置,可以以多种文档格式来存储资源。在这种情况下,可以配置Web 服务器,使其可以通过与用户的协商来决定使用哪种格式( 及相关的MIME 类型)" 最好"

 

6 、发送响应报文

Web 服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接, 有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据 。服务器 要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接 。对持久连接来说,连接可能仍保持打开状态,在这种情况下, 服务器要 正确地计算Content-Length 首部,不然客户端就无法知道响应什么时候结束了

 

7 、记录日志

最后 ,当事务结束时,Web 服务器会在日志文件中添加一个条目,来描述已执行的事务

日志类型:下一篇会详解日志各项格式的意义

  访问日志:现在愈发重要,大数据的时代

  错误日志:排错使用

 

另附一张http服务通信过程:

 

下篇更精彩,尽情期待~

转载于:https://www.cnblogs.com/along21/p/7691234.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程管理(九)使用本地线程变量

声明&#xff1a;本文是《 Java 7 Concurrency Cookbook 》的第一章&#xff0c; 作者&#xff1a; Javier Fernndez Gonzlez 译者&#xff1a;郑玉婷 校对&#xff1a;方腾飞 使用本地线程变量 并发应用的一个关键地方就是共享数据。这个对那些扩展Thread类或者实现Runnable接…

5训练需要更改参数吗_糖尿病病人需要多喝水吗?多喝水的5大好处,了解一下...

糖尿病是典型的慢性疾病&#xff0c;需要在生活中多加讲究&#xff0c;从各方面进行预防&#xff0c;其中喝水也是非常重要的一项调控方法。这就与糖尿病影响到患者的代谢功能有一定的关系&#xff0c;如果能够保持良好的饮水习惯&#xff0c;就可以有效解决糖尿病带来的影响。…

wordpress搭建博客 主题推荐 2019

一、generatepress2.14 主页&#xff1a; 详情页&#xff1a; 二、 Astra 主页&#xff1a; 详情页&#xff1a; 三、Bstone 主页&#xff1a; 详情页&#xff1a; 四、Hestia 主页&#xff1a; 详情页&#xff1a; 五、Rife free 主页&#xff1a; 详情页&#xff1a;

Blazor学习之旅(1)初步了解Blazor

【Blazor】| 总结/Edison Zhou九月以来在学习Blazor做全栈开发&#xff0c;因此根据老习惯&#xff0c;我会将我的学习过程记录下来&#xff0c;一来体系化整理&#xff0c;二来作为笔记供将来翻看。作为第一篇&#xff0c;我们先来了解一下这个Blazor到底是个什么鬼。什么是Bl…

英国如何推动分享经济的发展?

——基于英国“分享经济全球中心”战略的深度分析 蔡雄山 腾讯研究院法律研究中心首席研究员 徐 俊 腾讯研究院助理研究员 “分享经济具有巨大的经济潜力&#xff0c;我希望确保英国处于分享经济的前沿与中心&#xff0c;并且成为能够与旧金山相媲美的高科技初创企业的发源地…

C#合并文件夹图片列表 自定义排版顺序

本次程序编写主要为了将pdf word等文档转换为图片后设置不同的打印排版 前提 目标文件夹中的图片高宽都是一致的 /// <summary>/// 合并图片/// </summary>/// <param name"savedictory">文件保存目录</param>/// <param name"singl…

硬盘基本知识(一)

总体来说&#xff0c;硬盘结构包括&#xff1a;盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部份。所有的盘片&#xff08;一般硬盘里有多个盘片&#xff0c;盘片之间平行&#xff09;都固定在一个主轴上。在每个盘片的存储面上都有一个磁头&…

MySQL - 存储过程

一、概述 存储过程可以理解为一段 SQL 语句的集合&#xff08;相当于 PHP 中的一个函数方法&#xff0c;去实现业务逻辑&#xff09;&#xff0c;它们被事先编译好并且存储在数据库中。 调用存储过程与直接执行 SQL 语句的效果是相同的&#xff0c;但是存储过程的一个好处是处理…

白话聊应用架构

产业互联网时代&#xff0c;数字化转型&#xff08;数字化演化历史&#xff09;已成为一种趋势&#xff0c;各行各业都投入到数字化转型的浪潮中来。节后有个客户项目参与者问我架构方面的事情&#xff0c;我想来想去对于非IT人来说&#xff0c;可能应用架构是最容易理解&#…

python大数_python处理大数字的方法

本文实例讲述了python处理大数字的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;def getFactorial(n):"""returns the factorial of n"""if n 0:return 1else:k n * getFactorial(n-1)return kfor k in range(1, 70):print "…

数据库分库分表、读写分离的原理和实现,以及使用场景

2019独角兽企业重金招聘Python工程师标准>>> 为什么要分库分表和读写分离&#xff1f; 类似淘宝网这样的网站&#xff0c;海量数据的存储和访问成为了系统设计的瓶颈问题&#xff0c;日益增长的业务数据&#xff0c;无疑对数据库造成了相当大的负载&#xff0c;同时…

谈谈一些有趣的CSS题目(十六)-- 奇妙的 background-clip: text

开本系列&#xff0c;谈谈一些有趣的 CSS 题目&#xff0c;题目类型天马行空&#xff0c;想到什么说什么&#xff0c;不仅为了拓宽一下解决问题的思路&#xff0c;更涉及一些容易忽视的 CSS 细节。 解题不考虑兼容性&#xff0c;题目天马行空&#xff0c;想到什么说什么&#x…

第五周软件工程作业-每周例行报告

一、PSP T名称C内容ST开始时间ED结束时间中断时间/min实际时间/minScrum会议第一次Scrum会议10月13日11:3010月13日12:10040第二次Scrum会议10月14日15:3010月14日15:55025第三次Scrum会议10月15日13:3010月15日14:05035第四次Scrum会议10月16日11:3010月16日13:00090第五次Scr…

MySQL - 触发器

一、概述 Mysql 允许通过触发器、存储过程、函数的形式来存储代码。 触发器可以让你在执行 Insert、Update、Delete的时候&#xff0c;执行一些特定的操作。可以在Mysql中指定是在Sql语句执行之前触发还是执行后触发。 二、使用触发器需要注意的点 对每一个表的每一个事件&a…

Docker Desktop 可以直接启用Kubernetes 1.25 了

作为目前事实上的容器编排系统标准&#xff0c;K8s 无疑是现代云原生应用的基石&#xff0c;很多同学入门可能直接就被卡到第一关&#xff0c;从哪去弄个 K8s 的环境&#xff0c; Docker Desktop 自带了Kubernetes 服务&#xff0c;但是在过往的经验中就是用梯子也安装不了&…

截取url的host_java正则表达式获取url的host示例

java正则表达式获取url的host示例 复制代码 代码如下: public static String getHost(String url){if(url==null||url.trim().equals("")){return ""; } String host = ""; Pattern p = Pattern.compile("(?<=//|)((\\w)+\\.)+\\w+&qu…

MySQL - 视图

一、概述 Mysql 5.0 版本后开始引入视图。视图本身是一个虚拟表&#xff0c;不存放任何数据。在使用 sql 语句访问视图的时候&#xff0c;他返回的数据都是在查询过程中从其他表动态生成的。 二、使用视图   1、创建视图 CREATE VIEW comic_view as SELECT comic_id,name,pe…

Linux环境下压缩与解压命令大全

tar命令 解包&#xff1a;tar zxvf FileName.tar 打包&#xff1a;tar czvf FileName.tar DirName gz命令 解压1&#xff1a;gunzip FileName.gz 解压2&#xff1a;gzip -d FileName.gz 压缩&#xff1a;gzip FileName .tar.gz 和 .tgz 解压&#xff1a;tar zxvf FileName.tar.…

Centos 磁盘管理及配额管理

实验内容&#xff1a;一.添加两块硬盘&#xff0c;使用LVM做成VG01组&#xff0c;在该VG中新建两个LV。二.将这两个LV格式化为ext4/xfs&#xff0c;开机自动挂载到系统mnt1,mnt2目录下。三.lv02开启磁盘配额功能&#xff0c;用来进行用户与组分配额的实验。四.在系统里添加用户…

OnionArch - 采用DDD+CQRS+.Net 7.0实现的洋葱架构

博主最近失业在家&#xff0c;找工作之余&#xff0c;看了一些关于洋葱&#xff08;整洁&#xff09;架构的资料和项目&#xff0c;有感而发&#xff0c;自己动手写了个洋葱架构解决方案&#xff0c;起名叫OnionArch。基于最新的.Net 7.0 RC1, 数据库采用PostgreSQL, 目前实现了…