美文网首页
HTTP协议

HTTP协议

作者: 浮萍向北 | 来源:发表于2019-11-28 23:51 被阅读0次

HTTP请求报文

HTTP请求报文.jpg

HTTP的报文大概分三大部分。第一部分是请求行,第二部分是请求的首部,第三部分才是请求的正文实体。

  • 请求行

    • 基本语法:Method 空格 Request-URI 空格 HTTP版本 换行。比如:POST /bauhinia/v1/class/purchase/info HTTP/1.1。
    • 方法(常用方法)
      • GET GET 就是去服务器获取一些资料
      • POST 它需要主动告诉服务端一些信息,而非获取。POST 往往是用来创建一个资源的。
      • PUT 它是指定资源位置上传最新内容。PUT 往往是用来修改一个资源的。
      • DELETE 它是用来删除资源。
  • 请求头(request header)

    • 首部字段 。首部是 key value,通过冒号分隔。这里面,往往保存了一些非常重要的字段。
      • Accept-Charset,表示客户端可以接受的字符集。防止传过来的是另外的字符集,从而导致出现乱码。
      • Content-Type,表示正文的格式,例如我们进行POST 的请求,如果正文是JSON 那么我们就应该将这个值设置为JSON。
      • Content-Length ,表示请求体的长度;
      • Cache-control,用来控制缓存的。当客户端发送的请求中包含 max-age 指令时,如果判定缓存层中,资源的缓存时间数值比指定时间的数值小,那么客户端可以接受缓存的资源;当指定 max-age 值为 0,那么缓存层通常需要将请求转发给应用集群。
      • If-Modified-Since 也是一个关于缓存的。也就是说,如果服务器的资源在某个时间之后更新了,那么客户端就应该下载最新的资源;如果没有更新,服务端会返回“304 Not Modified”的响应,那客户端就不用下载了,也会节省带宽。
  • 请求体(body)
    • POST 方法会携带请求体,通过 key=value 的形式把不同的值使用&拼接起来。

HTTP 请求发送

HTTP.jpg

从上图我们看出一个请求从我们电脑里发出请求包括的内容:MAC 头 IP 头 TCP 头 HTTP。

HTTP 协议是基于TCP 协议的,所以它使用的面向连接的方式发送请求,通过 stream 二进制流的方式传给对方。 到了TCP 层 它会把二进制流变成一个的报文段发送给服务器。

在发送给每个报文段的时候,都需要对方回应一个ACK,来保证报文可靠的到达了对方。如果没有回应,那么TCP 这一层会进行重新传输,直到可以到达。同一个包有可能被传了多次,但HTTP 这一层不需要知道这一点,因为是TCP 在这一层埋头苦干。

TCP 层发送一个报文的时候,都需要加上自己的地址(即源地址)和它想要去的地方(即目标地址),将这两个信息放到IP头里面,交给 iP 层进行传输。

IP 层需要查看目标地址和自己是否是在一个局域网。如果是,就发送ARP 协议来请求这个目标地址对应的MAC 地址, 然后将这个源 MAC 和网关 MAC 放入 MAC 头 发送出去。
网关收到包发现MAC 符合,取出目标IP 地址,根据路由协议找到下一跳的路由器,获取下一跳路由器的 MAC 地址, 将包发给下一跳路由器。

这样路由器一跳一跳终于到达目标的局域网。 这个时候 最后一跳的路由器发现目标地址就在自己的某一个出口的局域网上。于是就在这个局域网上发送ARP 获得这个目标地址的MAC 地址,将包发送出去。
目标地址大学MAC 地址符合,就将包收起来; 发现 IP 地址 符合,根据 IP 头中的协议项,知道自己上一层是TCP 协议,于是解析 TCP 的头,里面有序列号,需要看一看这个序列包是不是我要的,如果是就放入缓存中然后返回一个ACK,如果不是就丢弃。

TCP 头里面还有端口号,HTTP 的服务器正在监听这个端口号。于是,目标机器自然知道是HTTP 服务器这个进程想要这个包,于是将包发给HTTP 服务器。HTTP 服务器的进程看到 原来这个请求是要访问一个网页,于是就把这个网页发给客户端。

HTTP 返回报文

HTTP 返回报文.jpg

HTTP 返回头格式和请求头大致一样包括 状态行、请求头、请求体。

  • 状态行(status line)

    • 基本语法:HTTP版本 空格 状态码 空格 原因短语。
    • 状态码(有 5 大类状态码)
      • 1XX :Informational - Request received, continuing process,表示服务端已经接收到请求正在处理中;
      • 2XX :Success - The action was successfully received, understood, and accepted,表示服务端明白了客户端要干什么,也可以做出正确的响应;
      • 3XX: Redirection - Further action must be taken in order to complete the request,重定向,我处理不了你的请求,我需要把它交给其它小伙伴处理;
      • 4XX :Client Error - The request contains bad syntax or cannot be fulfilled,客户端错误,服务端理解不了请求对象,要么是地址写错了,要么是不符合规则;
      • 5XX :Server Error - The server failed to fulfill an apparently valid request,服务端错误,这个时候你可以找服务端小伙伴说:“你的服务挂了”。
  • 响应头(response header)

    • 这部分和请求头一样 。首部是 key value,通过冒号分隔。
      • Retry-After ,告诉客户端应该在多长时间以后再次尝试一下。“503 错误”是说“服务暂时不再和这个值配合使用”。
  • 响应体(body)

    • 主要通过这些数据来做一些业务处理。

HTTP 2.0

随着HTTP 协议不断的,在HTTP1.1基础上便有了HTTP 2.0。

HTTP 1.1 在应用层以纯文本的形式进行通信。每次通信都要带完整的 HTTP 的头,而且不考虑 pipeline(管线化)模式的话,每次过程总是像上面描述的那样一来一回 在实时性、并发性都存在问题。

为了解决这些问题,HTTP 2.0 会对 HTTP 的头进行一定的压缩,将原来每次都要携带的大量 key value 在两端建立一个索引表,对相同的头只发送索引表中的索引。

另外,HTTP 2.0 协议将一个 TCP 的连接中,切分成多个流,每个流都有自己的 ID,而且流可以是客户端发往服务端,也可以是服务端发往客户端。它其实只是一个虚拟的通道。流是有优先级的。

HTTP 2.0 还将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码。常见的帧有 Header 帧,用于传输 Header 内容,并且会开启一个新的流。再就是 Data 帧,用来传输正文实体。多个 Data 帧属于同一个流。

通过这两种机制,HTTP 2.0 的客户端可以将多个请求分到不同的流中,然后将请求内容拆成帧,进行二进制传输。这些帧可以打散乱序发送, 然后根据每个帧首部的流标识符重新组装,并且可以根据优先级,决定优先处理哪个流的数据。

HTTP 1.1 是串行的。 HTTP 2.0 是并行的。

来自趣谈网络协议 https://time.geekbang.org/column/intro/85

相关文章

网友评论

      本文标题:HTTP协议

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