趣谈网络9讲 | HTTP协议

前两节讲述完传输层的协议,这一节学习应用层的协议。HTTP 协议是我们最常用的协议。在学习 HTTP 协议之前,先了解一下 URL(统一资源定位符):www.wangxingyin.cn 。这个就是一个 URL,表示在互联网上的位置。

请求准备

在浏览器中输入 www.wangxingyin.cn 以后,按下回车,浏览器会将这个域名发送给 DNS 服务器,通过 DNS 服务器解析得到 IP 地址。由于 HTTP 是基于 TCP 协议的,所以接下来是通过三次握手建立 TCP 连接,为了可以在多次请求中复用 TCP 的连接,在HTTP1.1 协议中默认开启 Keep-Alive。连接完毕以后,就可以开始发送请求了,

HTTP 请求的构建

请求的格式如下:

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

第一部分:请求行

在请求行中,URL 就是 www.wangxingyin.cn ,版本为 HTTP1.1 。请求行的方法中一般使用下面几个方法

  • GET 方法
    GET 就是去获取服务器的一些资源。对于访问网页来讲,要获取的资源往往是一个页面。
  • POST 方法
    需要告诉服务端一些信息,而非获取
  • PUST 方法
    向指定资源位置上传最新内容
  • DELETE 方法
    用来删除资源的

第二部分:首部字段

请求行下面就是首部字段,首部存放的形式是 key value,通过冒号分割。下面给出一些常见的字段

  • Accept-Charset
    表示客户端可以接受的字符集
  • Content-Type
    正文的格式
  • Cache-Control
    用来控制缓存,客户端发送的请求包含 max-age指令,如果判定在缓存层,资源的缓存时间比指定时间小,则客户端可以接受资源层的资源;当指定的 max-age 为 0 时,那么缓存层通常需要将请求转发给应用集群。
  • If-Modified-Since
    这个也是关于缓存的,如果服务器的资源在某个时间更新了,那么客户端应该下载最新的资源;如果没有更新,服务端会返回 “304 Not Modified”的响应,客户端就不用下载了。

HTTP 请求发送

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

HTTP 返回的构建

请求发送到服务器以后,服务器会返回一个 HTTP 的返回报文。返回报文的格式(基于HTTP1.1)如下:

状态码会反应 HTTP 请求的结果。下面是是一些常见的状态码

HTTP状态码

HTTP 2.0

HTTP 2.0 是 HTTP 1.1 的升级,HTTP 1.1 在应用层是以纯文本的形式进行通信,每次通信都要带完整的 HTTP 头,这样在实时性、并发性都存在问题。为了解决这些问题,HTTP 2.0 做出了如下的升级:

  • HTTP 2.0 对 HTTP 的头进行了压缩,将原来每次都要携带的大量 key value 在两端建立一个索引,对相同的头只发送索引表中的索引
  • HTTP 2.0 协议将一个 TCP 连接,切分成多个流,每个流都有自己的 ID
  • HTTP 2.0 将所有的传输信息分割成更小的消息和帧,并对它们采用二进制传输。这些帧可以乱序发送

HTTP 2.0 成功解决了 HTTP 1.1 的队首阻塞问题;减少了 TCP 连接次数对服务器性能的影响。

QUIC 协议

HTTP 2.0 虽然增加了并发性,但还是有问题的。因为 HTTP 2.0 也是基于 TCP 协议的,TCP 协议在处理包时是有严格顺序的。

Google 的 QUIC 协议从 TCP 切换到 UDP,下面列出 QUIC 协议的一些特性

  • 自定义连接机制
    QUIC 协议连接机制是以一个 64 位的随机数作为 ID 来标识,由于 UDP 是无连接的,所以当 IP 或者端口变化的时候,只要 ID 不变,就不需要重新建立连接。
  • 自定义重传机制
    QUIC 发包的时候有个序列号,且是递增的。通过在发送的包里面加一个 offset(数据流的偏移量)来确认包发送到什么地方、最后按照 offset 拼接成一个数据流。
  • 无阻塞的多路复用
    使用上面两个机制,可以实现同一条 QUIC 连接上可以创建多个 stream,来发送多个 HTTP 请求
  • 自定义流量控制
    QUIC 的流量控制通过 window_update 告诉客户端可以接受的字节数。QUIC 的 ACK 是基于 offset 的,窗口的起始位置为当前收到的最大 offset,从这个 offset 到当前的 stream 所能容纳的最大缓存,就是真正的窗口大小。

总结

了解了 HTTP 协议的格式,以及 HTTP 的请求过程,后面有学习了 HTTP 2.0,以及它的竞争对手 QUIC 协议。

说点什么

avatar
  Subscribe  
提醒

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部