深入理解Http协议

作者: maskwang520 | 来源:发表于2018-05-09 21:35 被阅读362次
    1. HTTP概述

    HTTP是一种允许获取资源的协议,例如HTML文档。 它是Web上的任何数据交换和客户端 - 服务器协议的基础,这意味着请求由接收者(通常是Web浏览器)发起。 一个完整的文档是根据不同的子文档重新获得的,例如文本,布局描述,图像,视频,脚本等等。
    通常我们通过http协议获取如下的内容.


    image.png

    客户和服务器通过交换单个消息进行通信(而不是数据流)。 客户端发送的消息(通常是Web浏览器)称为请求,服务器发送的消息作为答复称为响应。整个协议层次图如下.


    image.png
    2. 基于HTTP协议的系统的组件

    HTTP是一种客户端 - 服务器协议:请求由一个实体,用户代理(或代表它的代理)发送。 大多数情况下,用户代理是一个Web浏览器,但它可以是任何东西,例如抓取Web以填充和维护搜索引擎索引的机器人。


    image.png
    • Client: the user-agent
      用户代理是代表用户行事的任何工具。 这个角色主要由Web浏览器执行; 一些例外情况是工程师使用的程序和Web开发人员调试其应用程序。一般来说,浏览器始终是请求的开始.
    • Proxies
      在Web浏览器和服务器之间,许多计算机和机器都会转发HTTP消息。 由于Web堆栈的分层结构,其中大多数可以在传输层,网络层或物理层进行操作,在HTTP层变得透明,并可能对性能产生重大影响。 那些在应用层操作的通常称为代理。 这些可以是透明的,也可以不是(改变请求不通过它们),并且可以执行许多功能:
      (1) 缓存(缓存可以是公共或私人的,如浏览器缓存)
      (2) 过滤(如防病毒扫描,家长控制......)
      (3) 负载平衡(允许多个服务器为不同的请求提供服务)
      (4) 认证(控制对不同资源的访问)
      (5) 日志记录(允许存储历史信息)
    • Web server
      在通信通道的另一侧,是服务器,它按照客户的要求提供文档。 一台服务器虚拟出现的只是一台机器:这是因为它可能实际上是一组服务器,共享负载(负载平衡)或一个复杂的软件,询问其他计算机(如缓存,数据库服务器,电子商务服务器 ,...),完全或部分按需生成文档。
    3. HTTP协议的基本特性
    • HTTP协议是简单的
      HTTP通常被设计为简单且可读的,HTTP消息可以被人阅读和理解,提供更简单的开发人员测试,并降低新手的复杂度。
    • HTTP是可拓展的
      在HTTP / 1.0中引入HTTP头使得该协议易于扩展和实验。 新功能甚至可以通过客户端和服务器之间关于新头的语义的简单协议来引入。
    • HTTP是无状态的,但不是无会话的
      HTTP是无状态的:两个请求之间没有连续的连接。 这对于尝试连贯地与某些页面进行交互的用户(例如,使用电子商务购物篮)来说可能会产生问题。 但HTTP本身的核心是无状态的,HTTP cookie允许使用有状态会话。 使用头可扩展性,HTTP Cookies被添加到工作流中,允许在每个HTTP请求上创建会话以共享相同的上下文或相同的状态。
    • HTTP 和连接
      连接在传输层进行控制,因此基本上超出了HTTP的范围。 虽然HTTP不需要基础传输协议是基于连接的; 只要求它是可靠的,或不会丢失消息(至少不出现错误)。 在互联网上最常见的两种传输协议中,TCP是可靠的,而UDP不是。 HTTP随后依赖基于连接的TCP标准,即使不总是需要连接。
      HTTP / 1.0为每个请求/响应交换打开了一个TCP连接,这有了两个主要缺陷:打开一个连接需要几次往返消息,因此速度较慢,但在发送多条消息时变得更高效,并定期发送:热连接 比冷的更有效率。
      为了减轻这些缺陷,HTTP / 1.1引入了Pipeline(难以实现)和持久连接:底层TCP连接可以使用Connection头部分控制(connection:keep-alive)。 HTTP / 2更进一步,通过在单个连接上复用消息(多路复用),使得更高效。
    4. HTTP可控的特性
    • Cache
      如何缓存文档可以通过HTTP进行控制。 服务器可以指示代理和客户端,缓存的内容和时间。 客户端可以指示中间缓存代理忽略存储的文档。
    • 放宽源的限制
      为防止窥探和其他隐私入侵,Web浏览器强制严格分开不同的网站。 只有来自同一来源的页面才能访问网页的所有信息。 虽然这样的约束对服务器来说是一种负担,但HTTP头可以放宽服务器端的严格分离,从而使文档成为来自不同域的信息的拼凑体(甚至可能存在与安全相关的原因)。
    • 认证
      某些页面可能受到保护,因此只有特定的用户才能访问它。 基本认证可以由HTTP提供,或者使用WWW-Authenticate和类似的头部,或者通过使用HTTP cookie设置特定的会话。
    • 代理和隧道
      代理服务器和隧道服务器和/或客户端通常位于内联网上并向其他人隐藏其真实IP地址。 HTTP请求然后通过代理来跨越这个网络障碍。 并非所有的代理都是HTTP代理。 例如,SOCKS协议的运行水平较低。 其他的,比如ftp,可以由这些代理来处理。
    • 会话
      使用HTTP cookies可以将请求与服务器的状态关联起来。 尽管基本HTTP是一种无状态协议,但这会创建会话。 这不仅适用于购物车,而且适用于允许用户配置输出的任何站点。
    5. HTTP流动

    当客户想要与服务器通信时,无论是最终服务器还是中间代理,它都会执行以下步骤:

    • 打开TCP连接:TCP连接将用于发送一个或多个请求并接收答案。 客户端可能会打开一个新的连接,重新使用现有的连接,或打开多个到服务器的TCP连接。
    • 发送HTTP消息:HTTP消息(在HTTP / 2之前)是可读的。 对于HTTP / 2,这些简单的消息被封装在frame中,使得它们不可能直接读取,但原理是一样的。


      image.png
    • 读取服务端发来的响应


      image.png
    • 关闭连接或者为下一次重用连接
      如果HTTP pipeline被激活,则可以发送多个请求而无需等待第一个响应被完全接收。 HTTP pipeline已被证明难以在现有网络中实现,在现有网络中,旧版软件与现代版本共存。 HTTP流水线已经在HTTP / 2中被一个帧中更强大的多路复用请求所取代。
    6. HTTP消息

    HTTP / 1.1和更早版本的HTTP消息是人类可读的。 在HTTP / 2中,这些消息被嵌入到一个新的二进制结构,一个框架中,允许优化压缩报头和复用。 即使在这个版本的HTTP中只发送了部分原始HTTP消息,每个消息的语义仍然保持不变,客户端重新构建(虚拟)原始的HTTP / 1.1请求。 因此,理解HTTP / 1.1格式的HTTP / 2消息很有用。

    • 请求消息


      image.png

      (1) 一种HTTP方法,通常是一种动词,如GET,POST或像OPTIONS或HEAD这样的名词,它定义客户想要执行的操作。 通常,客户想要获取资源(使用GET)或张贴HTML表单的值(使用POST),但在其他情况下可能需要更多的操作。
      (2) 要获取的资源的路径; 例如没有协议(http://),域(这里是developer.mozilla.org)或TCP端口(这里是80),从上下文中显而易见的元素中去除资源的URL。
      (3) HTTP协议的版本
      (4) 可选的头部字段为服务器提供更多可用的信息
      (5) 一个可选的请求体,对于一些像POST这样的方法,需要在请求体中添加参数

    • 响应消息


      image.png

      (1) HTTP版本号
      (2) 响应码

    1xx:指示信息--表示请求已接收,继续处理
    2xx:成功--表示请求已被成功接收、理解、接受
    3xx:重定向--要完成请求必须进行更进一步的操作
    4xx:客户端错误--请求有语法错误或请求无法实现
    5xx:服务器端错误--服务器未能实现合法的请求
    (3) 响应消息码所代表的意思
    (4) HTTP头部(与请求消息体一样)
    (5) 可选的由服务器返回的资源

    参考文档:
    https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

    延伸阅读(参考我的两篇文章)
    HTTP/2 新特性总结
    深入理解HTTPS协议

    相关文章

      网友评论

        本文标题:深入理解Http协议

        本文链接:https://www.haomeiwen.com/subject/niporftx.html