HTTP-web服务器

news2024/11/27 2:34:22

web服务器

web服务器实现了http和相关的tcp连接处理,负责管理web服务器提供的资源,以及对服务器的配置,控制以及拓展等方面的管理
web服务器逻辑实现了http协议,并负责提供web服务器的管理功能,web服务器逻辑和操作系统共同负责了tcp连接,底层操作系统负责管理底层计算机系统的硬件细节,提供了tcp/ip的网络支持,负责装在web资源的文件系统以及控制当前计算活动的进程管理系统。
实际的web服务器的步骤

  1. 建立连接-接受一个客户端连接,或者如果不希望和这个客户端建立连接,就将其关闭
  2. 接收处理-从网络中读取一条HTTP请求报文
  3. 处理请求-对请求报文进行解释,并采取行动
  4. 访问资源-访问报文中指定的资源
  5. 构建响应-创建带有正确首部的http响应报文
  6. 发送响应-将响应发送给客户端
  7. 记录事务处理过程-将已经完成事务的内容记录在一个日志文件中
    在这里插入图片描述

接受客户端连接

如果客户端已经打开了一条服务器的持久连接,可以使用连接来发送他的请求。否则客户端需要打开一条新的服务器连接

处理新的连接

客户端请求一条到web服务器的tcp连接的时候,web服务器会建立起来,判断另一端是哪个客户端,从tcp连接中将ip地址解析出来,一旦建立新的连接并被接受,服务器就会将新的连接添加到现存的web服务器列表中,做好监视连接上数据的准备。
web服务器可以随意的拒绝或者立即关闭任意一条连接,有些web服务器会因为客户端的ip地址或者主机名是未认证的,或者是已知的恶意客户端而关闭连接。web服务器可以使用其他的识别技术。

客户端主机名识别

可以使用反向dns对大部分web服务器进行配置,以便将客户端ip地址从转换为客户端主机名,web服务器可以将客户端主机名用于详细的访问控制和日志记录。
主机名查找会花费大多时间,这样会降低web事务处理的速度,很多大容量web服务器会禁止主机解析,只允许对特定的内容进行解析。

通过ident确定客户端用户

有些web服务器还支持IETF的ident协议,可以通过这个协议找到http连接的用户名,这些信息对web服务器的日志记录很有用。
如果客户端支持ident协议,就在tcp端口113上监听ident请求,客户端打开了一条http连接,然后服务器打开自己到客户端ident服务器端口113的连接,发送一条简单的请求,询问与新连接对应的用户名,并从客户端解析出包含用户名的响应。
在这里插入图片描述

ident在组织内部可以很好的工作,但是在互联网上不能很好的运作。

  • 很多客户端pc没有运行ident识别协议守护进程软件
  • ident协议会使HTTP事务处理产生严重的时延
  • 很多防火墙不允许ident流量接入
  • ident协议不安全,容易被伪造
  • ident协议不支持虚拟ip地址
  • 暴露客户端的用户名还涉及到隐私的问题

接受请求报文

连接上有数据到达的时候,web服务器会从网络连接中读取数据,并将请求报文中的内容解析出来。
解析请求报文的时候,web服务器会

  • 解析请求行,查找请求方法,指定的资源标识符以及版本号,各项之间有一个空格分割,并且以一个回车符作为行的结束。
  • 读取crlf结尾的报文首部
  • 检测到crlf结尾的,标识首部结束的空行
  • 如果有的化,长度由content-length首部指定,读取请求主体
    在这里插入图片描述

报文的内部表示法

有些web服务器还会便于进行报文操作的内部数据结构来存储请求报文,数据结构中可能包含有指向请求报文中各个片段指针及其长度,这样就可以将这些首部放到一个快速查询表中,以变快速的访问特定首部的具体值了
在这里插入图片描述

连接的输入/输出处理结构

