HTTP协议的几个概念以及HTTPD服务器简单介绍
程序员文章站
2024-02-21 16:00:40
...
- 几个概念
-
HyperText Transfer Protocol
:超文本传输协议,带有超级连接的文本,用于实现在文档间跳转的,一开始也仅仅支持纯文本文档; -
http/0.9
协议:出现最初仅仅支持纯文本,也就是纯ASCII
; -
HTML(TyperText Mark Language)
:表示的是用于编写超文本的语言,用于将字体解释为字符的显示属性,例如大小等,在通过浏览器进行浏览时,不会将修饰字符显示出现,而是将修饰后的结果显示出来; -
URI(Uniform Resource Indentifier)
:用于防止超文本文档出重明的情况出现; -
URL(Uniform Resource Locator)
:是URI的子集,用于描述互联网资源的统一表示格式; - 两个概念
- 1.
web资源
:例如http://www.linux.com/logo.gif
就是一个web资源
,多个资源会被整合为一个html文档; - 2.
Web对象
:就是html
文档就是将分散在多台Web
服务器上面的资源整合成一个页面,并进行显示的;
- 1.
-
HTTP支持的资源访问方法
- 1.
GET
:用于获取资源到本地; - 2.
POST
:通过表单提交数据到远程服务器; - 3.
PUT
用于上传文件; - 4.
DELETE
:用于删除远程浏览器的文件;
- 1.
- 在
HTTP/1.0
之后引入MIME(Multipurpose Interent Main EXtension)
,表示多用途互联网邮件扩展,最早是应用于邮件的SMTP(Simple Mail Transmission Protocol)
协议,为了解决邮件只能够简单的传输纯文本文档; -
MIME
实现的功能:将非文本数据文件在传输前重新编码为文本格式在进行传输,接收方能够使用相反的方式还原为原来的格式,还能够使用对应的应用程序打开这种文件; HTTP
协议使用MIME
进行扩展之后,网页浏览更加丰富动态网页
- 简单的理解类似于网页是动起来的,但是这样理解是不对的,动态网页表示的是使用
Java,Applet,JRE
等编程语言开发的脚本,在server
上面执行一次后,将生成的结果生成HTML
文档,并且返回给Client
,也就是说动态网页在服务器上面存储的需要执行的脚本,并且每执行一次,就会生成HTML
,发送给Client
,在脚本的执行过程中,Web
服务器需要根据不同类型的脚本调用不同类型的应用程序来执行脚本,脚本的执行并不是Web
服务器负责的; - HTTP协议
-
HTTP
请求报文语法格式
<method><request-RUL><version>
<headers> //http协议的首部
<entity-body> 报文主体
-
http
协议首部类似
GET: /2.html
Host:www.linux.com
-
http
响应报文格式
<version><status(状态码)><reason-phrase(用于解释状态的意义)>
<headers(内容的格式)>
<entity-body>
- 请求报文的示例
GET / HTTP/1.1
Host:www.linux.com
Connection:keep-alive
- 响应报文的示例
HTTP/1.1 200 OK
X-powered_By:PHP/5.2.17
Vary:Accept-Encoding,Cookie,User-Agent
Cache-Control:max-age=3,must-revalidate
Content-Encoding:gzip
Content-Length:6931
-
HTTP
常见的状态码- 1.
1xx
: 表示纯粹的信息,很少使用; - 2.
2xx
:成功类状态码;-
200
:请求资源正常;
-
- 3.
3xx
:表示重定向类的信息-
301
表示永久重定向; -
302
:临时重定向; -
304
:没有发生任何改变,可以使用缓存;
-
- 4.
4xx
:客户端错误类状态码-
403
:服务器端设置,资源访问被拒绝; -
404
请求不存在的资源文件;
-
- 5.
5xx
服务器错误的信息,由于服务器故障导致无法响应;
- 1.
- 对于报文的第一行通常称为起始行,后面的标签格式的内容称为首部域
(Header Filed)
,每个首部域都由名称(name)
和值value
组成,中间是用逗号分隔,另外,相应报文通常还包括Body
的主体,既相应给Client
的内容; -
Web
服务器需要完成的操作- 1.建立连接—->接收或者拒绝
client
的连接请求; - 2.接收请求—->通过网络读取
HTTP
请求相应报文; - 3.处理请求—->解析请求报文,并且做出相应的动作;
- 4.访问资源—->访问请求报文中相应的资源;
- 5.构建响应—->使用正确的首部生成
HTTP
信息; - 6.发送响应—->向客户端发送生成的相应报文;
- 7.记录日志—->当已经完成的
HTTP
事物记录进日志文件;
- 1.建立连接—->接收或者拒绝
-
HTTP / 1.1
支持的特性包括:加强缓存管理;并且支持长连接功能; - 因为一次报文请求通常伴随着
DNS
解析,网络延迟,TCP/IP
的三次握手以及四次断开,然后Server
将数据进行返回,用户的请求十分频繁时,上述的过程就会进行重复;引入长连接,在用户第一次获得资源之后,连接并不进行断开,而是使用较小的资源来维护用户已经建立的连接,但是缺点是维护大量用户的这种连接请求,也会导致资源的大量开销,也就是在并发量较小时,较少用户访问的请求时间,并发量较大时,新用户的请求就需要等待; - 长连接引入了超时时间,来强制超过时间的请求强制断开,释放资源提供给后面的用户,当然也可以通过定义用户请求资源的最大次数,来强制用户断开连接,释放资源;
- Web服务器响应模型
- 单进程响应模型:最简单的请求响应模型,每次处理一个用户的访问请求,处理完成之后在处理后面的用户请求;
- 优点:
- 实现简单;
- 缺点:
- 单进程崩溃,会导致服务整个不可用
- 优点:
- 多进程/多线程工作机制:使用其中的一个进程/线程来分发用户的请求,然后将用户的请求转交给后面的生成的子进程或者是线程来处理,也就是类似于调度器;
- 优点:
- 并发能力较强,响应用户的请求速度快,其中的一个进程崩溃,不会影响到其他的进程;
- 缺点:
- 面对大量的用户请求,并发能力受限;
- 进程的频繁创建和销毁,导致资源的大量重复,因为子进程在完成处理之后,就会被内核销毁,需要的时,又会被创建;
- 优点:
- 服务器同时接入一定量的请求,不给任何一个
client
占用过多的时间,而是接收请求,并且进行转交,对于处理请求的是否完成的判断包含两种方式,一种是进行轮询查询的,但是效率低下,所以引入的是事件驱动机制的方式,也就是每个处理进程一个状态值,用于查看状态值,来确定某个特定的事件是否发生,基于事件的驱动方式也包括两种:- 1.轮询进行状态值的检查;
- 2.基于通知机制,在特定的状态发生改变时,主动进行通知;
- 关于通知的方式一般来说也包括两种:
- 水平触发:只通知一次;
- 边沿触发:按照一定的时间间隔进行通知;
- 通过基于事件的驱动方式以及结合通知机制的改进,服务器处理用户请求数量大幅度增加,对于资源的开销下降,对于维护空闲连接的资源开销也下降;
- 最后一种处理模型:是结合第二种处理模型以及第三种处理模型,首先创建的一个或者是多个进程
(A)
,A
创建并且管理进程B
,A
进程用于将用户的请求分发给大量的B
进程,B
进程结合事件驱动以及通知机制来管理用户的请求,但是不实际处理用户的请求,在请求被之后的进程处理完成之后,来进程进程的响应;
,* 对于HTTTP
协议来说通常是C/S
结构:-
Client
:browser, spider
,常见的包括IE
,firefox
,chrome
,Opera
,Safari
; -
server
:Apache
,nginx
,lighttpd
,thtppd
等;
-
- 对于动态内容的处理是使用应用程序服务器来进行处理的,常见的应用程序服务器包括
IIS
,tomcat
,Websphere(IBM,JSP(JAVA))
:用于解析JAVA企业级服务,Weblogic(Oracle)
,JBoss(RedHat)
:核心是Tomcat,都可以提供Wbe服务; -
HTTPD
支持的特性:-
HTTPD
实现创建进程,避免用户请求到达后创建进程的时间开销; -
HTTPD
按需创建维护适当的空闲进程,销毁不需要多于的进程; -
HTTPD
是模块化设计,各种模块支持运行时添加,支持运行时配置,支持单独编译模块; -
HTTPD
:支持虚拟主机配置,一台物理服务器,运行了一个Web服务程序,但是可以服务多个站点; - 常见的虚拟主机包括三种:
- 基于
IP
的虚拟主机; - 基于端口的虚拟主机;
- 基于域名的虚拟主机;
- 基于
- 支持HTTPs协议
(mod_ssl)
协议; - 支持用户认证,简单认证,表单认证;
- 支持基于IP或者主机名的ACL;
- 支持每个目录的访问控制,也就是对于某个目录的访问需要提供认证;
- 支持URL重写: 服务器上面修改某URL,客户端是透明的;
-
nginx
:多进程响应用户请求的模型,可以响应更多的用户请求,稳定性和功能的丰富性不及HTTPD
,Nginx
多用于进行反向代理;-
HTTPD
的MPM
:-
prefork
:预先生成进程,一个请求用一个进程相应; -
work
:基于线程来工作的,一个请求使用一个线程相应;- 1.首先生成多个工作进程;
- 2.进程用于生成线程;
- 3.使用线程相应用于请求;
-
Event
:表示基于事件的驱动的,一个进程处理多个请求;
-
-
HTTPD
工作情况- 属主和属组均为
root
的进程是master process
,用于创建空闲进程,接收并且分发用户请求; - 属主和属组为
apache
的进程是apache work process
; - 工作的根目录在
/etc/httpd/
; - 主配置文件:
/etc/httpd/conf/httpd.conf
; - 模块链接目录:
/etc/httpd/modules
; - 日志文件目录:
/etc/httpd/logs ----> /var/log/messages
,日志文件一般包括两种:访问日志access_log
,错误日志:err_log
; - 页面文件目录
/var/www/
:-
html
:用于静态文件; -
cgi-bin
:用于处理动态文件;
-
-
/etc/httpd/conf/magic
:用于定义如何识别本地主机接收的MIME编码的文件; -
/etc/httpd/conf.d/ welcome.conf
:欢迎页面;
- 属主和属组均为
-
CGI(Common Gateway Interface)
:-
HTTPD
服务器并不负责处理动态内容,也就是不负责动态脚本的执行等工作,CGI
是用于Web
服务器和其他的应用程序服务器通信的一种机制,使Web
服务器启动某个特殊的进程来处理动态的网页请求的一种机制,用户的访问请求类似于Client ------> httpd (index.cgi) ---> Spawn Process (index.cgi)---->httpd----->Client
;
-
-
fastcgi
:-
Web
服务器和应用程序服务器分离,用于加快Web
访问速度,用于实现动静分离; -
FASTCGI
的工作通常不是用户请求到达时,创建进程向应用程序服务器发起解释请求,而是在用户到达之前就创建一定数量的进程来等待动态用户请求,并且维护一定数量的进程,避免进程的频繁创建和销毁,并且动态进程的创建和销毁不再由Web
服务器进行管理,而是交给专门的进程进程管理,通过配置应用程序服务器工作在不同的套接字,可以实现将应用程序服务器和Web
服务进行分离;
-