Loading... <p style="text-indent: 2em"><strong>前言</strong></p> <p style="text-indent: 2em">随着互联网的迅猛发展和网络的普及,各类网站层出不穷,网站也成为企业宣传和实力展现的主要途径之一,说到网站就不得不说一下web服务了,现在比较流行的web服务还是当属Apache即httpd。本文将详解http协议及httpd的特性。</p> <p style="text-indent: 2em"><strong>http协议详解</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><strong>http协议</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">http: Hyper Text Transfer Protocol 超文本传输协议</p> <p style="text-indent: 2em">传输文本:HTML</p> <p style="text-indent: 2em">html: Hyper Text Mark Language 超文本标记语言</p> <p style="text-indent: 2em">html文档的生成方式</p> <p style="text-indent: 2em">静态:纯html格式文档</p> <p style="text-indent: 2em">动态:编程语言编写的程序可输出html格式的结果</p> <p style="text-indent: 2em">http协议版本</p> </p> <p style="text-indent: 2em">http 0.9: 仅用于传输html文档</p> <p style="text-indent: 2em">http 1.0:引入MIME机制,从而支持多媒体数据;引入keep-alive(持久连接);缓存</p> <p style="text-indent: 2em">http 1.1:更多请求方法,更精细缓存控制;持久连接(persistent)</p> <p style="text-indent: 2em">注意:http协议是无状态的</p> <p style="text-indent: 2em">http事务:一次请求及对应的响应</p> <p style="text-indent: 2em">CGI:Common Gateway Interface 通用网关接口</p> <p style="text-indent: 2em"><strong>http协议报文</strong></p> <p style="text-indent: 2em">请求报文<strong><br style="text-indent: 2em" /></strong></p> </p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160024-75.jpg" title="1428842535822559.jpg" alt="1.jpg" /></p> <p style="text-indent: 2em">报文详解<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">请求报文主要由请求行、请求头部和请求数据(实体)组成</p> <p style="text-indent: 2em">①请求行</p> <p style="text-indent: 2em">请求行由请求方法字段、请求资源字段(URL)和协议版本字段组成</p> <p style="text-indent: 2em">http方法:</p> <pre class="brush:bash;toolbar:false">GET:请求获取一个资源,需要服务器发送 HEAD:跟GET近似,但其不需要服务响应请求的资源,而返回响应首部 POST:基于HTML表单向服务器提交数据,服务器通常需要存储此数据(位置:通常为关系型数据库) PUT:与GET相反,向服务器发送资源;服务器通常需要存储此资源(位置:通常为文件系统) DELETE:删除URL指向的资源 OPTIONS:探测服务器端对请求的URL所支持使用的请求方法 TRACE:跟一次请求中间所经过的代理服务器、防火墙或网关等 #注意:方法严格区分大小写</pre> <p style="text-indent: 2em">资源名称:URI (Uniform Resource Idnentifier)<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">URL :描述一个特定服务器上某资源的特定位置<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">可以是相对路径,也可以绝对路径 例如:http://www.scholar.com/download/index.html 分为三部分: scheme(方案):http:// 服务器:www.scholar.com 特定服务器上的资源:/download/index.html</pre> <p style="text-indent: 2em">协议版本:例如HTTP/1.0, HTTP/1.1</p> <p style="text-indent: 2em">②请求头部</p> <p style="text-indent: 2em">http协议首部:</p> <p style="text-indent: 2em">通用首部</p> <pre class="brush:bash;toolbar:false">Connection: 定义C/S之间关于请求、响应的有关选项 Connection: keep-alive Cache-Control: 缓存控制 Via: 显示了报文经过的中间节点</pre> <p style="text-indent: 2em">请求首部</p> <pre class="brush:bash;toolbar:false">Client-IP:客户端IP Host: 请求的主机 Referer: 指明了请求当前资源原始资源的URL User-Agent: 用户代理 Accept首部: Accept: 指明服务器能发送的媒体类型 Accept-Charset: 支持使用的字符集 Accept-Encoding: 支持使用的编码方式 Accept-Language: 支持使用语言 条件式请求: Expect: 告诉服务器能够发送哪些媒体类型 If-Modified-Since: 是否在指定时间内修改过此资源 If-None-Match:如果提供的实体标记与当前文档的实体标记不符,就获取此文档 跟安全相关请求: Authorization: 客户端提交给服务器的认证数据,如帐号和密码 Cookie: 客户端发送给服务器身份标识</pre> <p style="text-indent: 2em">实体首部</p> <pre class="brush:bash;toolbar:false">Location: 资源的新位置 Allow: 允许对此资源使用的请求方法 内容相关的首部: Content-Encoding: 支持编码 Content-Language:支持语言 Content-Length:文本长度 Content-Location:资源所在位置 Content-Type:主体对象类型 Content-Range:在整个资源中此实体表示的字节范围 缓存相关: ETag: 实体标签 Expires: 过期期限 Last-Modified: 上次修改时间</pre> <p style="text-indent: 2em">③实体</p> <p style="text-indent: 2em">实体内包含客户端请求服务器的数据</p> <p style="text-indent: 2em">响应报文<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160024-22.jpg" title="1428842559638605.jpg" alt="2.jpg" /></p> <p style="text-indent: 2em">报文详解</p> <p style="text-indent: 2em">响应报文主要由状态行、响应头部和响应数据(实体)组成</p> <p style="text-indent: 2em">①状态行<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">状态行由协议版本字段、状态码字段和原因短语字段组成<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">状态码:</p> <pre class="brush:bash;toolbar:false">1XX:信息性状态码 2XX:成功状态码 200:OK,客户端请求成功 201:CREATED,请求已被实现 3XX: 重定向类的状态码 301: Moved Permanently, 永久重定向 302: Found, 临时重定向,会在响应报文中使用“Location: 新位置” 304: Not Modified,条件式请求中使用 4XX:客户端类错误 403:Forbidden,请求被服务器拒绝 404: Not Found,服务器无法找到请求的URL 405: Method Not Allowed,不允许使用此方法请求相应的URL 5XX:服务器类的错误 500:Internal Server Error, 服务器内部错误 502:Bad Gateway, 代理服务器从上游服务器收到一条伪响应 503:Service Unavailable, 服务暂时不可用 505:HTTP Version Not Supported,服务器不支持</pre> <p style="text-indent: 2em">②响应头部<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">响应首部<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">Date:消息产生的时间 Age: 响应持续时间 Server: 向客户端说明自己的程序名称和版本 ETage:不透明验证者 Location:URL备用的位置 Content-Length:实体的长度 Content-Tyep:实体的媒体类型 协商首部: ary: 首部列表,服务器会根据列表中的内容挑一个最适用的版本发送给客户端 Accept-Ranges: 对当前资源来讲,服务器所能够接受的范围类型 跟安全相关: WWW-Authentication:质询,即要求客户提供帐号和密码 Set-Cookie:服务器端在某客户端第一次请求时发送令牌</pre> <p style="text-indent: 2em">③实体</p> <p style="text-indent: 2em">实体内包含客户端请求的数据,根据解析请求报文内的请求数据,将客户端请求的数据打包,通过响应报文发送给客户端,如果请求出现错误,则显示报文内的错误代码及原因。</p> <p style="text-indent: 2em"><strong>资源请求过程及服务器结构</strong></p> <p style="text-indent: 2em">一次Web资源请求的具体过程(服务器的角度):<br style="text-indent: 2em" /></p> </p> <pre class="brush:bash;toolbar:false"> 建立连接 接收请求 处理请求 访问资源 构建响应 发送响应 记录日志</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703160024-9.png" title="1428842578402978.png" alt="3.png" /></p> <p style="text-indent: 2em">web服务器的I/O结构:</p> </p> <p style="text-indent: 2em">单进程模型:串行</p> <p style="text-indent: 2em">多进程模型:每个进程响应一个用户请求实现并发的效果</p> <p style="text-indent: 2em">复用的I/O机制:一个进程生成多个线程,每个线程响应一个用户请求</p> <p style="text-indent: 2em">复用的I/O机制:多个线程,每个线程响应多个用户请求;</p> <p style="text-indent: 2em"><strong>httpd特性详解</strong></p> <p style="text-indent: 2em"><strong>httpd特性</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">高度模块化:core + modules</p> <p style="text-indent: 2em">DSO: Dynamic Shared Object<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">MPM:Multipath Processing Module<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">MPM包含: prefork: 每个进程响应一个用户请求,预先生成多个空闲进程; worker: 启动多个进程,每个进程生成多个线程,每个线程响应一个用户请求; event: 启动多个线程,每个线程响应N个请求;</pre> <p style="text-indent: 2em"><strong>httpd功能特性</strong></p> <p style="text-indent: 2em">丰富用户认证:基本认证和摘要认证</p> <p style="text-indent: 2em">CGI:原生支持perl CGI</p> <p style="text-indent: 2em">虚拟主机:基于端口、IP、主机名</p> <p style="text-indent: 2em">反向代理:负载均衡</p> <p style="text-indent: 2em">用户站点:用户可在家目录创建站点</p> <p style="text-indent: 2em">路径别名:alias</p> <p style="text-indent: 2em">支持第三方模块</p> <p style="text-indent: 2em"><strong>The end</strong></p> <p style="text-indent: 2em">好了,http协议及httpd特性就说到这里了。下文将讲解虚拟主机和基于用户访问控制及SSL实现https等配置,有兴趣可以继续关注呦。以上仅为个人学习整理,如有错漏,大神勿喷~~~</p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信