高性能的web服务器能够同时支持数千条连接,这些连接使得服务器可以与来自世界各地的客户端进行同行,每个客户端都向服务器打开了一条或者多条连接, 某些连接可能在快速的向web服务器发送请i去,而其他的一些连接则可能慢慢在发送,或者不经常发送,还有一些是空闲的,安静的等待将来可能出现的动作。

  1. 单线程的web服务器
    单线程的web服务器一次只处理一个请求,知道处理完成为止,一个事务处理结束之后,才能去处理下一条连接,这种结构易于实现,但是在处理过程中,所有其他的连接会被忽略。
  2. 多进程以及多线程web服务器
    多进程和多线程web服务器用多个进程,或者使用更高效的线程为请求进行处理,可以根据需要创建,或者预先创建一些线程或者进程。有些服务器会为每条连接分配一个线程或者进程,当服务器同时要处理成百上千甚至数以万计的连接的时候,需要的进程或者线程数量可能会消耗太多的内存或者系统资源
  3. 复用io的服务器
    为了支持大量的连接,很多web服务器都采用了复用结构,在复用结构中,要同时监视所有连接上的活动,当连接的状态发生变化的时候,就对那条连接进行少量的处理,处理结束以后,将连接返回到开放连接列表中,等待下一次的状态变化。只有在有事情做的时候才会对连接进行处理。在空闲连接上等待的时候不会绑定线程或者进程。
  4. 复用的多线程web服务器
    有些系统会将多线程和复用功能结合在一起,利用计算机平台上的多个cpu,多个线程中的每一个都在观察打开的连接或者打开的连接中的一个子集,并对每条连接执行少量的任务。
    在这里插入图片描述

处理请求

一旦web服务器接收到了请求,就可以根据方法,资源,首部和可选的主体部分来对请求进行处理了。
有的方法要求请求报文中必须带有实体主体的部分的数据,其他方法允许有请求的主体部分,也允许没有,少数方法禁止在请求报文中包含实体的主体数据。

对资源的映射以及访问

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

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

相关文章

springboot + Vue前后端项目(第十五记)

项目实战第十五记 写在前面1.后端接口实现1.1 用户表添加角色字段1.2 角色表增加唯一标识字段1.3 UserDTO1.4 UserServiceImpl1.5 MenuServiceImpl 2. 前端实现2.1 User.vue2.2 动态菜单设计2.2.1 Login.vue2.2.2 Aside.vue 2.3 动态路由设计2.3.1 菜单表新增字段page_path2.3.…

开源规则引擎LiteFlow项目应用实践

本文介绍基于开源规则引擎LiteFlow,如何开发规则设计器,在低代码平台中集成规则引擎,并在项目中实现应用的效果。由于低代码平台使用规则引擎实现了逻辑编排的需求,所以本文中的叫法为“逻辑设计”、“逻辑编排”、“逻辑流引擎”…

kafka的leader和follower

leader和follower kafka的leader和follower是相对于分区有意义的,不是相对于broker。 因为每个分区都有leader和follower, leader负责读写数据。 follower负责复制leader的数据保存到自己的日志数据中,并在leader挂掉后重新选举出leader。 kafka会再…

Javascript全解(基础篇)

语法与数据类型 语法 var\let\const var 声明一个变量,可选初始化一个值。 let 声明一个块作用域的局部变量,可选初始化一个值。 const 声明一个块作用域的只读常量。 用 var 或 let 语句声明的变量,如果没有赋初始值,则其值为 …

基于VS2022编译GDAL

下载GDAL源码;下载GDAL编译需要依赖的必须代码,proj,tiff,geotiff三个源码,proj需要依赖sqlite;使用cmake编译proj,tiff,geotiff;proj有版本号要求;使用cmake…

go语言实战--基于Vue3+gin框架的实战Cetide网项目(讲解开发过程中的各种踩坑)

最近被要求学习go语言开发,也就做一个项目实战巩固一下,也分享一下关于gin框架的实战项目 (后续应该还是会继续学习Java,这一期还是做一个govue的) 经过一段时间的开发过后,感觉现在的开发效率要快不少了&…

Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)

