第十二章 http协议

简介:

12.1 http协议简介

  http(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议。所有的www文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext)。这成为HTTP超文本传输协议标准架构的发展根基。

  超文本就是带有超链接的文本,超链接就是基于一些链接实现文档间跳转的文本。


  http协议是一种无状态的协议(stateless):

  服务器无法持续追踪访问者来源,为了解决此问题引入了cookie和session,实现追踪与保存用户的行为


12.2 http技术架构

  http是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。

  通过使用web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。

  这个客户端被称作用户代理(User Agent)。

  应答的服务器上存储着一些资源,比如HTML文件和图像,这个应答服务器被称作源服务器(Origin Server)。


  在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道。尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和基于它支持的层。事实上,HTTP可在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定其下层协议提供可靠的传输,任何能够提供这种保证的协议都可以被其使用。


  通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器向客户端发回一个状态行,比如“HTTP/1.1 200 OK”和响应的消息,消息的消息团体可能是请求的文件、错误消息或者其它一些信息。HTTP使用TCP而不是UDP的原因在于打开一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据和错误纠正。


  通过HTTP或者HTTPS协议请求的资源由统一资源标示符(Uniform Resource Identifiers)来标识。


12.3 http协议功能

  http协议是用于从www服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分以及哪些部分内容首先显示(如文本先于图形)等。


  http是客户端浏览器或其他程序与web服务器之间的应用层通信协议。在internet上的web服务器上存放的都是超文本信息,客户机需要通过http协议传输所要访问的超文本信息。http包含命令和传输信息,不仅可用于web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。


  我们在浏览器的地址栏里输入的网站地址叫做URL(Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址一样,每个网页也都有一个internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超链接时,URL就确定了林浏览的地址。浏览器通过HTTP将web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。


12.4 http协议版本

  超文本传输协议已经演化出了很多版本,它们中的大部分都是向下兼容的。在RFC 2145中描述了HTTP版本号的用法。客户端在请求的开始告诉服务器它采用的协议版本号,而后者则在响应中采用相同或者更早的协议版本。

  http协议的版本主要有以下这些:

  HTTP/0.9:最原始版本,功能简陋。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,所以客户端无法向服务器传递太多信息。

  HTTP/1.0:这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。支持MIME。

  HTTP/1.1:增加了缓存功能,引入了长连接(默认采用),能很好的配合代理服务器工作 ,支持以管理方式同时发送多个请求,以便降低线路负载,提高传输速度。

  HTTP/2.0:大幅度提升了web性能,减少网络延迟,通常用于https


  HTTP/1.1相较于 HTTP/1.0 协议的区别主要体现在:

  a) 缓存处理

  b) 带宽优化及网络连接的使用

  c) 错误通知的管理

  d) 消息在网络中的发送

  e) 互联网地址的维护

  f) 安全性及完整性


