web service之http协议基础原理

互联网上被当做请求对象的内容,通常称为web资源(web resource)。
web资源是web内容的主要组成部分,最简单的资源就是一个超文本文档(html),还可以是一个纯文本文件,一般都是静态的超文本文件。但是基于MIME机制以后,那些本身不会发生变化的所有文件,也可以称为静态文件。
web资源:
  静态文件:.jpg,.gif,.html,.txt,.js,.css,.mp3,.avi   动态文件:.php,.jsp
MIME:multipurpose internet mail extension
  早期为了smtp协议设计的,邮件传输时仅能传输文本信息,后来为了发送附件等非文本格式的数据,只能将附件等编码成文本格式传送,对方打开就是一段乱码文本。   MIME机制能够实现将非文本数据编码成文本,对方还能够通过反向操作机制还原回来

web资源是有类型的,像.jpg等都称为媒体,媒体是有类型的

媒体类型(MIME类型):major/minor
    text/html  //文本类型中的超文本文档
    text/plain  //纯文本文档
    image/jpeg
    image/gif

打开一个网页,网页就是一个资源,网页中很可能会通过超链接的方式链接至多个其他资源。

那么,互联网中如何去标记每一个资源,如何能够知道每个资源在什么地方,而且能够引用它?

这就需要靠URL,URL是URI的一个子集。

URI:Uniform Resource Identifier,统一资源标识符,用来标识互联网上每一个可被引用的资源,不光是web资源,任何资源都可以使用URI的格式表示
URI有两种规范:
  URN:Uniform Resource Naming,统一资源命名服务
  URL:Uniform Resource Locator,统一资源定位符,是资源标识符的最常用形式,用来描述某服务器某特定资源的位置
URL的基本语法:
  <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
    scheme:url方案
      比如:http://,https://
    <user>:<password> : 用户名密码
    <host>:<port> : 服务器地址 
    <path>: 资源路径
    <params>: 参数
      比如:http://www.ckh.com/bbs/hello;gender=f
    <query>:查询条件
      比如:http://www.ckh.com/bbs/item.php?username=tom&title=ab
    <frag>: 片段
      # ....

http:hyper text transfer protocol,超文本传输协议

http协议是一个应用层协议,它监听在80/tcp,所以它使用流式数据协议来完成数据交换,http协议的主要目的是实现跨主机发送文档。

http协议版本:
  HTTP/0.9:第一个被广泛采用的版本,称为原型版本,这个协议有很多严重的设计缺陷,仅能够实现简单的资源交互,不支持多媒体内容 
  HTTP/1.0:第一个真正被广泛使用的版本,引入了MIME机制
  HTTP/1.1:增强了缓存功能
  spdy:谷歌研发的协议,为了加速http协议的资源获取性能而专门设计的
  HTTP/2.0:参考spdy协议的优势,引入整合以后的版本,谷歌现在也放弃spdy的支持,转而支持HTTP/2.0

httpd协议是无状态的(stateless), 服务器无法持续追踪访问者来源, 但可以基于cookie、session机制来追踪客户端的行为 

cookie:当用户第一次访问站点时,服务器会发送一个随机数据,这个随机数据是唯一的,对当前服务器来说,可以唯一的标识客户端的身份信息。
    发送完以后,客户端浏览器进程接收下来,会将其保存在本地磁盘的某一段存储空间中,保存的信息就叫cookie.     每一个cookie还有其作用范围,访问A服务器A服务器发送的cookie,访问B服务器有B服务器发送的cookie。     为了让服务器能够识别客户端,客户端再第二次及以后访问同一个站点时,会把适用于这个站点的cookie信息提交给服务器端,服务器端就能追踪识别客户端了。     cookie是有风险的,所以对于敏感数据,浏览器关闭时,会自动清除cookie信息

session:服务器为每一个客户端浏览器进程专门维护了一个微小数据结构,它记录了用户在当前服务器上的访问行为。
     session是关联至某个cookie上的,所以服务器端用一个内存空间,保存了此前用户浏览网站时的操作行为。用户第一次访问时,会发一个cookie给服务器,
     服务器会在用户第二次访问时,根据cookie中的标识查找关联至本地某个session上,从而知道当前用户做了什么操作。

http事务:一次请求和一次响应的过程

请求:request
响应:response
请求是由请求报文来进行,响应是由响应报文来构建的响应进行。
请求报文有其特定格式,响应报文也有其特定格式。
报文语法格式:
request报文:
<method> <request-URL> <version>
<headers>
换行两次
<entity-body>
response报文:
<version> <status> <reason-phrase>
<headers>
换行两次  
<entity-body>
method:请求方法,标明客户端希望服务器对资源执行的动作
  GET: 从服务器获取一个资源
  HEAD: 只从服务器获取文档的响应首部
  POST:向服务器发送要处理的数据,请求表单
  PUT: 将请求的主体部分存储在服务器上,上传资源
  DELETE: 请求删除服务器上指定的文档
  TRACE: 追踪请求到达服务器中间经过的代理服务器
  OPTIONS: 请求服务器返回对指定资源支持使用的请求方法
version:http协议的版本
  HTTP/<major>.<minor>
status:status code,状态码
  1XX: 100-101,信息提示
  2XX: 200-206,成功类信息
  3XX:300-305,重定向,提示需进一步提供补充类信息的状态码
  4XX:400-415,客户端错误
  5XX:500-505,服务器端错误
    
