Httpd服务进阶知识-HTTP协议详解

                                                作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.WEB开发概述

1>.C/S编程

  1.   CS即客户端、服务器编程。
  2.  
  3.   客户端、服务端之间需要使用Socket,约定协议、版本(往往使用的协议是TCP或者UDP),指定地址和端口,就可以通信了。

  4.   客户端、服务端传输数据,数据可以有一定的格式,双方必须先约定好。

2>.B/S编程

  1.   BS编程,即BrowserServer开发。
  2.  
  3.   Browser浏览器,一种特殊的客户端,支持HTTP(s)等协议,能够通过URL向服务端发起请求,等待服务端返回HTML等数据,并在浏览器内可视化展示的程序。
  4.  
  5.   Server,支持HTTP(s)协议,能够接受众多客户端发起的HTTP协议请求,经过处理,将HTML等数据返回给浏览器。
  6.  
  7.   本质上来说,BS是一种特殊的CS,即客户端必须是一种支持HTTP协议且能解析并渲染HTML的软件, 服务端必须是能够接收多客户端HTTP访问的服务器软件。

  8.   HTTP协议底层基于TCP协议实现。

  9.   BS开发分为两端开发(前后端分离):
        客户端开发,或称前端开发。HTMLCSSJavaScript
  10.     服务端开发,PythonWSGIDjangoFlaskTornado

二.HTTP协议概述