12.5 名词解释

  HTML:HyperText Mark Language,超文本标记语言


  URI:Uniform Resource Indentifier,统一资源标识符。用于定义全局范围内(包括但不仅限于互联网)去标记唯一的、定位一种资源访问路径的方式,或者命名方式,被称作统一资源标识符。这里的统一指的是路径格式上的统一。


  URL:Uniform Resource Location,统一资源定位符,是URI的一个子集,用于描述在互联网上互联网资源的统一表示格式(protocol://host:port/path/to/file)

  URL基本语法:

1
<scheme>: // <user>:<password>@<host>:<port>/<path>;<params>?<query> #<frag>

    params:参数,如http://www.idfsoft.com/bbs/index.html;gender=f,这里的gender=f就是一个参数

    query:传递给关系型数据库页面的特定行为。如http://www.idfsoft.com/bbs/item.php?username=tom&title=abc,这个URL表示要查询的是username=name并且title=abc的条目

    frag:用来定义一个较大页面中的某一个位置,而不是页面的开始处。说白点就是位置锚定


  URN:Uniform Resource Naming,统一资源命名符,也是URI的一个子集


  MIME:Multipurpose Internet Mail Extension,多用途互联网邮件扩展。

  MIME可以将非文本数据在传输前重新编码为文本格式再传输给对方,接收方能够用相反的方式将其重新还原为原来的格式,还能够调用相应的程序来打开此文件


  http事务:http协议的一次请求(request)和响应(response)的过程就称之为http事务


  动态网页:包含静态内容和动态内容(动态内容需要执行) 

  服务器端存储的不是HTML文档,而是编程语言开发的脚本,脚本接受参数之后在服务器端运行一次,运行完成之后会生成HTML格式的文档,并把生成好的HTML文档传给客户端


  Web资源:web resource。

    静态文件:.jpg,.gif,.html,.txt,.js,.css,.mp3,.avi

    动态文件:.php,.jsp


  PV:Page View,打开了多少页面

  UV:User View,独立IP量


12.6 http协议报文

  http协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。


  http协议的报文有请求报文和响应报文2种,其语法样式如下:

    请求报文语法:

1
2
3
4
<method> <request-URL> <version>
<headers>
 
<entity-body>

    响应报文语法:

1
2
3
4
<version> <status> <reason-phrass>
<headers>
 
<entity-body>

  报文的第一行通常称作报文“起始行(start line)”,后面的标签格式的内容称作首部域(Header Field),每个首部域由名称(name)和值(value)组成,中间用逗号分隔。

  另外,响应报文通常还有一个称作Body的信息主体,即响应给客户端的内容。


  method:请求方法,标明客户端希望服务器对资源执行的动作,常见的有以下几种:

    GET:从服务器获取一个资源

    HEAD:只从服务器获取文档的响应首部,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的

    POST:向服务器发送要处理的数据。服务器端通常通过提供一个表单,客户端填入数据时会把内容放入entity-body中提交提交给服务器端

    PUT:将请求的主体部分存储在服务器上。说白点就是上传数据

    DELETE:请求删除服务器上指定的文档

    TRACE:追踪请求到达服务器中间经过的代理服务器

    OPTIONS:请求服务器返回对指定资源支持使用的请求方法

  version:http的协议版本,格式如HTTP/<major>.<minor>

  status:响应状态码,用于标记请求处理过程中发生的情况,常见的响应状态码有以下几种:

    1xx:100-101,纯信息提示

      100:服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求,响应状态码为"Continue"

      101:服务器转换协议,服务器将遵从客户的请求转换到另外一种协议,响应状态码为"Switching Protocols"

    2XX:200-206,“成功”类的信息

      200:请求资源正常。请求的所有数据通过响应报文的entity-body部分发送,响应状态码为“OK”

      201:请求被创建完成,同时新的资源被创建,响应状态码为"Created"

      202:供处理的请求已被接受,但处理未完成,响应状态码为"Accepted"

      203:文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝,响应状态码为"Non-authoritative information"

      204:没有新文档。浏览器应该继续显示原来的文档。响应状态码为"No Content"

      205:没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容,响应状态码为"Reset Content"

      206:客户发送了一个带有Range头的GET请求,服务器完成了它

    3XX:300-305,“重定向”类的信息

      301:永久重定向,响应状态码为“Moved Permanently”

        请求的URL指向的资源已经被删除,但在响应报文中通过首部Location指明了资源现在所处的新位置,客户端需要请求新位置的资源

      302:临时重定向,我这里正忙,你要的资源在另一个地方也有,你先去那里要,响应状态码为“Found”

        与301相似,但在响应报文中通过Location指明资源现在所处的临时新位置

      304:客户端发出了条件式请求,但服务器端发现客户端请求的资源已被客户端缓存过且未发生改变,让客户端直接到缓存里去取。响应状态码为“Not Modified”

    4XX:400-415,“客户端错误”类的信息

      400:由于客户端请求有语法错误,不能被服务器所理解,响应状态码为“Bad Request”

      401:需要输入帐号和密码认证方能访问资源,响应状态码为“Unauthorized”

      403:请求被禁止,响应状态码为“Forbidden”

      404:服务器无法找到客户端请求的资源,响应状态码为“Not Found”

    5XX:500-505,“服务端错误”类的信息

      500:服务器内部错误,响应状态码为“Internal Server Error”

      502:代理服务器从后端服务器收到了一条伪响应,响应状态码为“Bad Gateway”

      503:服务器当前不能够处理客户端的请求,在一段时间之后,响应状态码为“Service”

  reason-phrass:解释status状态码的情况,你成功了,是什么成功了,你失败了,是什么失败了,是获取文件成功/失败还是上传文件成功/失败等等。

  headers:用来标记请求或响应的属性

    每个请求或响应报文可包含任意个首部;

    每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值


    格式:Name: Value


    首部的分类

      通用首部:可用在请求报文和响应报文中,常见的内容如下:

        Date:报文的创建时间

        Connection:连接状态,如keep-alive,close等

        Via:显示报文经过的中间节点

        Cache-Control:控制缓存的生效方法和机制

      请求首部:只能在请求报文中使用,常见的内容如下:

        Accept:通知服务器客户端可以接受的媒体类型

        Accept-Charset:通知服务器客户端可以接受的字符集

        Accept-Encoding:通知服务器客户端可以接受的内容编码格式,如gzip

        Accept-Language:通知服务器客户端可以接受的语言

        Client-IP:客户端的IP

        Host:请求的服务器名称和端口号

        Referer:包含当前正在请求的资源的上一级资源

        User-Agent:客户端代理


        条件式请求首部

          Expect:期望服务器端发什么信息

          If-Modified-Since:自从此处指定的时间之后请求的资源是否发生修改

          If-Unmodified-Since:自从此处指定的时间之后请求的资源是否未发生修改

          If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的ETag不匹配

         If-Match:本地缓存中存储的文档的Etag是否与服务器文档的Etag匹配

        安全请求首部

          Authorization:向服务器发送认证信息,如帐号和密码

          Cookie/Cookie2:客户端向服务器发送cookie

        代理请求首部:

          Proxy-Authorization:向代理服务器认证

      响应首部:只能在响应报文中使用

        信息性:

          Age:响应持续时长

          Server:服务器程序软件名称和版本

        协商首部:某资源有多种表示方法时使用

          Accept-Ranges:服务器可接受的请求范围类型

          Vary:服务器查看的其它首部列表

        安全响应首部:

          Set-Cookie:向客户端设置cookie

          Set-Cookie2:向客户端设置cookie2

          WWW-Authenticate:来自服务器的对客户端的质询认证表单

      实体首部:标识实体的相关信息

        Allow:列出对此实体可使用的请求方法

        Location:告诉客户端真正的实体位于何处

        Content-Encoding:内容的编码格式

        Content-Language:内容使用的语言

        Content-Length:主体的长度

        Content-Location:实体真正所处的位置

        Content-Type:主体的对象类型

        缓存相关:

          ETag:实体的扩展标签

          Expires:实体的过期时间

          Last-Modified:最后一次修改的时间

      扩展首部

  entity-body:请求时附加的数据或响应时附加的数据,有可能为空


  请求报文示例:

1
2
3
GET / HTTP /1 .1
HOST:www.baidu.com
Connection:keep-alive

  

  响应报文示例:

1
2
3
4
5
6
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


12.7 http周边

  常见的协议查看、分析的工具:

    tcpdump

    tshark

    wireshark


  常见的http服务器程序:

    httpd(apache)

    nginx

    lighttpd

    应用程序服务器:可以处理动态文件

      IIS

      tomcat,jetty,jboss,resin

      webshpere,weblogic,oc4j


  常用的http压力测试工具:

    ab:

      语法:ab [options] URL

      -n:总的请求数

      -c:模拟的并发数

      -k:以持久连接模式测试

    webbench

    http_load

    jmeter

    loadrunner

    tcpcopy


  ulimit -n #:调整当前用户所能够同时打开的文件数


 web服务器资源路径映射方式:

    docroot

    alias

    虚拟主机docroot

    用户家目录docroot


  并发访问响应模型(Web I/O):此处假定每个进程内只有一个线程

    单进程I/O结构:启动一个进程处理请求,而且一次只处理一个,多个请求被串行响应

    多进程I/O结构:并行启动多个进程,每个进程响应一个请求

    复用I/O结构:一个进程响应多个请求

      多线程模型:一个进程生成多个线程,每个线程响应一个用户请求

      事件驱动

    复用的多进程I/O结构:启动多个(m)进程,每个进程响应n个请求


12.8 https

  https其实就是将ssl或tls应用于http协议的结果,https监听于tcp/443端口


  ssl会话的简化过程如下:

  (1)客户端发送可供选择的加密方式,并向服务器请求证书

  (2)服务器端发送证书以及选定的加密方式给客户端

  (3)客户端取得证书并进行证书验证

    如果信任给其发证书的CA:

    a) 验证证书来源的合法性:用CA的公钥解密证书上的数字签名

    b) 验证证书内容的合法性:完整性验证

    c) 检查证书的有效期限

    d) 检查证书是否被吊销

    e) 证书中拥有者的名字,与访问的目标主机要一致

  (4)客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换

  (5)服务器用密钥加密用户请求的资源,响应给客户端

  注意:SSL会话是基于IP地址创建,所以单IP的主机上,仅可以使用一个https虚拟主机


  WEB服务器的主要操作:

    建立连接——接受或拒绝客户端连接请求;

    接收请求——通过网络读取HTTP请求报文;

    处理请求——解析请求报文并做出相应的动作;

    访问资源——访问请求报文中相应的资源;

    构建响应——使用正确的首部生成HTTP响应报文;

    发送响应——向客户端发送生成的响应报文;

    记录日志——当已经完成的HTTP事务记录进日志文件










