HTTP/1.x

HTTP/1.x 协议是一个文本协议,可读性非常好,但是并不高效

解析

  • 解析一个完整的 HTTP 请求,首先要正确读出 HTTP header。HTTP header 各个 fields 使用 \r\n 分隔,然后跟 body 之间使用 \r\n\r\n 分隔。解析完 header 之后,才能从 header 里面的 content-length 拿到 body 的 size , 从而读取 body
  • 这套流程其实并不高效,因为我们要读取多次,才能将一个完整的 HTTP 请求给解析出来,虽然在代码上有很多的优化方法:
    • 一次将一大块数据读取到 buffer 里面,避免多次 IO 开销
    • 读取的时候直接匹配 \r\n 的方式流式解析
  • 主要问题在于, HTTP/1.x 协议是一个文本协议,是给人看的,对机器并不友好,二进制才是更好的选择

Request/Response

  • HTTP/1.x 另一个问题就在于它的交互模式,一个连接每次只能一问一答,也就是client 发送了 request 之后,必须等到 response,才能继续发送下一次请求。
  • 这套机制是非常简单,但会造成网络连接利用率不高。如果需要同时进行大量的交互,client 需要跟 server 建立多条连接,但连接的建立也是有开销的,所以为了性能,通常这些连接都是长连接一直保活的,虽然对于 server 来说同时处理百万连接也没啥太大的挑战,但终归效率不高。

Push

  • HTTP/1.x 并没有推送机制。所以通常两种做法:
    • Long polling 方式,也就是直接给 server 挂一个连接,等待一段时间(譬如 1 分钟),如果 server 有返回或者超时,则再次重新 poll。
    • Web-socket,通过 upgrade 机制显式的将这条 HTTP 连接变成裸的 TCP,进行双向交互

你可能感兴趣的:(HTTP/1.x)