常用的状态码:
  200:成功,请求的所有数据通过响应报文的entity-body部分发送,对应的原因短语:OK
  301: 请求的url指向的资源已经被删除;但在响应报文中通过首部location指明了资源现在所处的新位置,永久重定向,原因短语:Moved Permanently
  302:与301相似,但在响应报文中通过location指明了资源现在所处的临时的新位置,将来可能还会回来,原因短语:Found
  304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此状态码通知客户端,not modify
  401:需要输入账号和密码认证方能访问资源:unauthorized
  403: 请求被禁止,forbidden
  404:服务器无法找到客户端请求的资源,not found
  500: 服务器内部错误: internal server error
  502: 代理服务器从后端服务器收到了一条伪响应,bad gateway
reason-phrase:原因短语
  状态码所标记的状态的简要描述
headers:首部,用来标记请求或响应的属性
  每个请求或响应报文可包含任意个首部:每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值
  格式:
    Name: Value
首部分类:
   通用首部
    请求首部
    响应首部
    实体首部
    扩展首部
通用首部:
    Date: 报文的创建时间
    Connection: 连接方式,如keep-alive,close
    Via: 显示报文经过的中间节点
    Cache-control:控制缓存的生效机制
    Pragma:为了兼容http/1.0,有时还会有这个选项,用来控制缓存的
请求首部:
    accept: 通知服务器自己能够接受的媒体类型,也就是MIME类型
    accept-charset: 通知服务器接受的字符集
    accept-encoding: 通知服务器接受哪些种编码格式,如gzip
    accept-language: 通知服务器接受的语言
    client-IP:客户端IP
   Host: 请求的服务器名称和端口号
   Referer: 包含当前正在请求的资源的上一级资源
    User-Agent: 客户端代理
    条件式请求首部
      Expect:期望发什么信息
      If-modify-since: 自从指定的时间之后,请求的资源是否发生修改过
      If-unmodified-since: 自从指定的时间之后,请求的资源是否没有修改过
      If-none-match: 本地缓存中存储的文档的etag标签是否与服务器端的文档的etag不匹配
      If-match:本地缓存中存储的文档的扩展标签etag是否与服务器端的文档的etag匹配
  安全请求首部:
     authorization: 向服务器发送认证信息,如账号和密码
     cookie: 客户端向服务器端发送cookie
     cookie2:cookie的第二个版本
  代理请求首部:
     proxy-authorization:向代理服务器认证
响应首部:
  信息性首部:
    Age: 响应持续时长
    Server:服务器程序软件名称和版本
  协商首部:某资源有多种表示方法时使用
    Accept-ranges: 服务器可接受的请求范围类型
    Vary: 服务器查看的其他首部列表
  安全响应首部
     Set-cookie: 向客户端设置cookie
      Set-cookie2:向客户端设置第二版的cookie信息
     WWW-Authenticate: 来自服务器对客户端的认证质询表单
实体首部:
  Allow: 列出对此实体可使用的请求方法
  Location: 告诉客户端真正的实体位于何处,重定向时使用
  Content-Encoding:内容的编码格式
  Content-Language:内容的语言
  Content-Length: 主体的长度
  Content-Location: 实体真正所处位置
  Content-Type: 主体的对象类型
  缓存相关
    ETag: 实体的扩展标签
    Expires: 实体的过期时间
    Last-Modified: 最后一次修改的时间
entity-body:实体部分,请求时附加的数据或响应时附加的数据
一次完整的http请求过程:
  1.建立或处理连接(客户端请求到达时,由于http协议是基于tcp进行连接的,所以二者之间要事先建立一个能够完成数据通信的连接,也就是接收请求或不期望接收客户端请求就关闭连接)
  2.接收请求(从网络中读取到的客户端发送的http请求报文是什么)
   接收来自于网络的请求报文中对某资源的一次请求的过程

   并发访问响应模型(Web I/O)
     单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
     多进程I/O结构:并行启动多个进程,每个进程响应一个请求
     复用I/O结构:一个进程响应N个请求
       多线程模型:一个进程生成N个线程,每个线程响应一个用户请求
       事件驱动:event-driven
     复用的多进程I/O结构:启动多个(m)进程,每个进程响应N个请求
     
  3.处理请求(对请求报文进行解析,了解客户端请求的是什么资源,主要是看客户端基于什么方法请求哪个资源)
     一般是根据请求报文的首部来判定请求资源
     请求报文当中首行通常是由特定格式组成:
     请求报文中有很多元数据:请求报文首部
       比如:<method><URL><VERSION>
          Host:www.ckh.com  //请求的主机名称
          Connection:  //这次连接用什么方式
  
  4.访问资源(获取请求报文请求的资源,资源一般都是在硬盘上存放)
   web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot
     比如:/var/www/html/imgages/1.jpg,那么URL中请求资源:http://www.ckh.com/images/1.jpg
   web服务器资源路径映射方式:
     a.通过docroot定义,直接进行映射
     b.路径别名映射
     c.虚拟主机docroot映射
     d.用户家目录的docroot映射  

  5.构建响应报文(访问到的资源拿来以后,打包封装成http的响应报文)
   根据资源类型构建响应报文
   MIME类型:
     显示分类:直接在服务器上定义好资源的类型是什么
     魔法分类:有些服务器能够自行扫描资源内容并判定类型
     协商分类:服务器端和客户端协商一下哪种类型
   URL重定向:
     web服务构建的响应并非客户端请求的资源,而是资源另一个访问路径
      
  6.发送响应报文
  7.记录日志
http服务器程序:
  常见的有:httpd(apache)
       nginx
       lighttpd
  应用程序服务器:上面三种只能解析静态内容,应用程序服务器即能解析静态内容,又能解析动态内容
    IIS
    tomcat,jetty,jboss,resin
    webshpere,weblogic,oc4j
  应用程序服务器占据的市场份额查看:www.netcraft.com

 协议查看或分析的工具:

tcpdump, tshark, wireshark
原文地址:https://www.cnblogs.com/ckh2014/p/14226419.html