1>.http协议和版本介绍

  1.   基于TCP:
  2.     http/0.9
  3.       1991,原型版本,功能简陋,只有一个命令GETGET /index.html ,服务器只能回应HTML格式字符串,不能回应别的格式
  4.  
  5.     http/1.0
  6.       19965月,支持cache, MIME, method
  7.       每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接
  8.       引入了POST命令和HEAD命令
  9.       头信息是ASCII码,后面数据可为任何格式。服务器回应时会告诉客户端,数据是什么格式,即Content-Type字段的作用。这些数据类型总称为MIME多用途互联网邮件扩展,每个值包括一级类型和二级类型,预定义的类型,也可自定义类型, 常见Content-Type值:"text/xml","image/jpeg","audio/mp3"
  10.  
  11.     http/1.1
  12.       19971月发布。
  13.       引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。对于同一个域名,大多数浏览器允许同时建立6个持久连接
  14.       引入了管道机制(pipelining),即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率
  15.       新增方法:PUTPATCHOPTIONSDELETE
  16.       同一个TCP连接里,所有的数据通信是按次序进行的。服务器只能顺序处理回应,前面的回应慢,会有许多请求排队,造成"队头堵塞"Head-of-line blocking
  17.       为避免上述问题,两种方法:一是减少请求数,二是同时多开持久连接。网页优化技巧,如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等
  18.       HTTP 协议不带有状态,每次请求都必须附上所有信息。请求的很多字段都是重复的,浪费带宽,影响速度
  19.  
  20.     Spdy
  21.       2009年,谷歌研发,解决 HTTP/1.1 效率不高问题。
  22.  
  23.     http/2.0
  24.     2015年发布。
  25.     头信息和数据体都是二进制,称为头信息帧和数据帧
  26.     复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了"队头堵塞",此双向的实时通信称为多工(Multiplexing
  27.     引入头信息压缩机制(header compression),头信息使用gzipcompress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
  28.     HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push
  29.  
  30.   基于UDP:
  31.     http/3.0
  32.     博主推荐阅读:https://zhuanlan.zhihu.com/p/32553477
  33.  
  34.   W3Techs统计,截止到2019122日,HTTP / 3被所有网站的2%和前1000个网站的7%使用。如下图所示,从趋势上来看离咱们的生产环境使用还很远。链接地址:https://w3techs.com/technologies/overview/site_element

2>.http协议的无状态,有连接和短连接 

  1.   无状态:
        指的是服务器无法知道2次请求之间的联系,即使是前后2次同一个浏览器也没有任何数据能够判断出是同一个浏览器的请求。后来可以通过cookie(客户端存放)、session(服务端存放)来判断。
  2.   有连接:
        是因为它基于TCP协议,是面向连接的,需要3次握手、4次断开。
  3.   短连接:
        Http 1.1之前,都是一个请求一个连接,而Tcp的连接创建销毁成本高,对服务器有很大的影 响。所以,自Http 1.1开始,支持keep-alive,默认也开启,一个连接打开后,会保持一段时间(可设 置),浏览器再访问该服务器就使用这个Tcp连接,减轻了服务器压力,提高了效率。

3>.URI(Uniform Resource Identifier) 统一资源标识,分为URL和URN

  1. URN(Uniform Resource Naming,统一资源命名)
  2. 示例:
  3. douluodalu:?xt=urn:btih:660557A6890EF888666(P2P下载使用的磁力链接是URN的一种实现,如迅雷下载)
  4.         
  5.   URL(Uniform Resorce Locator,统一资源定位符,用于描述某服务器某特定资源位置)
  6.     格式:
  7.       <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
  8.     相关参数解释:
  9.    scheme:
  10.      方案,模式,协议,说白了就是访问服务器以获取资源时要使用哪种协议,如:http,ftp,https,file,mailto,rtsp等等。 
  11.   示例:
  12. rtsp://videoserver/video_demo/
  13.    rtsp:Real Time Streaming Protocol。该协议是流媒体协议,多用于视频播放,感兴趣的小伙伴可以自己搭建一个流媒体服务器来做一个家庭影院。
  14.    user:     
  15. 用户,某些方案访问资源时需要的用户名   
  16. password:     
  17. 密码,用户对应的密码,中间用:分隔   
  18. host:     
  19. 主机,资源宿主服务器的主机名或IP地址   
  20. port:     
  21. 端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号   
  22. path:     
  23. 路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔   
  24. params:     
  25. 参数,指定输入的参数,参数为名/值对,多个参数,用;分隔   
  26. query:     
  27. 查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔   
  28. frag:     
  29. 片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔 URL示例:   http://apache.org/index.html#projects-list   
  30.  
  31. 两者区别:     
  32. URN如同一个人的名称,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。URN仅用于命名,而不指定地址

4>.http事物

  1. http事务:
      一次访问的过程,分为RequestResponse
  2.   
    请求(request):
  3.   浏览器向服务器发起的请求
  4.  
  5. 响应(response) :
  6.   服务器对客户端请求的响应

  7. 需要注意的是:
      请求报文由Header消息报头、Body消息正文组成(可选),请求报文第一行称为请求行
  8.   响应报文由Header消息报头、Body消息正文组成(可选),响应报头第一行称为状态行
  9.   每一行使用回车和换行符作为结尾
  10.   如果有Body部分,HeaderBody之间留一行空行用以区分两者消息

5>.http常用的方法(method)

  1.   GET
        从服务器获取一个资源
  2.   HEAD
        只从服务器获取文档的响应首部
  3.   POST
        向服务器输入数据,通常会再由网关程序继续处理
  4.   PUT
        将请求的主体部分存储在服务器中,如上传文件
  5.   DELETE
        请求删除服务器上指定的文档
  6.   TRACE
        追踪请求到达服务器中间经过的代理服务器
  7.   OPTIONS
        请求服务器返回对指定资源支持使用的请求方法
      扩展方法:
        LOCKMKCOLCOPYMOVE等;

6>.协议查看或分析的工具

  1.   tcpdump, wireshark,tshark

三.HTTP请求报文

  1. 请求报文语法格式如下所示:(和下图相对应)
  2. <method> <request-URL> <version>
  3. <headers>
  4.  
  5. <entity-body>
  6.  
  7. 以上参数说明:
      method:
  8.     请求方法,标明客户端希望服务器对资源执行的动作GETHEADPOST
      request-URL:
        请求的PATH路径
      version:
        HTTP协议的版本号,HTTP/<major>.<minor>,如"HTTP/1.1"
      headers:
        每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟一个可选空格,接着是一个值。
      entity-body:
        请求时附加的数据,通常GET方法不用实体主体,一般使用POST方法时可能会用到该部分来向服务端提交参数。

四.HTTP响应报文

  1. 响应报文如下所示:(和下图相对应)
  2. <version> <status> <reason-phrase>
  3. <headers>
  4.  
  5. <entity-body>
  6.  
  7. 以上参数说明:
  8.   version:
  9.     HTTP协议的版本号,HTTP/<major>.<minor>,如"HTTP/1.1"
  10.   status:
  11.     通常是三位数字,如200301, 302, 404, 502; 标记请求处理过程中发生的情况。
  12.   headers:
  13.     每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟一个可选空格,接着是一个值。
  14.   reason-phrase
  15.     原因短语,即状态码所标记的状态的简要描述
  16.   entity-body:
  17.     响应时附加的数据,比如响应一个页面内容。

五.HTTP 首部信息

1>.HTTP协议首部(headers)字段

  1.   HTTP首部字段包含的信息最为丰富。首部字段同时存在于请求和响应报文内,并涵盖HTTP报文相关的内容信息。使用首部字段是为了给客服端和服务器端提供报文主体大小、所使用的语言、认证信息等内容
  2.  
  3.   首部字段结构HTTP首部字段是由首部字段名和字段值构成的,中间用冒号(":")分隔
  4.  
  5.   字段值对应单个HTTP首部字段可以有多个值
  6.  
  7.   报文首部中出现了两个或以上具有相同首部字段名的首部字段时,在规范内尚未明确,根据浏览器内部处理逻辑的不同,优先处理的顺序可能不同,结果可能并不一致

2>. HTTP协议首部(headers)的分类

  1. 通用首部:
  2.   请求报文和响应报文两方都会使用的首部。
  3.   常见的通用首部如下所示:
  4.     Date:
  5.       报文的创建时间
  6.     Connection:
  7.       连接状态,如keep-alive, close
  8.     Via:
  9.       显示报文经过的中间节点(代理,网关)
  10.     Cache-Control:
  11.       控制缓存,如缓存时长
  12.     MIME-Version:
  13.       发送端使用的MIME版本
  14.     Warning:
  15.       错误通知
  16.  
  17. 请求首部:
  18.   从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、请求内容相关优先级等信息。
  19.   常用的客户端专用请求首部如下所示:
  20.     Client-IP:
  21.       请求的客户端IP
  22.     Host:
  23.       请求的服务器名称和端口号
  24.     Referer:
  25.       跳转至当前URI的前一个URL
  26.     User-Agent:
  27.       客户端代理,浏览器版本
  28.  
  29. Accept请求首部:
  30.   用户标明客户自己更倾向于支持使用的方式。
  31.   常用的Accept首部如下所示:
  32.     Accept
  33.       指明服务器能发送的媒体类型
  34.     Accept-Charset:
  35.       支持使用的字符集
  36.     Accept-Encoding:
  37.       支持使用的编码方式
  38.     Accept-Langage:
  39.       支持使用语言
  40.  
  41. 条件式请求首部:
  42.   主要应用于缓存机制的判断。
  43.   常见的条件试请求首部如下所示:
  44.     Expect:
  45.       允许客户端列出某请求所要求的服务器行为
  46.     If-Modified-Since:
  47.       自从指定的时间之后,请求的资源是否发生过修改
  48.     If-Unmodified-Since:
  49.       与上面相反
  50.     If-None-Match:
  51.       本地缓存中存储的文档的ETag标签是否与服务器文档的Etag不匹配
  52.     If-Match:
  53.       与上面相反
  54. 安全请求首部:
  55.   跟安全相关的请求首部。
  56.   常见的安全请求首部如下所示:
  57.     Authorization:
  58.       向服务器发送认证信息,如账号和密码
  59.     Cookie:
  60.       客户端向服务器发送cookie
        cookie2:
          cookie的另外一个版本。
  61.  
  62. 代理请求首部:
  63.   Proxy-Authorization:
  64.     向代理服务器认证
  65.  
  66. 响应首部:
  67. 从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
  68. 常见的信息性响应首部如下所示:
  69. Age:
  70. 从最初创建开始,响应持续时长
  71. Server:
  72. 服务器程序软件名称和版本
  73. 协商响应首部:
      某资源有多种表示方法时使用。
      常见的协商响应首部如下所示:
  74.     Accept-Ranges:
  75.       对当前资源来讲,服务器可接受的请求范围类型(比如服务器是否支持压缩和不压缩,有的服务器不支持压缩文件)
  76.     Vary:
  77.       服务器查看的其它首部列表,服务端会根据列表中对内容挑选出最合适对版本发送给客户端。

  78. 安全响应首部:
      跟安全相关对响应首部。
      常见对安全响应首部如下所示:
  79.     Set-Cookie:
  80.       服务端在某个客户端第一次请求时发送令牌,即向客户端设置cookie
        Set-Cookie2:
          Set-Cookie的另外一个版本。
        WWW-Authenticate:
  81.       来自服务器对客户端的质询列表,即要求客户提供账号和密码。
  82.  
  83. 实体首部:
  84.   针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的的信息。
      常见的实体首部如下所示:
  85.     Allow:
  86.       列出对此资源实体可使用的请求方法
  87.     Location:
  88.       告诉客户端真正的实体位于何处,即资源新为止,我们在对网站做重定向对时候就会有该属性哟。
  89.  
  90. 内容首部:
      用于标明内容格式或内容类型等等。
      常见的内容首部如下所示:
        Content-Encoding:
  91.       对主体执行的编码
  92.     Content-Language:
  93.       理解主体时最适合的语言
  94.     Content-Length:
  95.       主体的长度
  96.     Content-Location:
  97.       实体真正所处位置
  98.     Content-Type
  99.       主体的对象类型,如最常见的"text/html"

  100. 缓存首部:
      和缓存相关的首部。
      常见的缓存首部如下所示:
        ETag:
  101.       实体的扩展标签
  102.     Expires:
  103.       实体的过期时间
  104.     Last-Modified:
  105.       最后一次修改的时间
  106.  
  107. 扩展首部:
  108.   即非标准首部,可能是有程序开发者创建的,例如X-Forward-For

六.HTTP协议状态码(status code)分类

1>.状态码分类

  1. 状态码在响应头第一行,状态码被分为五类,如下所示:
  2.   1xx:
        提示信息,用于表示临时响应并需要请求者执行操作才能继续的状态码,如"100-101"
  3.   2xx
        表示响应成功,如"200-206"
      3xx
        表示重定向,如"300=307"
  4.   4xx:
        客户端请求错误,如"400-417"
  5.   5xx:  
        服务器端错误,如"500-505"

2>.常见的状态码

  1.   100(继续):
  2.   请求者应当继续提出请求。服务器返回此代码则意味着,服务器已收到了请求的第一部分,现正在等待接收其余部分。

  3.   101(切换协议)
  4.   请求者已要求服务器切换协议,服务器已确认并准备进行切换。
  5.  
  6.   200 OK  
  7.     成功,请求数据通过响应报文的entity-body部分发送,即正常返回了网页内容
  8.  
  9.   201 Created
  10.     请求已经被实现,依据请求要求,已经创建了新的资源
  11.  
  12.   204 No Content
  13.     服务器端成功处理了,但没什么内容返回
  14.  
  15.   301 Moved Permanently
  16.     请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置。即页面永久性移走,永久重定向。返回新的URL,浏览器会根据返回的url发起新的request请求
  17.  
  18.   302 Temporary Redirect
  19.     响应报文Location指明资源临时新位置,即临时重定向
  20.  
  21. 304 Not Modified
  22.     客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端。即资源未修改,浏览器使用本地缓存

  23.   307 Temporary Redirect
  24.     302很相似,只是客户端保持当前请求方法不变重定向 
      
      400 Bad Request
  25.     请求语法错误

  26.   401 Unauthorized
  27.     请求要求身份验证,如需要输入账号和密码认证方能访问资源。

  28.   403 Forbidden
  29.     服务器拒绝请求 ,即请求被禁止。
  30.  
  31.   404 Not Found
  32.     服务器无法找到客户端请求的资源,即网页找不到,客户端请求的资源有错
  33.  
  34.   500 Internal Server Error
  35.     服务器内部错误,如配置文件中定义规则错误(并非配置文件语法错误)。

  36.   502 Bad Gateway
  37.     代理服务器从后端服务器收到了一条伪响应,如无法连接到网关。即上游服务器错误,例如nginx反向代理的时候。
  38.  
  39.   503 Service Unavailable
  40.     服务不可用,临时服务器维护或过载,服务器无法处理请求
  41.  
  42.   504 Gateway timeout
  43.     网关超时
  44.  
  45.   博主推荐阅读:
  46.     https://baike.baidu.com/item/%E7%8A%B6%E6%80%81%E4%BB%A3%E7%A0%81/9910359?fromtitle=%E7%8A%B6%E6%80%81%E7%A0%81&fromid=16802080&fr=aladdin

七.Cookie

1>.什么是cookie

  1.   Cookie技术概述:
  2.     (1)键值对信息
  3.     (2)是一种客户端、服务器端传递数据的技术
        (3)一般来说cookie信息是在服务器端生成,返回给浏览器端的
        (4)浏览器端可以保持这些值,浏览器对同一域发起每一请求时,都会把Cookie信息发给服务器端
        (5)服务端收到浏览器端发过来的Cookie,处理这些信息,可以用来判断这次请求是否和之前的请求有关联
  4.  
  5.   曾经Cookie唯一在浏览器端存储数据的手段,目前浏览器端存储数据的方案很多,Cookie正在被淘汰。
      
      当服务器收到HTTP请求时,服务器可以在响应头里面添加一个Set-Cookie键值对。浏览器收到响应后 通常会保存这些Cookie,之后对该服务器每一次请求中都通过Cookie请求头部将Cookie信息发送给服务器。
  6.   
      另外,Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。

2>.为啥要使用cookie

  1.   HTTP是一种无状态协议,使用cookie技术来保存浏览器与服务端的连接状态:
        协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。可是随着Web的不断发展,很多业务都需要对通信状态进行保存。于是引入了cookie技术。
  2.  
  3.   使用cookie的状态管理:
        cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入cookie值后发送出去。服务器端发现客户端发送过来的cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

2>.Set-Cookie首部字段

  1. Set-cookie首部字段示例:
  2.   Set-Cookie: status=enable; expires=Fri, 24 Nov 2017 20:30:02 GMT; path=/;
  3.  
  4. NAME=VALUE
  5.   赋予cookie的名称和其值,此为必需项
  6.  
  7. expires=DATE
  8.   设置cookie的有效期,即cookie可以设定过期终止时间,过期后将被浏览器清除。如果缺省,cookie不会持久化,随着浏览器关闭cookie消失,称为会话cookie
  9.  
  10. path=PATH
  11.   将服务器上的文件目录作为cookie的适用对象,若不指定则默认为文档所在的文件目录,即确定哪些目录及子目录访问可以使用该cookie
  12.  
  13. domain=域名
  14.   作为cookie适用对象的域名,若不指定则默认为创建cookie的服务器的域名。域确定有哪些域可以存取这个cookie,缺省设置属性值为当前主机,例如"www.yinzhengjie.org.cn"。如果设置为"yinzhengjie.org.cn"表示包含子域。
  15.  
  16. Secure
  17.   仅在HTTPS安全通信时才会发送cookie,表示cookie随着HTTPS加密过得请求发送给服务端,有些浏览器已经不允许http://协议使用secure了,这个secure不能保证Cookie是安全的,Cookie中不要传输铭感信息。
  18.  
  19. HttpOnly
  20.   加以限制使cookie不能被JavaScript脚本访问 

3>.查看IE浏览器的cookie信息(C:\Users\yinzhengjie\AppData\Local\Microsoft\Windows\INetCache)

4>.查看Google浏览器的cookie信息(chrome://settings/siteData)

5>.通过PHP程序自定义cookie信息案例

  1. [root@node107.yizhengjie.org.cn ~]# yum -y install httpd
  2. Loaded plugins: fastestmirror
  3. Determining fastest mirrors
  4. * base: mirror.jdcloud.com
  5. * extras: mirror.jdcloud.com
  6. * updates: mirrors.aliyun.com
  7. base | 3.6 kB 00:00:00
  8. extras | 2.9 kB 00:00:00
  9. updates | 2.9 kB 00:00:00
  10. (1/4): base/7/x86_64/group_gz | 165 kB 00:00:00
  11. (2/4): extras/7/x86_64/primary_db | 153 kB 00:00:00
  12. (3/4): base/7/x86_64/primary_db | 6.0 MB 00:00:03
  13. (4/4): updates/7/x86_64/primary_db | 5.8 MB 00:00:06
  14. Resolving Dependencies
  15. --> Running transaction check
  16. ---> Package httpd.x86_64 0:2.4.6-90.el7.centos will be installed
  17. --> Processing Dependency: httpd-tools = 2.4.6-90.el7.centos for package: httpd-2.4.6-90.el7.centos.x86_64
  18. --> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-90.el7.centos.x86_64
  19. --> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-90.el7.centos.x86_64
  20. --> Running transaction check
  21. ---> Package apr.x86_64 0:1.4.8-5.el7 will be installed
  22. ---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
  23. ---> Package httpd-tools.x86_64 0:2.4.6-90.el7.centos will be installed
  24. --> Finished Dependency Resolution
  25.  
  26. Dependencies Resolved
  27.  
  28. =============================================================================================================================================
  29. Package Arch Version Repository Size
  30. =============================================================================================================================================
  31. Installing:
  32. httpd x86_64 2.4.6-90.el7.centos base 2.7 M
  33. Installing for dependencies:
  34. apr x86_64 1.4.8-5.el7 base 103 k
  35. apr-util x86_64 1.5.2-6.el7 base 92 k
  36. httpd-tools x86_64 2.4.6-90.el7.centos base 91 k
  37.  
  38. Transaction Summary
  39. =============================================================================================================================================
  40. Install 1 Package (+3 Dependent packages)
  41.  
  42. Total download size: 3.0 M
  43. Installed size: 9.9 M
  44. Downloading packages:
  45. (1/4): httpd-tools-2.4.6-90.el7.centos.x86_64.rpm | 91 kB 00:00:00
  46. (2/4): apr-1.4.8-5.el7.x86_64.rpm | 103 kB 00:00:00
  47. (3/4): apr-util-1.5.2-6.el7.x86_64.rpm | 92 kB 00:00:00
  48. httpd-2.4.6-90.el7.centos.x86_ FAILED ] 1.6 B/s | 668 kB 434:12:11 ETA
  49. http://mirrors.nju.edu.cn/centos/7.7.1908/os/x86_64/Packages/httpd-2.4.6-90.el7.centos.x86_64.rpm: [Errno 12] Timeout on http://mirrors.nju.e
  50. du.cn/centos/7.7.1908/os/x86_64/Packages/httpd-2.4.6-90.el7.centos.x86_64.rpm: (28, 'Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds')Trying other mirror.
  51. (4/4): httpd-2.4.6-90.el7.centos.x86_64.rpm | 2.7 MB 00:00:01
  52. ---------------------------------------------------------------------------------------------------------------------------------------------
  53. Total 66 kB/s | 3.0 MB 00:00:46
  54. Running transaction check
  55. Running transaction test
  56. Transaction test succeeded
  57. Running transaction
  58. Installing : apr-1.4.8-5.el7.x86_64 1/4
  59. Installing : apr-util-1.5.2-6.el7.x86_64 2/4
  60. Installing : httpd-tools-2.4.6-90.el7.centos.x86_64 3/4
  61. Installing : httpd-2.4.6-90.el7.centos.x86_64 4/4
  62. Verifying : apr-1.4.8-5.el7.x86_64 1/4
  63. Verifying : httpd-tools-2.4.6-90.el7.centos.x86_64 2/4
  64. Verifying : apr-util-1.5.2-6.el7.x86_64 3/4
  65. Verifying : httpd-2.4.6-90.el7.centos.x86_64 4/4
  66.  
  67. Installed:
  68. httpd.x86_64 0:2.4.6-90.el7.centos
  69.  
  70. Dependency Installed:
  71. apr.x86_64 0:1.4.8-5.el7 apr-util.x86_64 0:1.5.2-6.el7 httpd-tools.x86_64 0:2.4.6-90.el7.centos
  72.  
  73. Complete!
  74. [root@node107.yizhengjie.org.cn ~]#

[root@node107.yizhengjie.org.cn ~]# yum -y install httpd

  1. [root@node107.yizhengjie.org.cn ~]# yum -y install php
  2. Loaded plugins: fastestmirror
  3. Loading mirror speeds from cached hostfile
  4. * base: mirror.jdcloud.com
  5. * extras: mirror.jdcloud.com
  6. * updates: mirrors.aliyun.com
  7. base | 3.6 kB ::
  8. extras | 2.9 kB ::
  9. updates | 2.9 kB ::
  10. Resolving Dependencies
  11. --> Running transaction check
  12. ---> Package php.x86_64 :5.4.-46.1.el7_7 will be installed
  13. --> Processing Dependency: php-common(x86-) = 5.4.-46.1.el7_7 for package: php-5.4.-46.1.el7_7.x86_64
  14. --> Processing Dependency: php-cli(x86-) = 5.4.-46.1.el7_7 for package: php-5.4.-46.1.el7_7.x86_64
  15. --> Running transaction check
  16. ---> Package php-cli.x86_64 :5.4.-46.1.el7_7 will be installed
  17. ---> Package php-common.x86_64 :5.4.-46.1.el7_7 will be installed
  18. --> Processing Dependency: libzip.so.()(64bit) for package: php-common-5.4.-46.1.el7_7.x86_64
  19. --> Running transaction check
  20. ---> Package libzip.x86_64 :0.10.-.el7 will be installed
  21. --> Finished Dependency Resolution
  22.  
  23. Dependencies Resolved
  24.  
  25. =============================================================================================================================================
  26. Package Arch Version Repository Size
  27. =============================================================================================================================================
  28. Installing:
  29. php x86_64 5.4.-46.1.el7_7 updates 1.4 M
  30. Installing for dependencies:
  31. libzip x86_64 0.10.-.el7 base k
  32. php-cli x86_64 5.4.-46.1.el7_7 updates 2.7 M
  33. php-common x86_64 5.4.-46.1.el7_7 updates k
  34.  
  35. Transaction Summary
  36. =============================================================================================================================================
  37. Install Package (+ Dependent packages)
  38.  
  39. Total download size: 4.7 M
  40. Installed size: M
  41. Downloading packages:
  42. (/): libzip-0.10.-.el7.x86_64.rpm | kB ::
  43. (/): php-common-5.4.-46.1.el7_7.x86_64.rpm | kB ::
  44. (/): php-cli-5.4.-46.1.el7_7.x86_64.rpm | 2.7 MB ::
  45. (/): php-5.4.-46.1.el7_7.x86_64.rpm | 1.4 MB ::
  46. ---------------------------------------------------------------------------------------------------------------------------------------------
  47. Total 6.0 MB/s | 4.7 MB ::
  48. Running transaction check
  49. Running transaction test
  50. Transaction test succeeded
  51. Running transaction
  52. Installing : libzip-0.10.-.el7.x86_64 /
  53. Installing : php-common-5.4.-46.1.el7_7.x86_64 /
  54. Installing : php-cli-5.4.-46.1.el7_7.x86_64 /
  55. Installing : php-5.4.-46.1.el7_7.x86_64 /
  56. Verifying : php-common-5.4.-46.1.el7_7.x86_64 /
  57. Verifying : php-cli-5.4.-46.1.el7_7.x86_64 /
  58. Verifying : libzip-0.10.-.el7.x86_64 /
  59. Verifying : php-5.4.-46.1.el7_7.x86_64 /
  60.  
  61. Installed:
  62. php.x86_64 :5.4.-46.1.el7_7
  63.  
  64. Dependency Installed:
  65. libzip.x86_64 :0.10.-.el7 php-cli.x86_64 :5.4.-46.1.el7_7 php-common.x86_64 :5.4.-46.1.el7_7
  66.  
  67. Complete!
  68. [root@node107.yizhengjie.org.cn ~]#

[root@node107.yizhengjie.org.cn ~]# yum -y install php

  1. [root@node107.yizhengjie.org.cn ~]# cat /var/www/html/phpinfo.php      #编写php测试代码
  2. <?php
  3. phpinfo();
  4. ?>
  5. [root@node107.yizhengjie.org.cn ~]#
  6. [root@node107.yizhengjie.org.cn ~]# httpd -t
  7. Syntax OK
  8. [root@node107.yizhengjie.org.cn ~]#
  9. [root@node107.yizhengjie.org.cn ~]# systemctl restart httpd          #重启服务后若能看到如下图所示的界面说明PHP是安装成功的
  10. [root@node107.yizhengjie.org.cn ~]#

  1. [root@node107.yizhengjie.org.cn ~]# cat /var/www/html/setcookie.php          #创建cookie信息,当我们在浏览器访问时可以看到我们定义的2个cookie信息,如下图所示。
  2. <?php
  3. setcookie('department','IT');
  4. setcookie('user','Jason',time()+);
  5. ?>
  6. [root@node107.yizhengjie.org.cn ~]#

  1.   如上图所示我们在访问浏览器时的确是可以看到两个cookie信息的,一个是departmentcookie,它是临时性的cookie,当浏览器关闭后就自动消失啦。另一个是usercookie,它也是一个时效性的cookie,我们在代码中定义了他的有效时间是3600秒,即1小时。
  2.  
  3.   综上所述,我们关闭操作系统的所有浏览器后,department对应的cookie也会随之消失,而只有user对应的cookie会保存一小时,于是我们打开Google浏览器,验证这一结论,如下图所示,的确只能看到user对应的cookie啦。

6>.cookie的缺点

  1.   Cookie一般明文传输(Secure是加密传输),安全性极差,不要传输敏感数据
  2.  
  3.   4kB大小限制
  4.  
  5.   每次请求中都会发送Cookie,增加了流量。

八.session

  1.   WEB服务器端,尤其是动态网页服务端Server,有时需要知道浏览器方是谁?但是HTTP是无状态的,怎么办?

  2.   服务端会为每一次浏览器端第一次访问生成一个SessionID,用来唯一标识该浏览器,通过Set-Cookie发送到浏览器端。
  3.  
  4.   浏览器端收到之后并不永久保持这个Cookie,只是会话级的。浏览器访问服务端时,会使用Cookie,也会带上这个SessionIDCookie值。
  5.   服务端会维持这个SessionID一段时间,如果超时,会清理这些超时没有人访问的SessionID。如果浏览器端发来的SessionID无法在服务端找到,就会自动再次分配新的SessionID,并通过Set-Cookie发送到浏览器端以覆盖原有的存在浏览器中的会话级的SessionID

  6.   推荐图书《HTTP权威指南》

Httpd服务进阶知识-HTTP协议详解的更多相关文章

  1. Httpd服务进阶知识-LAMP源码编译安装

    Httpd服务进阶知识-LAMP源码编译安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家都知道,动态资源交给fastcgi程序处理,静态资源依旧由httpd服务器处理  ...

  2. Httpd服务进阶知识-基于FASTCGI实现的LAMP架构

    Httpd服务进阶知识-基于FASTCGI实现的LAMP架构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.httpd+php结合的方式 module: php fastcgi ...

  3. Httpd服务进阶知识-基于Apache Modele的LAMP架构之PhpMyAdmin案例

    Httpd服务进阶知识-基于Apache Modele的LAMP架构之PhpMyAdmin案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见LAMP应用 PhpMyAdm ...

  4. Httpd服务进阶知识-LAMP架构概述

    Httpd服务进阶知识-LAMP架构概述  作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.LAMP架构概述 1>.什么是LAM(M)P架构 L: linux A: apa ...

  5. Httpd服务进阶知识-基于Apache Modele的LAMP架构之Discuz!案例

    Httpd服务进阶知识-基于Apache Modele的LAMP架构之Discuz!论坛案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装依赖包及数据库  博主推荐阅读: ...

  6. Httpd服务进阶知识-基于Apache Modele的LAMP架构之WordPress案例

    Httpd服务进阶知识-基于Apache Modele的LAMP架构之WordPress案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装依赖包及数据库授权 博主推荐阅读 ...

  7. Httpd服务进阶知识-调用操作系统的Sendfile机制

    Httpd服务进阶知识-调用操作系统的Sendfile机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.不用 sendfile 的传统网络传输过程 read(file, tm ...

  8. Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇

    Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Internet与中国 Internet最早来源于美 ...

  9. 高效开发之SASS篇 灵异留白事件——图片下方无故留白 你会用::before、::after吗 link 与 @import之对比 学习前端前必知的——HTTP协议详解 深入了解——CSS3新增属性 菜鸟进阶——grunt $(#form :input)与$(#form input)的区别

    高效开发之SASS篇   作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~ 他是谁? 作为前端开发人员,你肯定对css很熟悉,但是你知道css可以自定义吗?大家 ...

随机推荐

  1. C++ 重写虚函数的代码使用注意点+全部知识点+全部例子实现

    h-------------------------- #ifndef VIRTUALFUNCTION_H #define VIRTUALFUNCTION_H /* * 派生类中覆盖虚函数的使用知识点 ...

  2. pytorch seq2seq模型示例

    以下代码可以让你更加熟悉seq2seq模型机制 """ test """ import numpy as np import torch i ...

  3. OpenCV+TensorFlow图片手写数字识别(附源码)

    初次接触TensorFlow,而手写数字训练识别是其最基本的入门教程,网上关于训练的教程很多,但是模型的测试大多都是官方提供的一些素材,能不能自己随便写一串数字让机器识别出来呢?纸上得来终觉浅,带着这 ...

  4. python 统计字符串中指定字符出现次数的方法

    python 统计字符串中指定字符出现次数的方法: strs = "They look good and stick good!" count_set = ['look','goo ...

  5. Git命令之tag差异比较

    比较两个tag的区别有以下几种方式: 例如两个tag分别为v1.0. v2.0 1. git log v2.0 ^v1.0 查看v2.0上有,而v1.0上没有的部分: 2. git log v1.0. ...

  6. How to let your website login with domain account when using IIS to deploy it?

    如何让你的网站以域账号登录 Select your website in IIS Manager, open Authentication, enable Windows Authentication ...

  7. 利用TCHART做分离饼形图

    https://www.cnblogs.com/gaodu2003/archive/2009/06/18/1505720.html unit Unit1; interface ……type  TFor ...

  8. Android -- SEGV_MAPERR,SEGV_ACCERR

    Per siginfo.h: SEGV_MAPERR means you tried to access an address that doesn’t map to anything. SEGV_A ...

  9. FusionInsight大数据开发---Flume应用开发

    Flume应用开发 要求: 了解Flume应用开发适用场景 掌握Flume应用开发 Flume应用场景Flume的核心是把数据从数据源收集过来,在送到目的地.为了保证输送一定成功,发送到目的地之前,会 ...

  10. - 集合 遍历 foreach Iterator 并发修改 ConcurrentModificationException MD

    目录 目录 为什么不能在 foreach 循环里进行元素的 remove/add 操作 背景 foreach 循环 问题重现 fail-fast remove/add 做了什么 正确姿势 直接使用普通 ...