本文转自 忘情OK  51CTO博客,原文链接:http://blog.51cto.com/itchentao/1931364,如需转载请自行联系原作者
目录
相关文章
|
17天前
|
网络协议 Linux iOS开发
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
38 1
|
1月前
|
网络协议 Linux
HTTP协议基本原理简介(二)
HTTP协议基本原理简介(二)
23 1
|
1月前
|
前端开发
webpack如何设置devServer启动项目为https协议
webpack如何设置devServer启动项目为https协议
136 0
|
1月前
|
缓存 前端开发
HTTP协议基本原理简介(三)
HTTP协议基本原理简介(三)
14 1
|
1天前
|
缓存 网络协议
【计算机协议】第一章——HTTP协议详解
【计算机协议】第一章——HTTP协议详解
|
2天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
5天前
|
缓存 安全 网络协议
Http协议是什么
【4月更文挑战第12天】HTTP是用于从WWW服务器传输超文本到浏览器的协议,基于TCP/IP,特点包括无连接、无状态、面向对象、无阻塞和可缓存。它的工作原理是客户端发送请求,服务器处理后返回响应。自1989年创建以来,HTTP已发展支持多媒体内容传输,并通过HTTPS提供安全保护。学习更多可参考计算机网络技术文献。
15 6
|
7天前
|
存储 JSON 前端开发
网络原理(4)HTTP协议(下)
网络原理(4)HTTP协议
20 0
|
17天前
|
XML JSON JavaScript
推荐一个比较好用的c++版本http协议库-cpp-httplib
推荐一个比较好用的c++版本http协议库-cpp-httplib
36 1
|
25天前
|
运维 监控 算法
slb监听协议http
SLB的HTTP监听器用于处理HTTP请求,配置时选择协议类型为HTTP和前端端口(如80)。SLB根据负载算法将请求转发至健康后端服务器,并支持会话保持。通过`X-Forwarded-For`和`X-Forwarded-Proto`头处理请求信息。由于不涉及SSL/TLS,数据传输不安全,推荐升级至HTTPS以加密通信。SLB提供性能监控和故障排查工具,帮助运维管理。
22 5