上期链接:Unity2D游戏制作入门 | 11(之人物属性及伤害计算)-CSDN博客 上期我们聊到了人物的自身属性和受伤时的计算,我们先给人物和野猪挂上属性和攻击属性的代码,然后通过触发器触发受伤的事件。物体(人物也好敌人也行&#xff…

使用 Scapy 库编写 ICMP 不可达攻击脚本

一、介绍 ICMP不可达攻击是一种利用ICMP(Internet Control Message Protocol)不可达消息来干扰或中断目标系统的网络通信的攻击类型。通过发送伪造的ICMP不可达消息,攻击者可以诱使目标系统认为某些网络路径或主机不可达,从而导致…

vue2中如何使用函数式组件

vue2 中如何使用函数式组件 用 render 定义函数式组件如何处理 props如何在函数式组件中触发自定义事件?injection如何使用 computed 和 methods定义一个函数式组件的 MyButton函数式组件有何优势哪种场景适合使用函数式组件函数式组件的问题参考 函数式组件&#x…

WPS JSA 宏脚本入门和样例

1入门 WPS window版本才支持JSA宏的功能。 可以自动化的操作文档中的一些内容。 参考文档: WPS API 参考文档:https://open.wps.cn/previous/docs/client/wpsLoad 微软的Word API文档:Microsoft.Office.Interop.Word 命名空间 | Microsoft …

测试工具链

缺陷管理 bug管理工具 devops---项目管理--缺陷管理 bug管理地址 https://devsecops.mychery.com:8443/chery/project?filterROLE&statusACTIVE bug管理环境 采用公司的devops平台,对每个项目的bug进行管理。目前在使用 接口测试和服务端性能测试 工具…

基础乐理入门

基础概念 乐音:音高(频率)固定,振动规则的音。钢琴等乐器发出的是乐音,听起来悦耳、柔和。噪音:振动不规则,音高也不明显的音。风声、雨声、机器轰鸣声是噪音,大多数打击乐器&#…

【CS.SE】使用 docker pull confluentinc/cp-kafka 的全面指南

文章目录 1 引言2 准备工作2.1 安装 Docker2.1.1 在 Linux 上安装 Docker2.1.2 在 macOS 上安装 Docker2.1.3 在 Windows 上安装 Docker 2.2 验证 Docker 安装 3 拉取 confluentinc/cp-kafka Docker 镜像3.1 拉取镜像3.2 验证镜像 4 运行 Kafka 容器4.1 启动 ZooKeeper4.2 启动…

Nextjs学习教程

一.手动创建项目 建议看这个中文网站文档,这个里面的案例配置都是手动的,也可以往下看我这个博客一步步操作 1.在目录下执行下面命令,初始化package.json文件 npm init -y2.安装react相关包以及next包 yarn add next react react-dom // 或者 npm install --save next react…

2024最新 Jenkins + Docker实战教程(八)- Jenkins实现集群并发构建

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

转型AI产品经理(4):“认知负荷”如何应用在Chatbot产品

认知负荷理论主要探讨在学习过程中,人脑处理信息的有限容量以及如何优化信息的呈现方式以促进学习。认知负荷定律认为,学习者的工作记忆容量是有限的,而不同类型的认知任务会对工作记忆产生不同程度的负荷,从而影响学习效果。以下…

Java面试八股之什么是自动装箱和自动拆箱

什么是自动装箱和自动拆箱 在Java中,自动装箱(Autoboxing)和自动拆箱(Auto-unboxing)是两个与基本数据类型和它们对应的包装类之间的转换相关的特性。这两个概念自Java 5(也称为Java SE 5或JDK 5&#xff…

SpringBoot3整合Mybatis-Plus3.5.5出现的问题

主要是由于 mybatis-plus 中 mybatis 的整合包版本不够导致的 排除 mybatis-plus 中自带的 mybatis 整合包,单独引入即可 java.lang.IllegalArgumentException: Invalid value type for attribute factoryBeanObjectType: java.lang.Stringat org.springframework.…

Linux安装Qt5.14.2

下载 qt 5.14.2下载网址 下载qt-opensource-linux-x64-5.14.2.run Linux系统下载.run文件(runfile文件),windows系统下载.exe文件,mac系统下载.dmg文件。 md5sums.txt中是各个文件对应的MD5校验码。 验证MD5校验码 md5sum是li…

例54:Draw使用

建立一个控制台工程,输入代码: Screen 13 移动到(50,50)而不绘图 Draw "BM 50,50" B:移动但不绘制,M:移动到指定位置 将绘图颜色设置为2(绿色) Draw "C2" C将颜色改为n …