WEB应用之http协议和httpd闲聊

  什么是web?在平常生活中咱们经常听到web这个词,它究竟是什么呢?今天咱们来聊一聊web应用http协议;相信生活在现在互联网时代的咱们,http这个协议应该对咱们不是很陌生吧!好比双十一双十二咱们去某宝、某东去抢购商品,它背后就是用一堆web服务器经过http协议或https协议在给咱们提供服务;简单点说web服务就是一个C/S架构,服务端提供服务,客户端经过http协议或https协议进行访问,拿到服务端对应的资源,这就是web服务;所谓C/S架构就是客户端和服务端架构;对于服务端一侧在iso七层网络模型中应用层协议存在的意义是实现某一具体应用,一般状况下他们都会向内核空间注册一众所周知的服务端口,并监听在某一地址,或多个地址上,对外提供服务;这也一般是C/S架构的软件服务工做的特色;而http协议就是工做在应用层的80端口对外提供服务;对于客户端一侧就没有监听这一说了,一般状况下客户端也是工做在应用层或者咱们能够这样理解,它实际不是工做在应用层;咱们知道网络资源对于计算机来讲只有内核的特权指令才可以操做,而对于普通用户来讲,内核的功能咱们必须在用户空间提供一应用程序,经过应用程序对内核提供的API进行系统调用,从而实现操做网络资源的能力;实现客户端的软件有不少,图形界面下常见的浏览器chrome呀,firefox呀,ie等等,这些程序都是web服务的客户端,固然除此以外,像在Linux字符界面的web客户端有,wget、curl、elinks等等;这些客户端在用户空间访问服务端时,会随机向内核注册一端口,而后把本身的请求信息经过封装应用层首部,传输层,网络层,数据链路层,物理层,最后经过网卡发送给服务端,服务端收到客户端的请求会对客户端封装的报文,层层拆除,从而拿到客户端的请求,拿到客户端的请求后,而后封装响应报文,封装响应报文的过程相似客户端封装请求报文,先封装应用层首部,而后传输层,网络层,数据链路层,物理层,而后发送给客户端;客户端拿到报文后,层层拆封装,最终拿到服务端的响应;这就是http协议的一次事务过程,无外乎就是客户端请求,服务端响应;php

  提示:以上是以太网的封装报文和解封装报文的一个过程,http协议是应用层协议,一般状况下应用层就是上面三层;应用层是工做在用户空间的,而下面四层是工做在内核空间,一般咱们把下面四层称为通讯子网层;这也是咱们以前的iptables里面常常提到的内核空间功能必需要由用户空间程序对内核发起系统调用才可以操做内核空间功能,因此像iptables、ipvsadm这类工具咱们不称他们叫服务,而是工具的缘由;同理像web客户端咱们一般也只是叫它是工具,而不叫服务;一般所谓服务就是须要向内核注册一端口,而后监听在某一地址上,咱们把这种工做在用户空间(或者内核空间的功能)的程序叫服务,简单点讲服务须要被监听,之因此要被监听是由于通讯的须要;css

  IPC(Inter-Process Communication,进程间通讯),所谓进程间通讯就是两个进程互相交换数据;进程间通讯的方式有不少,好比内存共享、内存映射、BSD socket等等;其中最为常见的一种BSD socket,它容许位于不一样主机(固然同一主机也是能够的,只不过同一主机用这种socket机制显得不那么高效)上的进程之间进行通讯;什么叫socket?相信懂点网络编程的人都听过这个词吧! 所谓socket就是IP加端口,对于套接字能够分TCP套接字、udp套接字、raw套接字,它们一般状况下是经过socket API(封装了内核中的socket通讯相关的系统调用)来建立不一样的套接字类型;如SOCK_STREAM就是表示TCP套接字,SOCK_DGRAM就表示UDP套接字,SOCK_RAW就表示raw套接字;根据套接字所使用的地址格式,咱们又能够分为IPV4的套接字、ipv6套接字和unix_sock(同一主机上的不一样进程间基于socket套接字通讯使用的一种地址);例如AF_INET就表示ipv4格式的套接字,AF_INET6就表示ipv6套接字格式,AF_UNIX就表示unix_sock套接字格式;其中前二者用于网络通讯,一般是位于不一样主机间进程通讯,然后者unix_sock用于同一主机的两个进程通讯较为常见;后者就是咱们常见的sock文件,例如mysql客户端链接本地服务端就是用的这种机制;html

  了解上面的底层通讯原理,咱们再来聊聊今天的主题http吧mysql

  http是hyper text transfer protocol的简写,它是应用层协议,默认工做在tcp协议的80端口,属于文本协议;在http协议0.9版本中,它就只能用于传输html文本,也是在互联网上使用的最原始的版本,功能至关简陋;1.0版本引进了cache机制,MIME机制和更多的method,使得http协议一会儿被普遍使用,MIME是多用途互联网邮件扩展类型,它的主要做用是让一些非文本格式的附件可以经过互联网互相传输,而且在接收方接收后可以将其还原成原有格式的附件的机制,什么意思呢?它可以让一些非文本格式的附件在经过互联网传输后还原成原来格式的附件的一种机制;这使得http协议能够传输非文本格式的数据,好比图片、视频、音乐等;所谓method就是客户端请求服务端资源时数据传输请求的方法,在0.9版本http协议只支持GET这一种方法,在1.0版本中http协议支持了更多的请求方法,如GET、PUT、POST、DELETE、HEAD等等;在这以后有1.1版本,它主要是在1.0版本上加强了缓存功能;随后就是2.0,2.0主要是在1.1版本上作了不少优化,使得原有1.1本版的诸多性能问题得以解决,如今主流使用的http协议版本是1.1和2.0版本;nginx

  http工做模式web

  http的工做模式很是简单,在上面咱们也提到过,不外乎就是客户端请求,服务端响应;其中咱们把请求报文叫作http request响应报文叫作http response;对于客户端的一次请求和服务端的一次响应响应咱们把这一过程叫作http协议的一次事务;sql

  web资源:web resourcechrome

  web资源分静态资源和动态资源,所谓静态资源就是无需服务端作额外的处理的资源,咱们叫静态资源,什么意思呢?客户端请求的资源,在服务端是什么样经过http协议传输后到客户端上就是什么样,咱们就把这种不须要服务端额外处理的资源叫静态资源,常见的静态资源有.jpg, .png, .gif, .html, txt, .js, .css, .mp3, .avi等;所谓动态资源就与之相反,客户端请求的资源一般是须要被程序执行或处理后,而后把执行结果或处理后的结果发送给客户端,咱们把这种须要服务端经过某一执行程序做出处理的资源叫动态资源;常见的有.php.jsp.asp等;这里还须要注意一点的是,咱们日常看到的网页资源每每不是单独的一个资源,它多是有不少资源组成,有动态的,也有静态的,每一个资源都须要单独请求,以下所示;apache

  提示:能够看到咱们访问一个页面的背后实际上是有不少资源组成;编程

  资源的标识机制:URL

  所谓资源标识符就是用于描述服务器某特定资源的位置;简单点就是用于告诉服务端客户端要访问的资源;一般状况下URL由协议加“://”加服务器地址(能够是域名,或主机名)[:port](若服务端工做在非标准端口,咱们还须要指定端口)而后加资源路径或资源名称(这里的资源路径指的是web服务的根路径开始,而非文件系统的根路径)例如http://www.test.com/index.html这就是一个URL,客户端介入这样一个URL对应的服务端就知道客户端请求的资源是www.test.com这台主机上的index.html文件,服务端就会把对应目录下的文件响应给客户端;对于服务端它怎么去本身的文件系统上找index.html这个文件,一般状况下是经过咱们对服务端定义的documentroot来决定的,在nginx中咱们能够经过root指令来指定虚拟主机的根目录对应文件系统路径的映射;

  一次完整的http请求处理过程一般是有如下几步来完成:

  (1) 创建或处理链接:接收请求或拒绝请求;
  (2) 接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程;

  http的响应模型,http的响应模型主要有单进程I/O模型、多进程、复用I/O模型和服用多进程模型,其中单进程I/O模型就是启动一个进程处理用户的请求,这意味着,一次只能处理一个请求,多个请求被串行响应;多进程I/O模型表示由父进程并行启动多个子进程,每一个子进程进行相应一个用户请求;复用单进程I/O模型有两个模式,多线程模式和事件驱动模式,前者表示一个进程生成N个线程,一个线程处理一个请求;而事件驱动模式中一个进程直接处理N个请求,没有线程的说法;复用多进程I/O模型中,启动多个进程,每一个进程生成n个线程,每一个线程处理一个请求,响应的请求数量是进程数量乘每一个进程生成的线程数;
  (3) 处理请求:服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理

    元数据:请求报文首部
    <method> <URL> <VERSION>
    HEADERS 格式 name:value
    <request body>

      ……

    示例:

  (4) 访问资源:获取请求报文中请求的资源;服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源;资源放置于本地文件系统特定的路径:DocRoot

    示例:若是咱们将web资源根目录映射成文件系统上的/var/www/html,即www.test.com/   ---->>  /var/www/html,用户访问www.test.com/index.html,就至关于访问文件系统上的/var/www/html/index.html,一般状况下web服务器资源路径映射方式有4种,第一种是经过定义docroot来指定,第二种是alias别名来指定,第三种是虚拟主机的docroot第四种是用户家目录的docroot

  (5) 构建响应报文:一旦Web服务器识别除了资源,就执行请求方法中描述的动做,并返回响应报文。响应报文中 包含有响应状态码、响应首部,若是生成了响应主体的话,还包括响应主体;

    响应实体:若是事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中一般包括:描述了响应主体MIME类型的Content-Type首部,描述了响应主体长度的Content-LengthContent-Type首部和实际报文的主体内容

    示例:

  (6) 发送响应报文:Web服务器经过链接发送数据时也会面临与接收数据同样的问题。服务器可能有不少条到各个客户端的链接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录链接的状态,还要特别注意对持久链接的处理。对非持久链接而言,服务器应该在发送了整条报文以后,关闭本身这一端的链接。对持久链接来讲,链接可能仍保持打开状态,在这种状况下,服务器要正确地计算Content-Length首部,否则客户端就没法知道响应何时结束了;
  (7) 记录日志:最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务;

   HTTP服务器应用

  http服务器程序有httpd、nginx、lighttpd等nginx相关使用和说明可参考本人前面的博客https://www.cnblogs.com/qiuhom-1874/category/1646010.html;接下来咱们着重来讲说httpd;

  httpd是20世纪90年代初,国家超级计算机应用中心NCSA开发,1995年开源社区发布apache(a patchy server)它是一款高度模块化,支持动态加卸载模块,支持多路处理模块,所谓多路处理模块就是httpd的三种响应模型;

  第一种是prefork多进程模型,每一个进程响应一个请求,一个主进程,主进程程负责生成子进程以及回收子进程、套接字的建立和接收请求并将其派发给某个子进程处理;n个子进程(一个子进程中生成一个线程处理一个请求),子进程主要用于处理请求;工做模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;

  第二种是worker多进程多线程模型,在这种模型中每一个线程处理一个用户请求;一样的它也会由一个主进程负责生成子进程,套接字的建立和接收请求并将请求派发给某个子进程进行处理;n个子进程,和上面的profork不一样的是,这里的子进程主要负责生成多个线程,而每一个线程处理一个请求;这样一来在这种模型中并发响应数量就是n个子进程乘每一个子进程生成的M个线程;

  第三种是event:事件驱动模型,多进程模型,一个主进程生成m个子进程,每一个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又容许释放。这样加强了高并发场景下的请求处理能力

以上就是httpd的一些简单介绍,在后续的文章中我会持续更新httpd的其余用法和配置指令的说明,有感兴趣的朋友能够关注关注,共同探讨;

相关文章
相关标签/搜索